use std::fs;
use reqrio::*;
#[cfg(feature = "log")]
const LOGER: Logger = Logger {
module: &[],
debug_file: None,
info_file: None,
warn_file: None,
error_file: None,
out_file: None,
};
#[cfg(feature = "log")]
fn test_log() {
set_logger(&LOGER).unwrap();
set_max_level(LevelFilter::Debug);
}
const REVERSED: [u16; 15] = [0x0a0a, 0x1a1a, 0x2a2a, 0x3a3a, 0x4a4a, 0x5a5a, 0x6a6a, 0x7a7a, 0x8a8a, 0x9a9a, 0xaaaa, 0xbaba, 0xcaca, 0xeaea, 0xfafa];
pub fn random_fingerprint(sni: &str) -> Result<Fingerprint, HlsError> {
let group = REVERSED[rand::random::<usize>() % REVERSED.len()];
let padding = 192 - (19 - sni.len() as i32);
let tls = TlsFinger::Custom {
suites: vec![
CipherSuite::new(REVERSED[rand::random::<usize>() % REVERSED.len()]),
CipherSuite::TLS_AES_128_GCM_SHA256.into(),
CipherSuite::TLS_AES_256_GCM_SHA384.into(),
CipherSuite::TLS_CHACHA20_POLY1305_SHA256.into(),
CipherSuite::TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256.into(),
CipherSuite::TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256.into(),
CipherSuite::TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384.into(),
CipherSuite::TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384.into(),
CipherSuite::TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256.into(),
CipherSuite::TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256.into(),
CipherSuite::TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA.into(),
CipherSuite::TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA.into(),
CipherSuite::TLS_RSA_WITH_AES_128_GCM_SHA256.into(),
CipherSuite::TLS_RSA_WITH_AES_256_GCM_SHA384.into(),
CipherSuite::TLS_RSA_WITH_AES_128_CBC_SHA.into(),
CipherSuite::TLS_RSA_WITH_AES_256_CBC_SHA.into(),
],
extensions: vec![
Extension::new(ExtensionType::new(REVERSED[rand::random::<usize>() % REVERSED.len()]), ExtensionValue::Default),
Extension::new_default(ExtensionType::ServerName),
Extension::new_default(ExtensionType::ExtendMasterSecret),
Extension::new_default(ExtensionType::RenegotiationInfo),
Extension::new(ExtensionType::SupportedGroup, ExtensionValue::Curves(vec![
NamedCurve::new(group),
NamedCurve::X25519.into(),
NamedCurve::SecP256r1.into(),
NamedCurve::SecP384r1.into()
])),
Extension::new(ExtensionType::EcPointFormats, ExtensionValue::EcPointFormats(vec![
EcPointFormat::UNCOMPRESSED
])),
Extension::new_default(ExtensionType::SessionTicket),
Extension::new(ExtensionType::ApplicationLayerProtocolNegotiation, ExtensionValue::Alps(vec![
ALPN::Http20,
ALPN::Http11
])),
Extension::new_default(ExtensionType::StatusRequest),
Extension::new(ExtensionType::SignatureAlgorithms, ExtensionValue::Algorithms(vec![
SignatureAlgorithm::ECDSA_SECP256R1_SHA256.into(),
SignatureAlgorithm::RSA_PSS_RSAE_SHA256.into(),
SignatureAlgorithm::RSA_PKCS1_SHA256.into(),
SignatureAlgorithm::ECDSA_SECP384R1_SHA384.into(),
SignatureAlgorithm::RSA_PSS_RSAE_SHA384.into(),
SignatureAlgorithm::RSA_PKCS1_SHA384.into(),
SignatureAlgorithm::RSA_PSS_RSAE_SHA512.into(),
SignatureAlgorithm::RSA_PKCS1_SHA512.into()
])),
Extension::new_default(ExtensionType::SignedCertificateTimestamp),
Extension::new(ExtensionType::KeyShare, ExtensionValue::Curves(vec![
NamedCurve::new(group),
NamedCurve::X25519.into()
])),
Extension::new(ExtensionType::PskKeyExchangeMode, ExtensionValue::PskMode(PskMode::PSK_DHE_KE)),
Extension::new(ExtensionType::SupportedVersions, ExtensionValue::SupportedVersions(vec![
Version::new(REVERSED[rand::random::<usize>() % REVERSED.len()]),
Version::TLS_1_3,
Version::TLS_1_2,
Version::TLS_1_1,
Version::TLS_1_0
])),
Extension::new(ExtensionType::CompressionCertificate, ExtensionValue::CompressionMethods(vec![
CompressionMethod::BROTLI
])),
Extension::new(ExtensionType::ApplicationSettingOld, ExtensionValue::Alps(vec![
ALPN::Http20
])),
Extension::new(REVERSED[rand::random::<usize>() % REVERSED.len()], ExtensionValue::Bytes(Bytes::new(vec![0]))),
Extension::new(ExtensionType::Padding, ExtensionValue::Padding(padding as usize))
],
};
Fingerprint::new_tls(tls, fs::read_to_string("TOKEN").unwrap_or("".to_string()))
}
fn main() {
#[cfg(feature = "log")]
test_log();
let mut req = ScReq::new()
.with_alpn(ALPN::Http20)
.with_verify(true)
.with_timeout(Timeout::new_same(1000, 1))
.with_key_log("2.log")
.with_fingerprint(random_fingerprint("h5.moutai519.com.cn").unwrap())
// .with_proxy(Proxy::try_from("http://36.150.202.148:10951").unwrap())
// .with_mtls(certs, key)
// .with_proxy(Proxy::try_from("http://127.0.0.1:10240").unwrap())
;
let headers = json::object! {
"User-Agent": "Mozilla/5.0 (Linux; Android 15; xuanyuan Build/VKQ1.250106.001.OS2.0.5.0.VNECNXM; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/128.0.6613.88 Mobile Safari/537.36 moutaiapp/1.9.7 device-id/bc823b4ef4840826d5df6bb059410d36 BS-DVID/UkGLUFZAqT06gye-0nF1683DRwZ2yujoY3kPcrdz5Ng9JA6i5g5XWsmJpNTq7PvYDiiCRTagsZn2LANM-RoIhDQ",
"Accept": "*/*",
"Sec-Fetch-Site": "none",
"Sec-Fetch-Mode": "navigate",
"Sec-Fetch-Dest": "document",
"sec-fetch-user":"?1",
"upgrade-insecure-requests":"1",
"sec-ch-ua": "\"Not_A Brand\";v=\"8\", \"Chromium\";v=\"120\", \"Microsoft Edge\";v=\"120\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"Accept-Language": "zh-CN,zh;q=0.9",
"Accept-Encoding": "gzip,deflate",
"Cache-Control": "no-cache",
"Connection": "keep-alive",
// "cookie":"_EDGE_V=1; MUIDB=184C10AD397866DF1A1607B038566708; MUID=184C10AD397866DF1A1607B038566708; _UR=QS=0&TQS=0&Pn=0; BFBUSR=BFBHP=0; MUIDB=184C10AD397866DF1A1607B038566708; SRCHD=AF,AF,AF,AF,AF,AF,AF,AF,AF,AF,AF,AF,AF,AF,AF&AF=NOFORM; SRCHUID=V=2&GUID=EB7B9E5DE58F4D5690F6904732C24C7B&dmnchg=1; USRLOC=HS&ELOC=LAT=23.384721755981445|LON=113.44195556640625|N=%E7%99%BD%E4%BA%91%E5%8C%BA%EF%BC%8C%E5%B9%BF%E4%B8%9C%E7%9C%81|ELT=4|&HS=1; _RwBf=r&r&r&r&r=0&ilt=10&ihpd=5&ispd=3&rc=12&rb=0&rg=200&pc=12&mtu=0&rbb=0&clo=0&v=8&l=2026-03-15T07:00:00.0000000Z&lft=0001-01-01T00:00:00.0000000&aof=0&ard=0001-01-01T00:00:00.0000000&rwdbt=0&rwflt=0&rwaul2=0&g=&o=2&p=&c=&t=0&s=0001-01-01T00:00:00.0000000+00:00&ts=2026-03-15T14:03:35.7211444+00:00&rwred=0&wls=&wlb=&wle=&ccp=&cpt=&lka=0&lkt=0&aad=0&TH=&cid=0&gb=; SRCHUSR=DOB&DS&DS&DS&DS&DS=1&DOB=20260315; _EDGE_S=SID=357AA105805E678827ACB618817066E6; _SS=SID=357AA105805E678827ACB618817066E6; _HPVN=CS=eyJQbiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiUCJ9LCJTYyI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiSCJ9LCJReiI6eyJDbiI6MSwiU3QiOjAsIlFzIjowLCJQcm9kIjoiVCJ9LCJBcCI6dHJ1ZSwiTXV0ZSI6dHJ1ZSwiTGFkIjoiMjAyNi0wMy0xNVQwMDowMDowMFoiLCJJb3RkIjowLCJHd2IiOjAsIlRucyI6MCwiRGZ0IjpudWxsLCJNdnMiOjAsIkZsdCI6MCwiSW1wIjozMCwiVG9ibiI6MH0=; SRCHHPGUSR=SRCHLANG&SRCHLANG&SRCHLANG&SRCHLANG&SRCHLANG&SRCHLANG&SRCHLANG&SRCHLANG&SRCHLANG&V&SRCHLANG&SRCHLANG&SRCHLANG&V&SRCHLANG&SRCHLANG=zh-Hans&PREFCOL=0&BRW=NOTP&BRH=M&CW=150&CH=769&SCW=150&SCH=769&DPR=1.0&UTC=480&HV=1773588648&HVE=CfDJ8HAK7eZCYw5BifHFeUHnkJGC6_lT8f9GeruXx8zjPXuk-5GHkofYMoFErMkT8CTKKKsSt5O2HyGmjLyCEXbEREUmwCd8ZBlYMLSDZu1wZ-EI1LDuyIiI1tkP6Usyicm601qX3aJVYqVWUBn-t6h0ZWLiftm4aS627xFj1fE5PD-85i7BWTkhqG0uvaYzuSgB2A&BZA=0&PRVCW=150&PRVCH=769&B=0&EXLTT=7&V=CfDJ8HAK7eZCYw5BifHFeUHnkJGijeRjCoaCMaAnmznMvdEg2GXY8647Wb-7wnHNpePKXRO6KRQ_0cQc-onivd35uV-p-4g0MB0V_Z1ZpW-QSJe9zbPUG-Ks-kQMjzEl6GlLo6N0ciP51vkQdR-P-lCUH58&PR=1"
};
req.set_headers_json(headers).unwrap();
let res = req.get("https://www.baidu.com", None).unwrap();
println!("{}", res.header());
// fs::write("data/coder/chunk_gzip.bin", res.raw_body()).unwrap();
// println!("{} {:?}", res.raw_body().len(), res.raw_body());
println!("{}", res.text().unwrap());
// let res = req.get("https://117.89.181.21".sni("m.sogou.com"), None).unwrap();
// println!("111={}", res.header());
// let res = req.get("https://h5.moutai519.com.cn".sni("h5.moutai519.com.cn"), None).unwrap();
// let res = req.get("https://aswbe.ana.co.jp/webapps/reservation/flight-search", None).await.unwrap();
// req.re_conn(None).unwrap();
// let res = req.get("https://aswbe.ana.co.jp/webapps/reservation/flight-search", None).await.unwrap();
// let res = req.get("https://oauth.hubei.gov.cn:8443/", None).await.unwrap();
// let res = req.get("https://104.18.34.137".sni("whatnot.com"), None).await.unwrap();
// let res = req.get("https://150.139.229.223".sni("h5.moutai519.com.cn"), None).unwrap();
// let res = req.get("https://117.89.181.21".sni("m.sogou.com"), None).unwrap();
}