reqrio

浏览器级 TLS 指纹
高性能 HTTP 客户端

专为爬虫研究、TLS 指纹控制、高并发采集与复杂网络环境设计的低延迟 HTTP 请求库。

项目概述

reqrio 是一个面向爬虫研究、TLS 指纹控制、高并发采集和复杂网络环境的 HTTP 请求库。它支持浏览器级别的 TLS 指纹模拟,涵盖 JA3、JA4、自定义 ClientHello,支持同步与异步请求、多语言绑定,并在高并发下表现稳定。

适用于需要精细控制网络行为的场景,比如协议研究、指纹分析、高并发采集、复杂反爬与自动化测试等。

核心定位

  • TLS ClientHello 浏览器行为可控
  • Header 顺序与 HTTP/2 行为可控
  • 高并发场景下的低内存设计
  • 多语言绑定与跨平台支持

核心特性

🛡

TLS 指纹控制

支持 JA3、JA4、自定义 ClientHello、Cipher suites 顺序、TLS 扩展、ALPN、SNI 可控。

请求行为可控

支持 Header 顺序、重定向、Cookie 管理与 HTTP/2 行为,精细还原客户端表现。

🚀

低资源高性能

采用低拷贝数据结构,文件上传使用流式直读,减少内存开销,适合高并发采集。

同步与异步

提供同步与异步接口,兼顾研究效率与生产环境性能。

更多能力

🌐

代理支持

支持 HTTP 代理与 SOCKS5 代理,灵活适配复杂网络环境。

🧩

多种数据格式

表单、JSON、文本、二进制等数据格式开箱即用。

🗜

压缩支持

内置 Gzip、Deflate、Brotli、Zstd 压缩与解压。

🔣

编码支持

Base64、十六进制、URL 编码,处理各类传输数据。

🔌

WebSocket

内置 WebSocket 客户端,支持 ws / wss 双向通信。

🔐

reqtls 加密库

配套 TLS / 加密基础库:AES·RSA·AEAD、SHA·HMAC、X.509 证书与签名。

低拷贝引擎

用户数据先转为 bytes 存储,仅在进入 TLS 加密阶段发生一次 copy,其余阶段全部为借用(borrow);文件上传通过 reader 流式直读,显著降低内存开销。

Write Form Json Files Req Engine (Sync) (Async) Body · Cow<T> Lifetime RequestBuf Header + Body Readers (borrowed) Buffer TlsStream Encrypt Encrypted TCP Send Read TCP read TLS Fragment Decrypt decrypt to ScReq / AcReq (Engine) return Response User

快速开始

安装 reqrio = "0.1.1"
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())

TLS 指纹用法

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。更多用法见 仓库文档

能力对比

与常见 HTTP 客户端库相比,reqrio 提供更细的 TLS 指纹与协议层控制,而非通用 HTTP 功能。

查看详细对比
特性reqrio常规库
JA3 / JA4
ClientHello 可控
Header 顺序可控
HTTP/2 支持
高并发低内存

多语言绑定

Roadmap

01

TLS 1.3 指纹支持

02

HTTP/3 与 QUIC

03

API 稳定版本与长期支持