#scraping #fingerprinting #website #fingerprint #traits #tls #monitor

maera

使用真实的浏览器指纹定期抓取网站的监控器

7个版本

0.1.3 2023年3月26日
0.1.2 2023年3月26日
0.0.3 2023年3月25日

#287 in HTTP客户端

Download history 20/week @ 2024-03-30 7/week @ 2024-04-06

每月 70 次下载

MIT 许可协议

18KB
310

Maera

一个简单的基于间隔的网站监控器,可以绕过网站的TLS指纹识别。

use async_trait::async_trait;
use maera::*;
use serde_json::{from_str, to_string_pretty, Value};
use std::time::Duration;

struct Peet;

#[async_trait]
impl JobHandler for Peet {
    type Response = MaeraResponse;
    fn request(&self, builder: ChainableRequestBuilder) -> Chain<Self::Response> {
        builder
            .url("/api/all")
            .delay(Duration::from_secs(60))
            .into()
    }
    async fn on_success(&self, response: &mut Self::Response) -> Decision {
        // get JSON from response text
        let body = response.text().await.unwrap();
        let json = from_str::<Value>(&body).unwrap();
        println!("{}", to_string_pretty(&json).unwrap());
        Decision::Continue
    }
}

#[tokio::main]
async fn main() {
    let job = JobBuilder::new()
        .base_url("https://tls.peet.ws")
        .handler(Peet)
        .build();
    let maera = Maera::new(vec![job]);

    maera.start().await.unwrap();
}

模拟浏览器

如果你熟悉系统编程,你可能期望libcurl-impersonate-chrome.so是静态链接并随库本身一起提供的,以便能够精细控制指纹。然而,我不是,也不知道如何做到!所以你需要在运行你的二进制文件时使用以下命令预先加载它。

假设你的共享库位于/usr/local/lib,你可以设置以下环境变量来预先加载所需的库

LD_PRELOAD="/usr/local/lib/libcurl-impersonate-chrome.so" CURL_IMPERSONATE=chrome111 ./your/binary

建议不要过多更改请求的头部,因为头部的大小写和值用于指纹识别,所以很多像user-agent这样的头部是硬编码的。

警告,我不知道如何构建Rust库(如从特质的类型签名中可以看出)。如果你遇到这个问题并且想改进API,请随意提交PR。

为什么选择Maera?

她是《命运之熔炉》系列中的主要人物之一。非常推荐阅读!

Book cover

依赖项

~12–24MB
~398K SLoC