#websocket-client #http-request #request #async-http #http #client

chromimic

一个简单且强大的Rust HTTP客户端(模仿Chrome/OkHttp)

3个不稳定版本

0.12.1 2024年6月30日
0.12.0 2024年4月2日
0.11.66 2024年3月12日

#178 in HTTP客户端

MIT/Apache

755KB
15K SLoC

chromimic

reqwest-impersonate的一个分支,用于模仿Chrome浏览器/OkHttp并使用默认证书。受curl-impersonate启发。

带有自 vendored 证书支持的分支

reqwest-impersonate

crates.io MIT/Apache-2 licensed CI

Rust的易于使用的、功能齐全的HTTP/WebSocket客户端。

  • 模仿Chrome / Safari / Edge / OkHttp
  • 纯文本主体,JSON,表单编码,多部分
  • 可定制的重定向策略
  • HTTP代理
  • 通过BoringSSL的HTTPS
  • WebSocket
  • Cookie存储
  • WASM
  • 变更日志

赞助商

Capsolver Capsolver.com 是一款AI驱动的服务,专注于自动解决各种类型的验证码。它支持以下验证码类型:reCAPTCHA V2reCAPTCHA V3hCaptchaFunCaptchaDataDomeAWS CaptchaGeetest 和 Cloudflare Captcha / Challenge 5sImperva / Incapsula 等。对于开发者,Capsolver 提供了详细的 API 集成选项,可在其 文档 中找到,方便将验证码解决功能集成到应用程序中。他们还提供了适用于 ChromeFirefox 的浏览器扩展,使得在浏览器中直接使用他们的服务变得简单。提供不同的定价方案,以满足不同需求,确保用户灵活性。

示例

此异步示例使用 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 许可证所定义,应按上述方式双重许可,不附加任何额外条款或条件。

依赖关系

~2-30MB
~551K SLoC