使用Python requests库是否可以修改响应体后再回传?
该需求可以实现,根据使用场景不同有两类实现路径:
方案1:仅在当前Python程序的requests请求流程中修改响应
如果你不需要拦截第三方软件的请求,只在自己编写的requests调用逻辑里修改响应,可直接修改requests.Response对象的内置属性:
import requests # 发起原始请求 resp = requests.get("https://example.com") print("原始响应内容:", resp.text) # 修改响应体,注意必须赋值为bytes类型 resp._content = b"自定义修改后的响应内容" # 也可同步修改状态码、响应头等属性 resp.status_code = 200 resp.headers["Custom-Edit-Flag"] = "modified-by-python" # 后续读取响应时返回的都是修改后的内容 print("修改后响应内容:", resp.text)
如果需要对所有requests请求统一修改响应,可使用requests内置的钩子函数:
def response_hook(resp, *args, **kwargs): # 可添加匹配规则,只修改符合条件的请求响应 if "example.com" in resp.url: resp._content = b"钩子统一修改的响应内容" return resp # 发起请求时绑定钩子,也可通过session全局绑定 resp = requests.get("https://example.com", hooks={"response": response_hook})
方案2:实现类似Fiddler/Charles的代理级响应修改功能
如果需要拦截其他软件、浏览器的请求并修改响应,可使用Python开发的开源代理工具mitmproxy,它支持通过Python脚本自定义拦截逻辑,完全覆盖专业代理工具的请求/响应编辑能力。
示例拦截脚本如下:
# 保存为modify_resp.py from mitmproxy import http def response(flow: http.HTTPFlow) -> None: # 匹配要修改的请求地址 if flow.request.pretty_url == "https://example.com/": # 替换响应体 flow.response.content = b"代理拦截修改后的响应内容" # 也可修改请求内容、响应状态码、响应头 flow.response.status_code = 200
使用方式:安装mitmproxy后执行命令mitmproxy -s modify_resp.py,将需要拦截的设备/软件代理设置为127.0.0.1:8080,即可实现代理级的响应修改效果。
内容的提问来源于stack exchange,提问作者Corrupt-Bandit
相关产品推荐
相关产品推荐

