From 28665b5f9c72a83c2cea56707472f6825fa45815 Mon Sep 17 00:00:00 2001 From: 0x676e67 Date: Fri, 14 Feb 2025 23:50:57 +0800 Subject: [PATCH 1/2] feat(client): Improve impersonate FFI --- src/client.rs | 17 ++++++++++------- src/lib.rs | 5 ++++- src/param/client.rs | 17 ++++++++++++++++- src/types/impersonate.rs | 35 +++++++++++++++++++++++++++++++++++ src/types/mod.rs | 10 ++++++++-- 5 files changed, 73 insertions(+), 11 deletions(-) diff --git a/src/client.rs b/src/client.rs index 6b4dee15..7b927487 100644 --- a/src/client.rs +++ b/src/client.rs @@ -80,13 +80,16 @@ impl Client { let mut builder = rquest::Client::builder(); // Impersonation options. - apply_option!( - apply_transformed_option, - builder, - params.impersonate, - impersonate, - |v: Impersonate| v.into_inner() - ); + if let Some(impersonate) = params.impersonate.take() { + builder = builder.impersonate( + rquest::Impersonate::builder() + .impersonate(impersonate.into_inner()) + .impersonate_os(params.impersonate_os.unwrap_or_default().into_inner()) + .skip_http2(params.impersonate_skip_http2.unwrap_or(false)) + .skip_headers(params.impersonate_skip_headers.unwrap_or(false)) + .build(), + ); + } // User agent options. apply_option!(apply_if_some, builder, params.user_agent, user_agent); diff --git a/src/lib.rs b/src/lib.rs index c32b985f..012b86d2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -9,7 +9,9 @@ use param::{ClientParams, RequestParams}; use pyo3::prelude::*; use pyo3_stub_gen::{define_stub_info_gatherer, derive::*}; use resp::{Response, Streamer}; -use types::{HeaderMap, Impersonate, Method, Proxy, SocketAddr, StatusCode, Version}; +use types::{ + HeaderMap, Impersonate, ImpersonateOS, Method, Proxy, SocketAddr, StatusCode, Version, +}; type Result = std::result::Result; @@ -247,6 +249,7 @@ fn rnet(m: &Bound<'_, PyModule>) -> PyResult<()> { m.add_class::()?; m.add_class::()?; m.add_class::()?; + m.add_class::()?; m.add_class::()?; m.add_class::()?; m.add_class::()?; diff --git a/src/param/client.rs b/src/param/client.rs index c93cc4e0..b9e76e47 100644 --- a/src/param/client.rs +++ b/src/param/client.rs @@ -1,4 +1,4 @@ -use crate::types::{Impersonate, Proxy}; +use crate::types::{Impersonate, ImpersonateOS, Proxy}; use indexmap::IndexMap; use pyo3::prelude::*; use pyo3_stub_gen::derive::gen_stub_pyclass; @@ -38,6 +38,18 @@ pub struct ClientParams { #[pyo3(get)] pub impersonate: Option, + /// The impersonation settings for the operating system. + #[pyo3(get)] + pub impersonate_os: Option, + + /// Whether to skip impersonate HTTP/2. + #[pyo3(get)] + pub impersonate_skip_http2: Option, + + /// Whether to skip impersonate headers. + #[pyo3(get)] + pub impersonate_skip_headers: Option, + /// The user agent to use for the request. #[pyo3(get)] pub user_agent: Option, @@ -167,6 +179,9 @@ impl<'py> FromPyObject<'py> for ClientParams { fn extract_bound(ob: &Bound<'py, PyAny>) -> PyResult { let mut params = Self::default(); extract_option!(ob, params, impersonate); + extract_option!(ob, params, impersonate_os); + extract_option!(ob, params, impersonate_skip_http2); + extract_option!(ob, params, impersonate_skip_headers); extract_option!(ob, params, user_agent); extract_option!(ob, params, default_headers); extract_option!(ob, params, headers_order); diff --git a/src/types/impersonate.rs b/src/types/impersonate.rs index cd71cb56..677f66a6 100644 --- a/src/types/impersonate.rs +++ b/src/types/impersonate.rs @@ -8,12 +8,23 @@ use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods}; #[derive(Clone, Copy, Default, Debug)] pub struct Impersonate(rquest::Impersonate); +#[gen_stub_pyclass] +#[pyclass] +#[derive(Clone, Copy, Default, Debug)] +pub struct ImpersonateOS(rquest::ImpersonateOS); + impl Impersonate { pub fn into_inner(self) -> rquest::Impersonate { self.0 } } +impl ImpersonateOS { + pub fn into_inner(self) -> rquest::ImpersonateOS { + self.0 + } +} + #[gen_stub_pymethods] #[pymethods] impl Impersonate { @@ -28,6 +39,20 @@ impl Impersonate { } } +#[gen_stub_pymethods] +#[pymethods] +impl ImpersonateOS { + /// Returns a string representation of the impersonate. + fn __str__(&self) -> String { + format!("{:?}", self.0) + } + + /// Returns a string representation of the impersonate. + fn __repr__(&self) -> String { + self.__str__() + } +} + define_constants!( Impersonate, rquest::Impersonate, @@ -85,3 +110,13 @@ define_constants!( OkHttp4_10, OkHttp5 ); + +define_constants!( + ImpersonateOS, + rquest::ImpersonateOS, + Windows, + MacOS, + Linux, + Android, + IOS +); diff --git a/src/types/mod.rs b/src/types/mod.rs index 29bb7019..5e16ca8f 100644 --- a/src/types/mod.rs +++ b/src/types/mod.rs @@ -8,8 +8,14 @@ mod status_code; mod version; pub use self::{ - headers::HeaderMap, impersonate::Impersonate, ipaddr::SocketAddr, json::Json, method::Method, - proxy::Proxy, status_code::StatusCode, version::Version, + headers::HeaderMap, + impersonate::{Impersonate, ImpersonateOS}, + ipaddr::SocketAddr, + json::Json, + method::Method, + proxy::Proxy, + status_code::StatusCode, + version::Version, }; #[macro_export] From 7dc549a08690b91b2e7ada5706b7a5c46dd33c8a Mon Sep 17 00:00:00 2001 From: 0x676e67 Date: Fri, 14 Feb 2025 23:53:45 +0800 Subject: [PATCH 2/2] feat(client): Improve impersonate FFI --- src/client.rs | 12 ++++++------ src/types/impersonate.rs | 12 ++++++------ src/types/method.rs | 6 +++--- src/types/proxy.rs | 6 +++--- src/types/version.rs | 6 +++--- 5 files changed, 21 insertions(+), 21 deletions(-) diff --git a/src/client.rs b/src/client.rs index 7b927487..09a34492 100644 --- a/src/client.rs +++ b/src/client.rs @@ -2,7 +2,7 @@ use crate::{ error::{wrap_invali_header_name_error, wrap_rquest_error}, param::{ClientParams, RequestParams}, resp::Response, - types::{Impersonate, Method, Version}, + types::Method, Result, }; use pyo3::prelude::*; @@ -83,8 +83,8 @@ impl Client { if let Some(impersonate) = params.impersonate.take() { builder = builder.impersonate( rquest::Impersonate::builder() - .impersonate(impersonate.into_inner()) - .impersonate_os(params.impersonate_os.unwrap_or_default().into_inner()) + .impersonate(impersonate.into()) + .impersonate_os(params.impersonate_os.unwrap_or_default().into()) .skip_http2(params.impersonate_skip_http2.unwrap_or(false)) .skip_headers(params.impersonate_skip_headers.unwrap_or(false)) .build(), @@ -216,7 +216,7 @@ impl Client { // Network options. if let Some(proxies) = params.proxies.take() { for proxy in proxies { - builder = builder.proxy(proxy.into_inner()); + builder = builder.proxy(proxy.into()); } } apply_option!( @@ -591,7 +591,7 @@ async fn execute_request( mut params: Option, ) -> Result { let params = params.get_or_insert_default(); - let mut builder = client.request(method.into_inner(), url); + let mut builder = client.request(method.into(), url); // Version options. apply_option!( @@ -599,7 +599,7 @@ async fn execute_request( builder, params.version, version, - |v: Version| v.into_inner() + Into::into ); // Allow redirects options. diff --git a/src/types/impersonate.rs b/src/types/impersonate.rs index 677f66a6..a40ad521 100644 --- a/src/types/impersonate.rs +++ b/src/types/impersonate.rs @@ -13,15 +13,15 @@ pub struct Impersonate(rquest::Impersonate); #[derive(Clone, Copy, Default, Debug)] pub struct ImpersonateOS(rquest::ImpersonateOS); -impl Impersonate { - pub fn into_inner(self) -> rquest::Impersonate { - self.0 +impl From for rquest::Impersonate { + fn from(impersonate: Impersonate) -> rquest::Impersonate { + impersonate.0 } } -impl ImpersonateOS { - pub fn into_inner(self) -> rquest::ImpersonateOS { - self.0 +impl From for rquest::ImpersonateOS { + fn from(impersonate: ImpersonateOS) -> rquest::ImpersonateOS { + impersonate.0 } } diff --git a/src/types/method.rs b/src/types/method.rs index 0ca767ff..728aeef3 100644 --- a/src/types/method.rs +++ b/src/types/method.rs @@ -8,9 +8,9 @@ use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods}; #[derive(Clone, PartialEq, Eq, Hash)] pub struct Method(rquest::Method); -impl Method { - pub fn into_inner(self) -> rquest::Method { - self.0 +impl From for rquest::Method { + fn from(method: Method) -> rquest::Method { + method.0 } } diff --git a/src/types/proxy.rs b/src/types/proxy.rs index aa19e3f4..201be193 100644 --- a/src/types/proxy.rs +++ b/src/types/proxy.rs @@ -8,9 +8,9 @@ use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods}; #[derive(Clone, Debug)] pub struct Proxy(rquest::Proxy); -impl Proxy { - pub fn into_inner(self) -> rquest::Proxy { - self.0 +impl From for rquest::Proxy { + fn from(proxy: Proxy) -> rquest::Proxy { + proxy.0 } } diff --git a/src/types/version.rs b/src/types/version.rs index 6217fd52..acf45800 100644 --- a/src/types/version.rs +++ b/src/types/version.rs @@ -8,9 +8,9 @@ use pyo3_stub_gen::derive::{gen_stub_pyclass, gen_stub_pymethods}; #[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)] pub struct Version(rquest::Version); -impl Version { - pub fn into_inner(self) -> rquest::Version { - self.0 +impl From for rquest::Version { + fn from(version: Version) -> rquest::Version { + version.0 } }