From ad7f7928f56fed0ff3f8003012e05e7740e91b81 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 28 Oct 2025 22:14:48 -0400 Subject: [PATCH] cleanup --- .../src/recipes/request_client_secrets.rs | 21 +++++++++++++++++++ .../src/requests/index_page/get_numbers.rs | 10 ++++----- .../parse_index_verification_token.rs | 6 +++--- ...nd_script_actions_and_xsid_script_path.rs} | 6 +++--- .../src/requests/index_page/utils/mod.rs | 2 +- .../verification_token_to_loading_anim.rs | 19 ++++++++++------- 6 files changed, 45 insertions(+), 19 deletions(-) rename crates/api_clients/grok_client/src/requests/index_page/utils/{find_script_actions_and_xsid.rs => find_script_actions_and_xsid_script_path.rs} (91%) diff --git a/crates/api_clients/grok_client/src/recipes/request_client_secrets.rs b/crates/api_clients/grok_client/src/recipes/request_client_secrets.rs index 322667d2a9..44d58f8beb 100644 --- a/crates/api_clients/grok_client/src/recipes/request_client_secrets.rs +++ b/crates/api_clients/grok_client/src/recipes/request_client_secrets.rs @@ -3,6 +3,8 @@ use crate::error::grok_generic_api_error::GrokGenericApiError; use crate::requests::index_page::get_index_page_and_scripts::{get_index_page_and_scripts, GetIndexPageAndScriptsArgs}; use crate::requests::index_page::index_parsers::parse_index_baggage::parse_index_baggage; use crate::requests::index_page::index_parsers::parse_index_sentry_trace::parse_index_sentry_trace; +use crate::requests::index_page::index_parsers::parse_index_verification_token::{parse_index_verification_token, VerificationToken}; +use crate::requests::index_page::utils::find_script_actions_and_xsid_script_path::find_script_actions_and_xsid_script_path; use std::collections::HashMap; pub struct RequestClientSecretsArgs<'a> { @@ -20,6 +22,9 @@ pub struct ClientSecrets { /// From the index HTML meta tag pub sentry_trace: String, + /// From the index HTML meta tag + pub verification_token: VerificationToken, + /// Scripts (for later use) pub scripts: HashMap, } @@ -41,6 +46,20 @@ pub async fn request_client_secrets(args: RequestClientSecretsArgs<'_>) -> Resul message: "Index did not include sentry trace.".to_string() })?; + let verification_token = parse_index_verification_token(&payloads.index_body_html) + .ok_or_else(|| GrokGenericApiError::IndexHtmlDidNotIncludeExpectedData { + message: "Index did not include verification token.".to_string() + })?; + + let actions_and_xsid_script = find_script_actions_and_xsid_script_path(&payloads.scripts)?; + + // self.svg_data, self.numbers = Parser.parse_values(c_request.text, self.anim, self.xsid_script) + + // TODO: SvgData + // TODO: Numbers + // Do we need "anim" ? + // TODO: xsid + // xsid: str = Signature.generate_sign( // '/rest/app-chat/conversations/new', // 'POST', @@ -52,6 +71,7 @@ pub async fn request_client_secrets(args: RequestClientSecretsArgs<'_>) -> Resul Ok(ClientSecrets { baggage, sentry_trace, + verification_token, scripts: payloads.scripts, }) } @@ -73,6 +93,7 @@ mod tests { println!("Baggage: {:?}", secrets.baggage); println!("Sentry trace: {:?}", secrets.sentry_trace); + println!("Verification token: {:?}", secrets.verification_token); assert_eq!(1, 2); Ok(()) diff --git a/crates/api_clients/grok_client/src/requests/index_page/get_numbers.rs b/crates/api_clients/grok_client/src/requests/index_page/get_numbers.rs index 9692cc807d..1e032d6ad5 100644 --- a/crates/api_clients/grok_client/src/requests/index_page/get_numbers.rs +++ b/crates/api_clients/grok_client/src/requests/index_page/get_numbers.rs @@ -64,8 +64,8 @@ pub async fn get_numbers(args: GetNumbersArgs<'_>) -> Result = Lazy::new(|| { pub struct VerificationToken(pub(crate) String); /// Parse the verification token from the root HTML -pub fn parse_verification_token_from_index_html(html: &str) -> Option { +pub fn parse_index_verification_token(html: &str) -> Option { let maybe_meta = scrape_meta_tag_via_parsing(html); if let Some(meta) = maybe_meta { @@ -61,7 +61,7 @@ fn scrape_meta_tag_via_parsing(html: &str) -> Option { #[cfg(test)] mod tests { use crate::requests::index_page::get_index_page::{get_index, GetIndexPageArgs}; - use crate::requests::index_page::index_parsers::parse_index_verification_token::parse_verification_token_from_index_html; + use crate::requests::index_page::index_parsers::parse_index_verification_token::parse_index_verification_token; use crate::test_utils::get_test_cookies::get_test_cookies; use errors::AnyhowResult; @@ -73,7 +73,7 @@ mod tests { cookie: &cookie, }).await?; - let result = parse_verification_token_from_index_html(&index.body); + let result = parse_index_verification_token(&index.body); println!("{:?}", result); assert_eq!(1, 2); diff --git a/crates/api_clients/grok_client/src/requests/index_page/utils/find_script_actions_and_xsid.rs b/crates/api_clients/grok_client/src/requests/index_page/utils/find_script_actions_and_xsid_script_path.rs similarity index 91% rename from crates/api_clients/grok_client/src/requests/index_page/utils/find_script_actions_and_xsid.rs rename to crates/api_clients/grok_client/src/requests/index_page/utils/find_script_actions_and_xsid_script_path.rs index 062ad48070..fe8760831f 100644 --- a/crates/api_clients/grok_client/src/requests/index_page/utils/find_script_actions_and_xsid.rs +++ b/crates/api_clients/grok_client/src/requests/index_page/utils/find_script_actions_and_xsid_script_path.rs @@ -23,7 +23,7 @@ pub struct ActionsAndXsid { pub xsid_script_path: String, } -pub fn find_script_actions_and_xsid(scripts: &HashMap) -> Result { +pub fn find_script_actions_and_xsid_script_path(scripts: &HashMap) -> Result { let mut action_script_path = None; let mut script_content_1 = None; let mut script_content_2 = None; @@ -74,7 +74,7 @@ pub fn find_script_actions_and_xsid(scripts: &HashMap) -> Result #[cfg(test)] mod tests { use crate::requests::index_page::get_index_page_and_scripts::{get_index_page_and_scripts, GetIndexPageAndScriptsArgs}; - use crate::requests::index_page::utils::find_script_actions_and_xsid::find_script_actions_and_xsid; + use crate::requests::index_page::utils::find_script_actions_and_xsid_script_path::find_script_actions_and_xsid_script_path; use crate::test_utils::get_test_cookies::get_test_cookies; use errors::AnyhowResult; @@ -87,7 +87,7 @@ mod tests { cookie: &cookie, }).await?; - let result = find_script_actions_and_xsid(&page_and_scripts.scripts)?; + let result = find_script_actions_and_xsid_script_path(&page_and_scripts.scripts)?; println!("{:?}", result); diff --git a/crates/api_clients/grok_client/src/requests/index_page/utils/mod.rs b/crates/api_clients/grok_client/src/requests/index_page/utils/mod.rs index ff7f448a17..031eb147b7 100644 --- a/crates/api_clients/grok_client/src/requests/index_page/utils/mod.rs +++ b/crates/api_clients/grok_client/src/requests/index_page/utils/mod.rs @@ -1,3 +1,3 @@ -pub mod find_script_actions_and_xsid; +pub mod find_script_actions_and_xsid_script_path; pub mod parse_numbers_from_xsid_script; pub mod verification_token_to_loading_anim; diff --git a/crates/api_clients/grok_client/src/requests/index_page/utils/verification_token_to_loading_anim.rs b/crates/api_clients/grok_client/src/requests/index_page/utils/verification_token_to_loading_anim.rs index d75528fbf3..42caf68cfd 100644 --- a/crates/api_clients/grok_client/src/requests/index_page/utils/verification_token_to_loading_anim.rs +++ b/crates/api_clients/grok_client/src/requests/index_page/utils/verification_token_to_loading_anim.rs @@ -1,4 +1,5 @@ use crate::error::grok_client_error::GrokClientError; +use crate::requests::index_page::index_parsers::parse_index_verification_token::VerificationToken; use base64::prelude::BASE64_STANDARD; use base64::Engine; use log::error; @@ -12,21 +13,23 @@ impl LoadingAnim { } } +/// This arbitrary algorithm is used by Grok. +/// See https://github.com/realasfngl/Grok-Api /// The verification token comes from the index HTML. -pub fn verification_token_to_loading_anim(verification_token: &str) -> Result { - let decoded_bytes = BASE64_STANDARD.decode(verification_token) +pub fn verification_token_to_loading_anim(verification_token: &VerificationToken) -> Result { + // array: list = list(b64decode(verification_token)) -- note: we don't need to convert to a list + let decoded_bytes = BASE64_STANDARD.decode(&verification_token.0) .map_err(|err| { - error!("Failed to decode verification token: {} ; err = {:?}", verification_token, err); + error!("Failed to decode verification token: {} ; err = {:?}", verification_token.0, err); GrokClientError::FailedToDecodeVerificationToken(err) })?; - // This arbitrary algorithm is used by Grok. - // See https://github.com/realasfngl/Grok-Api - + // anim: str = "loading-x-anim-" + str(array[5] % 4) let byte = decoded_bytes.get(5) .map(|byte| *byte) .ok_or(GrokClientError::InvalidVerificationTokenBytes)?; + // note, we'll put the string construction in the `to_id()` method since we need the raw integer again let anim = (byte % 4) as usize; Ok(LoadingAnim(anim)) @@ -37,6 +40,7 @@ mod tests { use crate::error::grok_client_error::GrokClientError; use crate::requests::index_page::utils::verification_token_to_loading_anim::verification_token_to_loading_anim; use errors::AnyhowResult; + use crate::requests::index_page::index_parsers::parse_index_verification_token::VerificationToken; #[test] fn test() -> AnyhowResult<()> { @@ -47,7 +51,8 @@ mod tests { } fn to_id(verification_token: &str) -> Result { - let anim = verification_token_to_loading_anim(verification_token)?; + let verification_token = VerificationToken(verification_token.to_string()); + let anim = verification_token_to_loading_anim(&verification_token)?; Ok(anim.to_id()) } }