+
86
-

回答

通过flask可以实现,具体代码如下:

import os
import sys
import threading
import webbrowser
import time
import requests
from urllib.parse import urljoin, quote
from flask import Flask, request, jsonify, send_from_directory, Response

app = Flask(__name__)

@app.route('/v1/<path:subpath>', methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'OPTIONS'])
def proxy(subpath):
    # 定义目标URL
    target_url = urljoin('https://dashscope.aliyuncs.com/compatible-mode/v1/', quote(subpath)) 
    # 转发请求到目标URL
    headers = {key: value for (key, value) in request.headers if key != 'Host'}  # 移除原始 Host 头
    headers['Host'] = 'dashscope.aliyuncs.com'  # 修改为目标服务器的域名

    try:
        # 转发请求到目标URL
        response = requests.request(
            method=request.method,
            url=target_url,
            headers=headers,  # 使用修改后的 headers
            data=request.get_data(),
            
            allow_redirects=False,
            stream=True,  # 启用流式传输
            timeout=20    # 设置超时时间为10秒
        )

        # 记录请求和响应数据到日志文件
        with open('proxy_log.txt', 'a') as log_file:
            log_file.write(f"Request to: {target_url}\n")
            log_file.write(f"Request method: {request.method}\n")
            log_file.write(f"Request headers: {dict(request.headers)}\n")
            log_file.write(f"Request data: {request.get_data(as_text=True)}\n")  # 记录发送的数据
            log_file.write(f"Response status: {response.status_code}\n")
            log_file.write(f"Response headers: {dict(response.headers)}\n")
            log_file.write("\n")  # 添加空行分隔不同请求的日志

        # 返回目标URL的响应
        return Response(
            response.iter_content(chunk_size=1024),  # 流式输出响应内容
            status=response.status_code,
            headers=response.headers.items()
        )
    except requests.exceptions.RequestException as e:
        # 记录异常到日志文件
        with open('proxy_log.txt', 'a') as log_file:
            log_file.write(f"Error during request to {target_url}: {e}\n")
            log_file.write("\n")
        # 返回错误响应
        return jsonify({"error": str(e)}), 500

if __name__ == '__main__':
    # 启动Flask应用的线程
    app.run(host='0.0.0.0', port=5000)

网友回复

我知道答案,我要回答