This commit is contained in:
Brandon Thomas committed 2025-10-30 14:45:10 -04:00
1 parent 6f16f9f832
commit 9386fbbc86
70 files changed
+58 -79

No files matched your search

@@ -1,10 +1,10 @@
use crate::datatypes::user_email::UserEmail;
use crate::datatypes::user_id::UserId;
use crate::requests::index_page::pieces::baggage::Baggage;
use crate::requests::index_page::pieces::sentry_trace::SentryTrace;
use crate::requests::index_page::pieces::svg_path_data::SvgPathData;
use crate::requests::index_page::pieces::verification_token::VerificationToken;
use crate::requests::index_page::pieces::xsid_numbers::XsidNumbers;
use crate::datatypes::api::baggage::Baggage;
use crate::datatypes::api::sentry_trace::SentryTrace;
use crate::datatypes::api::svg_path_data::SvgPathData;
use crate::datatypes::api::user_email::UserEmail;
use crate::datatypes::api::user_id::UserId;
use crate::datatypes::api::verification_token::VerificationToken;
use crate::datatypes::api::xsid_numbers::XsidNumbers;
#[derive(Clone)]
pub struct GrokClientSecrets {
@@ -29,7 +29,7 @@ pub struct GrokClientSecrets {
/// From index.html
/// Not strictly needed to sign requests, but typically needed to generate URLs.
pub user_id: UserId,
/// From index.html
/// Not needed, but returned alongside other details.
pub user_email: Option<UserEmail>,
@@ -1,7 +1,5 @@
use crate::credentials::grok_client_secrets::GrokClientSecrets;
use crate::credentials::grok_cookies::GrokCookies;
use crate::datatypes::user_email::UserEmail;
use crate::datatypes::user_id::UserId;
/// Includes the cookies and all the magic other bits needed to call the API.
#[derive(Clone)]
@@ -1,5 +1,8 @@
pub mod baggage;
pub mod file_id;
pub mod sentry_trace;
pub mod svg_path_data;
pub mod user_email;
pub mod user_id;
pub mod verification_token;
pub mod xsid_numbers;
pub mod xsid_numbers;
@@ -22,7 +22,7 @@ impl SentryTrace {
#[cfg(test)]
mod tests {
use crate::requests::index_page::pieces::sentry_trace::SentryTrace;
use crate::datatypes::api::sentry_trace::SentryTrace;
#[test]
fn test_real_trace() {
@@ -1,4 +1,2 @@
pub mod file_id;
pub mod api;
pub mod file_upload_spec;
pub mod user_email;
pub mod user_id;
@@ -1,15 +1,8 @@
use crate::credentials::grok_full_credentials::GrokFullCredentials;
use crate::datatypes::file_id::FileId;
use crate::datatypes::file_upload_spec::FileUploadSpec;
use crate::datatypes::user_id::UserId;
use crate::error::grok_error::GrokError;
use crate::error::grok_generic_api_error::GrokGenericApiError;
use crate::requests::create_media_post::grok_create_media_post::{GrokCreateMediaPost, MediaPostType};
use crate::requests::index_page::pieces::baggage::Baggage;
use crate::requests::index_page::pieces::sentry_trace::SentryTrace;
use crate::requests::index_page::pieces::svg_path_data::SvgPathData;
use crate::requests::index_page::pieces::verification_token::VerificationToken;
use crate::requests::index_page::pieces::xsid_numbers::XsidNumbers;
use crate::requests::like_media::grok_like_media::GrokLikeMediaPost;
use crate::requests::upload_file::grok_upload_file::GrokUploadFile;
use crate::requests::video_chat::grok_video_gen_chat_conversation::{GrokVideoGenChatConversationBuilder, VideoMediaPostType};
@@ -1,6 +1,6 @@
use crate::client::browser_user_agents::FIREFOX_143_MAC_USER_AGENT;
use crate::datatypes::file_id::FileId;
use crate::datatypes::user_id::UserId;
use crate::datatypes::api::file_id::FileId;
use crate::datatypes::api::user_id::UserId;
use crate::error::grok_client_error::GrokClientError;
use crate::error::grok_error::GrokError;
use crate::error::grok_generic_api_error::GrokGenericApiError;
@@ -1,7 +0,0 @@
// Logged-in session with cf_clearance cookie:
pub const SESSION_COOKIES_WITH_CF_CLEARANCE : &str = "_ga=GA1.1.1232202746.1760710013; i18nextLng=en; sso=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOGU3MDFiNzctOTdkNC00ZjM0LWExOTctOWFmMDU1MzY3NDAwIn0.-a6x0InxbGzfTVfUlrdzxskxCnvMDI8lC90z4wHeGIk; sso-rw=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOGU3MDFiNzctOTdkNC00ZjM0LWExOTctOWFmMDU1MzY3NDAwIn0.-a6x0InxbGzfTVfUlrdzxskxCnvMDI8lC90z4wHeGIk; stblid=b3331fc1-45d7-466b-83df-67427c0b2367; mp_ea93da913ddb66b6372b89d97b1029ac_mixpanel=%7B%22distinct_id%22%3A%2285980643-ffab-4984-a3de-59a608c47d7f%22%2C%22%24device_id%22%3A%2279ce237a-a0f3-4913-bf4b-519ac8a98263%22%2C%22%24initial_referrer%22%3A%22%24direct%22%2C%22%24initial_referring_domain%22%3A%22%24direct%22%2C%22__mps%22%3A%7B%7D%2C%22__mpso%22%3A%7B%7D%2C%22__mpus%22%3A%7B%7D%2C%22__mpa%22%3A%7B%7D%2C%22__mpu%22%3A%7B%7D%2C%22__mpr%22%3A%5B%5D%2C%22__mpap%22%3A%5B%5D%2C%22%24user_id%22%3A%2285980643-ffab-4984-a3de-59a608c47d7f%22%7D; cf_clearance=e7.LXFbmc.U81rZIqxuBfBe88yuBZMXEP.zwxNkbOxw-1760724394-1.2.1.1-JMHrapBGxcZriUw852.NCqwFRpZJFvoYxq.mV0jDpKCkiHBZwpdv09XJi6eFLJUYJJ6UDZ3c1eAsucVYLdWN.SvA9M6qzujj8nY4ym03PxQlMEd2OmXJogtDDJbPhA5AZEGxA39_6QQlvaBIUBnYPALYrTl9XJN_V4q3n4BXtpoBzrIJURMIn0mW3esUCGv0NukuVQrkrNtMgqT5SUmTGi0idaBYoR_2_wv4P09lsug; _ga_8FEWB057YH=GS2.1.s1760724394$o3$g1$t1760724401$j53$l0$h0";
// Logged-in session without cf_clearance cookie:
pub const SESSION_COOKIES_WITHOUT_CF_CLEARANCE : &str = "_ga=GA1.1.1232202746.1760710013; i18nextLng=en; sso=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOGU3MDFiNzctOTdkNC00ZjM0LWExOTctOWFmMDU1MzY3NDAwIn0.-a6x0InxbGzfTVfUlrdzxskxCnvMDI8lC90z4wHeGIk; sso-rw=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOGU3MDFiNzctOTdkNC00ZjM0LWExOTctOWFmMDU1MzY3NDAwIn0.-a6x0InxbGzfTVfUlrdzxskxCnvMDI8lC90z4wHeGIk; stblid=b3331fc1-45d7-466b-83df-67427c0b2367; mp_ea93da913ddb66b6372b89d97b1029ac_mixpanel=%7B%22distinct_id%22%3A%2285980643-ffab-4984-a3de-59a608c47d7f%22%2C%22%24device_id%22%3A%2279ce237a-a0f3-4913-bf4b-519ac8a98263%22%2C%22%24initial_referrer%22%3A%22%24direct%22%2C%22%24initial_referring_domain%22%3A%22%24direct%22%2C%22__mps%22%3A%7B%7D%2C%22__mpso%22%3A%7B%7D%2C%22__mpus%22%3A%7B%7D%2C%22__mpa%22%3A%7B%7D%2C%22__mpu%22%3A%7B%7D%2C%22__mpr%22%3A%5B%5D%2C%22__mpap%22%3A%5B%5D%2C%22%24user_id%22%3A%2285980643-ffab-4984-a3de-59a608c47d7f%22%7D; _ga_8FEWB057YH=GS2.1.s1760724394$o3$g1$t1760724401$j53$l0$h0";
pub const FIREFOX_IMPERSONATE_COOKIE_WITH_CF_CLEARANCE : &str = "stblid=4c0f7d0f-9768-49cf-94f7-1f59f1adf1f5; x-anon-token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoiNmFhNTFmZmYtMmFlNC00NjU3LTk0ZDItNDFjMWQyMjNlZTUyIiwidGVhbV9pZCI6bnVsbCwiZXhwIjoxNzYwMDQyNDA0LCJpc19hbm9uX3VzZXIiOnRydWV9.ySBr18x0Tht-a3RE-cdtQDbWoyJ1SbB_JrHAnNSFzOM; cf_clearance=qYvZ0CfScz.kWrsB14nlWVFylzzOQA0LTnnMZhlCk8M-1760763505-1.2.1.1-RyM97EWXnZ7vo8iyqmM4pyrVP1OFSPC88v61zhD_hAkFtS37A96cvUNXlvaCiGVk5wjTtSkpXcf9wq8wF7vLahSYBoHZXfCxfgeo8rN9BNDwaMXy1Czvj6rNu.OomL9gqoIUCTB7rixqDvJ0Bf9D5cGY5SQth8bLf0jP3rFwmR5oFQMZEdxiOj3zPWxb49EzRnZp_XXCXpiMSeUCABKbZNHGFRlTGqgsf3L.VLb6fCs; i18nextLng=en; sso=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiM2Y3NDgzMTYtOTkyMC00ZTkzLTk1NzQtOTA3ZGNkYzU4M2M5In0.9ne0Ab4cJiNMmntjQwxIfCrVcY6qmuSYMiNRSph1Y60; sso-rw=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiM2Y3NDgzMTYtOTkyMC00ZTkzLTk1NzQtOTA3ZGNkYzU4M2M5In0.9ne0Ab4cJiNMmntjQwxIfCrVcY6qmuSYMiNRSph1Y60; mp_ea93da913ddb66b6372b89d97b1029ac_mixpanel=%7B%22distinct_id%22%3A%222613c794-fce7-4ade-9b22-6118f977ede8%22%2C%22%24device_id%22%3A%22c3c89bdd-b1ba-4939-9ab4-b03b4dfd1e60%22%2C%22%24initial_referrer%22%3A%22%24direct%22%2C%22%24initial_referring_domain%22%3A%22%24direct%22%2C%22__mps%22%3A%7B%7D%2C%22__mpso%22%3A%7B%7D%2C%22__mpus%22%3A%7B%7D%2C%22__mpa%22%3A%7B%7D%2C%22__mpu%22%3A%7B%7D%2C%22__mpr%22%3A%5B%5D%2C%22__mpap%22%3A%5B%5D%2C%22%24user_id%22%3A%222613c794-fce7-4ade-9b22-6118f977ede8%22%2C%22%24search_engine%22%3A%22google%22%2C%22utm_source%22%3A%22x%22%2C%22utm_campaign%22%3A%22grok_imagine_post%22%7D";
@@ -1,6 +1,4 @@
pub (crate) mod cookies;
pub mod prompt_websocket_image;
pub mod clonable_websocket;
pub mod create_listen_websocket;
pub mod messages;
pub mod messages;
pub mod prompt_websocket_image;
@@ -1,11 +1,10 @@
use crate::datatypes::api::xsid_numbers::XsidNumbers;
use crate::error::grok_error::GrokError;
use crate::requests::index_page::parsers::index::parse_index_on_demand_script::parse_index_on_demand_script;
use crate::requests::index_page::parsers::script::parse_xsid_script_numbers::parse_xsid_script_numbers;
use crate::requests::index_page::pieces::xsid_numbers::XsidNumbers;
use crate::requests::index_page::requests::get_index_page_script_with_client::{get_index_page_script_with_client, GetIndexPageScriptArgs};
use crate::requests::index_page::utils::convert_verification_token_to_loading_anim::LoadingAnim;
use wreq::Client;
// self.svg_data, self.numbers = Parser.parse_values(c_request.text, self.anim, self.xsid_script)
pub struct GetNumbersArgs<'a> {
@@ -4,6 +4,5 @@ pub mod get_index_page_and_scripts;
pub mod get_numbers;
pub mod get_xsid_script;
pub mod parsers;
pub mod pieces;
pub mod signature;
pub mod utils;
@@ -1,7 +1,6 @@
use crate::requests::index_page::pieces::baggage::Baggage;
use once_cell::sync::Lazy;
use scraper::{Html, Selector};
use crate::datatypes::api::baggage::Baggage;
// <meta name="baggage" content="sentry-environment=production,sentry-public_key=b311e0f2690c81f25e2c4cf6d4f7ce1c,sentry-trace_id=fb5c42c8cff6fd39161dd245154ca599,sentry-org_id=4508179396558848,sentry-sampled=false,sentry-sample_rand=0.7208394686924251,sentry-sample_rate=0"/>
static BAGGAGE_SELECTOR : Lazy<Selector> = Lazy::new(|| {
@@ -1,8 +1,8 @@
use crate::requests::index_page::pieces::sentry_trace::SentryTrace;
use crate::datatypes::api::sentry_trace::SentryTrace;
use once_cell::sync::Lazy;
use scraper::{Html, Selector};
// <meta name="baggage" content="sentry-environment=production,sentry-public_key=b311e0f2690c81f25e2c4cf6d4f7ce1c,sentry-trace_id=fb5c42c8cff6fd39161dd245154ca599,sentry-org_id=4508179396558848,sentry-sampled=false,sentry-sample_rand=0.7208394686924251,sentry-sample_rate=0"/>
/// eg. <meta name="baggage" content="sentry-environment=production,sentry-public_key=b311e0f2690c81f25e2c4cf6d4f7ce1c,sentry-trace_id=fb5c42c8cff6fd39161dd245154ca599,sentry-org_id=4508179396558848,sentry-sampled=false,sentry-sample_rand=0.7208394686924251,sentry-sample_rate=0"/>
static SENTRY_TRACE_SELECTOR : Lazy<Selector> = Lazy::new(|| {
Selector::parse("meta[name=sentry-trace]")
.expect("HTML selector should parse")
@@ -1,4 +1,4 @@
use crate::requests::index_page::pieces::svg_path_data::SvgPathData;
use crate::datatypes::api::svg_path_data::SvgPathData;
use once_cell::sync::Lazy;
use scraper::{Html, Selector};
@@ -1,4 +1,4 @@
use crate::datatypes::user_email::UserEmail;
use crate::datatypes::api::user_email::UserEmail;
use once_cell::sync::Lazy;
use regex::Regex;
@@ -1,4 +1,4 @@
use crate::datatypes::user_id::UserId;
use crate::datatypes::api::user_id::UserId;
use once_cell::sync::Lazy;
use regex::Regex;
@@ -1,4 +1,4 @@
use crate::requests::index_page::pieces::verification_token::VerificationToken;
use crate::datatypes::api::verification_token::VerificationToken;
use once_cell::sync::Lazy;
use regex::Regex;
use scraper::{Html, Selector};
@@ -1,4 +1,4 @@
use crate::requests::index_page::pieces::xsid_numbers::XsidNumbers;
use crate::datatypes::api::xsid_numbers::XsidNumbers;
use log::error;
use once_cell::sync::Lazy;
use regex::Regex;
@@ -1,7 +1,7 @@
use crate::datatypes::api::svg_path_data::SvgPathData;
use crate::datatypes::api::verification_token::VerificationToken;
use crate::datatypes::api::xsid_numbers::XsidNumbers;
use crate::error::grok_client_error::GrokClientError;
use crate::requests::index_page::pieces::svg_path_data::SvgPathData;
use crate::requests::index_page::pieces::verification_token::VerificationToken;
use crate::requests::index_page::pieces::xsid_numbers::XsidNumbers;
use crate::requests::index_page::signature::signature_xs::signature_xs;
use base64::prelude::BASE64_STANDARD;
use base64::Engine;
@@ -160,9 +160,9 @@ pub fn generate_xsid_with_timestamp(timestamp: u32, args: GenerateXsidArgs<'_>)
#[cfg(test)]
mod tests {
use crate::requests::index_page::pieces::svg_path_data::SvgPathData;
use crate::requests::index_page::pieces::verification_token::VerificationToken;
use crate::requests::index_page::pieces::xsid_numbers::XsidNumbers;
use crate::datatypes::api::svg_path_data::SvgPathData;
use crate::datatypes::api::verification_token::VerificationToken;
use crate::datatypes::api::xsid_numbers::XsidNumbers;
use crate::requests::index_page::signature::generate_xsid::{generate_xsid_with_timestamp, GenerateXsidArgs};
use errors::AnyhowResult;
@@ -1,5 +1,5 @@
use crate::datatypes::api::verification_token::VerificationToken;
use crate::error::grok_client_error::GrokClientError;
use crate::requests::index_page::pieces::verification_token::VerificationToken;
use base64::prelude::BASE64_STANDARD;
use base64::Engine;
use log::error;
@@ -37,8 +37,8 @@ pub fn convert_verification_token_to_loading_anim(verification_token: &Verificat
#[cfg(test)]
mod tests {
use crate::datatypes::api::verification_token::VerificationToken;
use crate::error::grok_client_error::GrokClientError;
use crate::requests::index_page::pieces::verification_token::VerificationToken;
use crate::requests::index_page::utils::convert_verification_token_to_loading_anim::convert_verification_token_to_loading_anim;
use errors::AnyhowResult;
@@ -1,5 +1,5 @@
use crate::datatypes::api::svg_path_data::SvgPathData;
use crate::error::grok_client_error::GrokClientError;
use crate::requests::index_page::pieces::svg_path_data::SvgPathData;
use crate::requests::index_page::utils::convert_verification_token_to_loading_anim::LoadingAnim;
use log::error;
@@ -1,14 +1,7 @@
use crate::client::browser_user_agents::FIREFOX_143_MAC_USER_AGENT;
use crate::datatypes::file_id::FileId;
use crate::datatypes::user_id::UserId;
use crate::error::grok_client_error::GrokClientError;
use crate::error::grok_error::GrokError;
use crate::error::grok_generic_api_error::GrokGenericApiError;
use crate::requests::index_page::pieces::baggage::Baggage;
use crate::requests::index_page::pieces::sentry_trace::SentryTrace;
use crate::requests::index_page::pieces::svg_path_data::SvgPathData;
use crate::requests::index_page::pieces::verification_token::VerificationToken;
use crate::requests::index_page::pieces::xsid_numbers::XsidNumbers;
use crate::requests::index_page::signature::generate_xsid::{generate_xsid, GenerateXsidArgs};
use crate::requests::like_media::request::LikeMediaWireRequest;
use crate::requests::upload_file::grok_upload_file::{GrokUploadFile, GrokUploadFileResponse};
@@ -19,6 +12,12 @@ use uuid::Uuid;
use wreq::header::{ACCEPT, ACCEPT_ENCODING, ACCEPT_LANGUAGE, CACHE_CONTROL, CONNECTION, CONTENT_TYPE, COOKIE, ORIGIN, PRAGMA, REFERER, TE, USER_AGENT};
use wreq::Client;
use wreq_util::Emulation;
use crate::datatypes::api::baggage::Baggage;
use crate::datatypes::api::file_id::FileId;
use crate::datatypes::api::sentry_trace::SentryTrace;
use crate::datatypes::api::svg_path_data::SvgPathData;
use crate::datatypes::api::verification_token::VerificationToken;
use crate::datatypes::api::xsid_numbers::XsidNumbers;
const LIKE_MEDIA_POST_URL: &str = "https://grok.com/rest/media/post/like";
@@ -1,5 +1,5 @@
use crate::client::browser_user_agents::FIREFOX_143_MAC_USER_AGENT;
use crate::datatypes::file_id::FileId;
use crate::datatypes::api::file_id::FileId;
use crate::datatypes::file_upload_spec::FileUploadSpec;
use crate::error::grok_client_error::GrokClientError;
use crate::error::grok_error::GrokError;
@@ -1,14 +1,14 @@
use crate::client::browser_user_agents::FIREFOX_143_MAC_USER_AGENT;
use crate::datatypes::file_id::FileId;
use crate::datatypes::user_id::UserId;
use crate::datatypes::api::baggage::Baggage;
use crate::datatypes::api::file_id::FileId;
use crate::datatypes::api::sentry_trace::SentryTrace;
use crate::datatypes::api::svg_path_data::SvgPathData;
use crate::datatypes::api::user_id::UserId;
use crate::datatypes::api::verification_token::VerificationToken;
use crate::datatypes::api::xsid_numbers::XsidNumbers;
use crate::error::grok_client_error::GrokClientError;
use crate::error::grok_error::GrokError;
use crate::error::grok_generic_api_error::GrokGenericApiError;
use crate::requests::index_page::pieces::baggage::Baggage;
use crate::requests::index_page::pieces::sentry_trace::SentryTrace;
use crate::requests::index_page::pieces::svg_path_data::SvgPathData;
use crate::requests::index_page::pieces::verification_token::VerificationToken;
use crate::requests::index_page::pieces::xsid_numbers::XsidNumbers;
use crate::requests::index_page::signature::generate_xsid::{generate_xsid, GenerateXsidArgs};
use crate::requests::upload_file::grok_upload_file::{GrokUploadFile, GrokUploadFileResponse};
use crate::requests::video_chat::request::{CreateChatConversationWireRequest, ModelConfigOverride, ModelMap, ResponseMetadata, ToolOverrides, VideoGenModelConfig};
@@ -1,5 +1,5 @@
use crate::datatypes::file_id::FileId;
use crate::datatypes::user_id::UserId;
use crate::datatypes::api::file_id::FileId;
use crate::datatypes::api::user_id::UserId;
/// Return media URLs to images given the user and file IDs.
/// These are non-public and will return 403s unless you're logged in.
@@ -11,8 +11,8 @@ pub fn user_and_file_id_to_image_url(user: &UserId, file: &FileId) -> String {
#[cfg(test)]
mod tests {
use crate::datatypes::file_id::FileId;
use crate::datatypes::user_id::UserId;
use crate::datatypes::api::file_id::FileId;
use crate::datatypes::api::user_id::UserId;
use crate::utils::user_and_file_id_to_image_url::user_and_file_id_to_image_url;
#[test]
@@ -1,5 +1,5 @@
use crate::datatypes::file_id::FileId;
use crate::datatypes::user_id::UserId;
use crate::datatypes::api::file_id::FileId;
use crate::datatypes::api::user_id::UserId;
/// Return media URLs to images given the user and file IDs.
/// These are non-public and will return 403s unless you're logged in.
@@ -15,8 +15,8 @@ pub fn user_and_file_id_to_video_url(user: &UserId, file: &FileId, cache_bust: b
#[cfg(test)]
mod tests {
use crate::datatypes::file_id::FileId;
use crate::datatypes::user_id::UserId;
use crate::datatypes::api::file_id::FileId;
use crate::datatypes::api::user_id::UserId;
use crate::utils::user_and_file_id_to_video_url::user_and_file_id_to_video_url;
#[test]