3个不稳定版本
0.12.1 | 2024年6月30日 |
---|---|
0.12.0 | 2024年4月2日 |
0.11.66 | 2024年3月12日 |
#178 in HTTP客户端
755KB
15K SLoC
chromimic
reqwest-impersonate的一个分支,用于模仿Chrome浏览器/OkHttp并使用默认证书。受curl-impersonate启发。
带有自 vendored 证书支持的分支
reqwest-impersonate
Rust的易于使用的、功能齐全的HTTP/WebSocket客户端。
- 模仿Chrome / Safari / Edge / OkHttp
- 纯文本主体,JSON,表单编码,多部分
- 可定制的重定向策略
- HTTP代理
- 通过BoringSSL的HTTPS
- WebSocket
- Cookie存储
- WASM
- 变更日志
赞助商
Capsolver.com 是一款AI驱动的服务,专注于自动解决各种类型的验证码。它支持以下验证码类型:reCAPTCHA V2、reCAPTCHA V3、hCaptcha、FunCaptcha、DataDome、AWS Captcha、Geetest 和 Cloudflare Captcha / Challenge 5s、Imperva / Incapsula 等。对于开发者,Capsolver 提供了详细的 API 集成选项,可在其 文档 中找到,方便将验证码解决功能集成到应用程序中。他们还提供了适用于 Chrome 和 Firefox 的浏览器扩展,使得在浏览器中直接使用他们的服务变得简单。提供不同的定价方案,以满足不同需求,确保用户灵活性。
示例
此异步示例使用 Tokio 并启用一些可选功能,因此您的 Cargo.toml
可能如下所示
[dependencies]
tokio = { version = "1", features = ["full"] }
reqwest_impersonate = "0.11"
或 WebSocket
[dependencies]
tokio = { version = "1", features = ["full"] }
reqwest_impersonate = { version = "0.11", features = ["websocket"] }
然后代码
use std::error::Error;
use reqwest_impersonate as reqwest;
use reqwest::impersonate::Impersonate;
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
// Build a client to mimic Chrome123
let client = reqwest::Client::builder()
.impersonate(Impersonate::Chrome123)
.enable_ech_grease()
.permute_extensions()
.cookie_store(true)
.build()?;
// Use the API you're already familiar with
let resp = client.get("https://tls.peet.ws/api/all").send().await?;
println!("{}", resp.text().await?);
Ok(())
}
然后 WebSocket 代码
use reqwest_impersonate as reqwest;
use std::error::Error;
use tungstenite::Message;
use futures_util::{SinkExt, StreamExt, TryStreamExt};
use reqwest::{impersonate::Impersonate, Client};
#[tokio::main]
async fn main() -> Result<(), Box<dyn Error>> {
let websocket = Client::builder()
.impersonate_websocket(Impersonate::Chrome120)
.build()?
.get("wss://echo.websocket.org")
.upgrade()
.send()
.await?
.into_websocket()
.await?;
let (mut tx, mut rx) = websocket.split();
tokio::spawn(async move {
for i in 1..11 {
tx.send(Message::Text(format!("Hello, World! #{i}")))
.await
.unwrap();
}
});
while let Some(message) = rx.try_next().await? {
match message {
Message::Text(text) => println!("received: {text}"),
_ => {}
}
}
Ok(())
}
要求
在 Linux 上
- OpenSSL 以及头文件。有关支持的版本和更多详细信息,请参阅 https://docs.rs/openssl。或者,您可以通过启用
native-tls-vendored
功能来编译 OpenSSL 的副本。
在 Windows 和 macOS 上
- 无。
Reqwest 使用 rust-native-tls,如果可用,将使用操作系统的 TLS 框架,这意味着 Windows 和 macOS。在 Linux 上,它将使用 OpenSSL 1.1。
许可
以下任一许可下
- Apache 许可证 2.0(《LICENSE-APACHE》或 http://apache.org/licenses/LICENSE-2.0》)
- MIT 许可证(《LICENSE-MIT》或 http://opensource.org/licenses/MIT》)
贡献
除非您明确说明,否则您有意提交以供包含在作品中的任何贡献,如 Apache-2.0 许可证所定义,应按上述方式双重许可,不附加任何额外条款或条件。
依赖关系
~2-30MB
~551K SLoC