▤ 项目概述
reqrio 是一个面向爬虫研究、TLS 指纹控制、高并发采集和复杂网络环境的 HTTP 请求库。它支持浏览器级别的 TLS 指纹模拟,涵盖 JA3、JA4、自定义 ClientHello,支持同步与异步请求、多语言绑定,并在高并发下表现稳定。
适用于需要精细控制网络行为的场景,比如协议研究、指纹分析、高并发采集、复杂反爬与自动化测试等。
reqrio 是一个面向爬虫研究、TLS 指纹控制、高并发采集和复杂网络环境的 HTTP 请求库。它支持浏览器级别的 TLS 指纹模拟,涵盖 JA3、JA4、自定义 ClientHello,支持同步与异步请求、多语言绑定,并在高并发下表现稳定。
适用于需要精细控制网络行为的场景,比如协议研究、指纹分析、高并发采集、复杂反爬与自动化测试等。
支持 JA3、JA4、自定义 ClientHello、Cipher suites 顺序、TLS 扩展、ALPN、SNI 可控。
支持 Header 顺序、重定向、Cookie 管理与 HTTP/2 行为,精细还原客户端表现。
采用低拷贝数据结构,文件上传使用流式直读,减少内存开销,适合高并发采集。
提供同步与异步接口,兼顾研究效率与生产环境性能。
支持 HTTP 代理与 SOCKS5 代理,灵活适配复杂网络环境。
表单、JSON、文本、二进制等数据格式开箱即用。
内置 Gzip、Deflate、Brotli、Zstd 压缩与解压。
Base64、十六进制、URL 编码,处理各类传输数据。
内置 WebSocket 客户端,支持 ws / wss 双向通信。
配套 TLS / 加密基础库:AES·RSA·AEAD、SHA·HMAC、X.509 证书与签名。
用户数据先转为 bytes 存储,仅在进入 TLS 加密阶段发生一次 copy,其余阶段全部为借用(borrow);文件上传通过 reader 流式直读,显著降低内存开销。
use reqrio::*;
fn main() {
let mut req = ScReq::new();
let res = req.get("https://www.baidu.com", None).unwrap();
println!("{}", res.header());
println!("{}", res.text().unwrap());
}
from reqrio import Session, ALPN
session = Session(alpn=ALPN.HTTP11)
resp = session.get("https://www.baidu.com")
print(resp.statue_code())
print(resp.text())
import org.xllgl2017.*;
try (Session session = new Session(ALPN.HTTP20)) {
Response resp = session.get("https://www.baidu.com", new Body());
System.out.println("code: " + resp.statusCode());
System.out.println(resp.text());
}
const { Session, ALPN } = require('reqrio');
const session = new Session(ALPN.HTTP20);
const resp = session.get("https://www.baidu.com", {});
console.log("Status:", resp.status_code());
console.log(resp.text());
import "github.com/xllgl2017/reqrio/reqrio-go/reqrio"
session := reqrio.NewSession()
resp, err := session.SendRequest(reqrio.ConnParam{
Method: reqrio.GET,
Url: "https://www.baidu.com",
})
if err != nil { panic(err) }
defer resp.Delete()
fmt.Println(resp.StatusCode())
use reqrio::*;
let token = "<token>";
let fp = Fingerprint::from_ja3("771,4865-...,29-23-24,0", token).unwrap(); // JA3
let fp = Fingerprint::from_ja4("t13d1516h2_002f,...", token).unwrap(); // JA4
let fp = Fingerprint::from_hex_all("16030106b2010006ae...", token).unwrap(); // ClientHello(hex)
let fp = Fingerprint::random(token); // 随机指纹
let mut req = ScReq::new();
req.set_fingerprint(fp);
let res = req.get("https://www.baidu.com", None).unwrap();
from reqrio import Session, ALPN, hex_decode
token = "<token>"
session = Session(ja3="771,4865-...,29-23-24,0", token=token) # JA3
session = Session(ja4="t13d1516h2_002f,...", token=token) # JA4
ch = hex_decode("16030106b2010006ae...") # ClientHello(hex)
session = Session(alpn=ALPN.HTTP20, client_hello=ch, token=token)
session = Session(random_tls=True, token=token) # 随机指纹
session = Session(custom_tls={...}, token=token) # 自定义(详见仓库文档)
resp = session.get("https://www.baidu.com")
import org.xllgl2017.*;
String token = "<token>";
Fingerprint fp = Fingerprint.fromJa3("771,...", token); // JA3
fp = Fingerprint.fromJa4("t13d1516h2_...", token); // JA4
fp = Fingerprint.fromClientHello(clientHelloBytes, token); // ClientHello
fp = Fingerprint.random(token); // 随机指纹
try (Session session = new Session(ALPN.HTTP20)) {
session.setFingerprint(fp);
Response resp = session.get("https://www.baidu.com", new Body());
}
const { Session, ALPN } = require('reqrio');
const token = "<token>";
const session = new Session(ALPN.HTTP20);
session.set_ja3("771,...", token); // JA3
session.set_ja4("t13d1516h2_...", token); // JA4
session.set_finger_by_client_hello(clientHello, token); // ClientHello
session.use_random_tls(token); // 随机指纹
session.set_finger_by_custom({ /* suites, extensions */ }, token); // 自定义
const resp = session.get("https://www.baidu.com", {});
import (
"encoding/hex"
"github.com/xllgl2017/reqrio/reqrio-go/reqrio"
)
token := "<token>"
fp, _ := reqrio.FromJa3("771,...", token) // JA3
fp, _ = reqrio.FromJa4("t13d1516h2_...", token) // JA4
b, _ := hex.DecodeString("16030106b2...") // ClientHello
fp, _ = reqrio.FromClientHello(b, token)
fp, _ = reqrio.RandomFingerprint(token) // 随机指纹
session := reqrio.NewSession()
session.SetFingerprint(fp)
resp, _ := session.SendRequest(reqrio.ConnParam{Method: reqrio.GET, Url: "https://www.baidu.com"})
defer resp.Delete()
内置真实浏览器 TLS 指纹,亦支持自定义 / JA3 / JA4 / 随机指纹与 WebSocket。更多用法见 仓库文档。
| 特性 | reqrio | 常规库 |
|---|---|---|
| JA3 / JA4 | ✔ | ✘ |
| ClientHello 可控 | ✔ | ✘ |
| Header 顺序可控 | ✔ | ✘ |
| HTTP/2 支持 | ✔ | ⚠ |
| 高并发低内存 | ✔ | ⚠ |
TLS 1.3 指纹支持
HTTP/3 与 QUIC
API 稳定版本与长期支持
仓库与文档已覆盖多语言生态,适合研究数据采集控制与高并发采集。
仓库地址 →