目录
介绍
使用请求发送HTTP原始套接字,很明显看上去可以直接使用 bp 请求信息使用。
显式
import json
import requests_raw
req = b"GET /get HTTP/1.1\r\nHost: httpbin.org\r\n\r\n"
res = requests_raw.raw(url='http://httpbin.org/', data=req)
res_json = res.json()
print(json.dumps(res_json, indent=2))
隐式
import json
import requests
import requests_raw
requests_raw.monkey_patch_all()
req = b"GET /cookies/set/name/value HTTP/1.1\r\nHost: httpbin.org\r\n\r\n"
session = requests.Session()
res = session.raw(url='https://httpbin.org/', data=req)
res_json = res.json()
print(json.dumps(res_json, indent=2))
安装
pip3 install requests-raw
mitmproxy安装
https://mohen.blog.csdn.net/article/details/135818038
requests与requests_raw库区别
requests
和 requests_raw
都是 Python 中常用的 HTTP 客户端库,用于发送 HTTP 请求。它们的区别如下:
-
功能和用途:
requests
是 Python 社区中最常用的 HTTP 客户端库之一,提供了简洁和易用的 API,用于发送 HTTP 请求并处理响应。它具有许多高级功能,如会话管理、自动重定向、认证、代理支持、文件上传和下载等。requests
适用于大多数常见的 HTTP 请求和响应场景。requests_raw
则是一个相对较简单的库,专注于提供原始的、底层的 HTTP 请求和响应操作。它更接近于 HTTP 协议的底层操作,提供了对请求和响应的原始访问和控制。相比于requests
,requests_raw
更适合处理一些特殊的、非常定制化的 HTTP 请求和响应需求。 -
API 设计:
requests
提供了一组易用且高级的 API,例如get()
、post()
、put()
等方法,以及许多用于设置请求参数、请求头、代理、认证等的选项。这些 API 隐藏了底层的细节,使得发送 HTTP 请求和处理响应变得简单和直观。requests_raw
则提供了更底层的 API,例如request()
方法,它允许你直接设置请求头、请求体、URL、HTTP 方法等。你需要更多地了解 HTTP 协议的细节,并手动构造和解析请求和响应。 -
依赖和兼容性:
requests
是一个独立的库,可以直接通过pip install requests
安装。它在 Python 2.7、3.4+ 版本上都有良好的兼容性,并且不依赖于其他第三方库。requests_raw
则是 mitmproxy(中间人代理工具)库中的一个子模块,用于处理底层的 HTTP 请求和响应。如果你想使用requests_raw
,需要安装并导入 mitmproxy 库,它是一个专门用于拦截和修改网络请求的工具。
特别函数介绍
1. assemble_request
assemble_request
函数是 mitmproxy
中的一个内部函数,用于将各个部分的数据组装成一个完整的 HTTP 请求。它接受以下参数:
method
:请求方法,例如 "GET"、"POST" 等。scheme
:请求协议,例如 "http"、"https"。host
:请求的主机名。port
:请求的端口号。path
:请求的路径。http_version
:HTTP 版本,默认为 "HTTP/1.1"。headers
:请求头部,一个字典类型。content
:请求体内容,一个字节串。
from mitmproxy.net.http.http1.assemble import assemble_request
method = "GET"
scheme = "http"
host = "www.example.com"
port = 80
path = "/path"
headers = {
"User-Agent": "Mozilla/5.0",
}
request_bytes = assemble_request(method, scheme, host, port, path, headers=headers)
print(request_bytes.decode()) # 输出组装后的请求
结果
GET /path HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
使用示例
from mitmproxy.net.http.http1.assemble import assemble_request
import requests_raw
method = "GET"
scheme = "http"
host = "www.example.com"
port = 80
path = "/path"
headers = {
"User-Agent": "Mozilla/5.0",
}
#request_bytes = assemble_request(method, scheme, host, port, path, headers=headers).decode()
request_bytes = assemble_request(method, scheme, host, port, path, headers=headers).decode("utf-8")
r = requests_raw.raw(url=url, data=request_bytes.encode(), verify=False)