From df2c2b781f7f284cbd4cdc9b46883648136cbf78 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 24 Oct 2025 10:48:01 -0400 Subject: [PATCH] requests, a few x crypto libraries from github --- .../crypto_signature/xStatsigIDGenerator.py | 515 ++++++++++++++++++ .../metadata/crypto_signature/xctid.py | 193 +++++++ .../more_requests/video_1_from_upload.txt | 23 + .../video_2_from_upload_and_prompt.txt | 23 + .../video_3_from_upload_and_prompt.txt | 0 5 files changed, 754 insertions(+) create mode 100644 crates/api_clients/grok_client/src/credentials/metadata/crypto_signature/xStatsigIDGenerator.py create mode 100755 crates/api_clients/grok_client/src/credentials/metadata/crypto_signature/xctid.py create mode 100644 crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_1_from_upload.txt create mode 100644 crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_2_from_upload_and_prompt.txt create mode 100644 crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_3_from_upload_and_prompt.txt diff --git a/crates/api_clients/grok_client/src/credentials/metadata/crypto_signature/xStatsigIDGenerator.py b/crates/api_clients/grok_client/src/credentials/metadata/crypto_signature/xStatsigIDGenerator.py new file mode 100644 index 0000000000..3f4e49bd02 --- /dev/null +++ b/crates/api_clients/grok_client/src/credentials/metadata/crypto_signature/xStatsigIDGenerator.py @@ -0,0 +1,515 @@ +#!/usr/bin/env python3 +# From https://github.com/kbtit25/grok2api/blob/73c917b15438e12699531ccf9411d3a7d1110cbf/xStatsigIDGenerator.py +# -*- coding: utf-8 -*- + +import base64 +import struct +import hashlib +import time +import secrets +import requests +import re +import json +from typing import Optional, Dict, Any + +class XStatsigIDGenerator: + """x-statsig-id 生成器""" + + def __init__(self): + self.base_timestamp = int(time.time()) # 使用当前系统时间 + self.grok_url = "https://grok.com" + + def get_grok_meta_content(self) -> bytes: + """ + 从 grok.com 获取 meta 标签中的 grok-site-verification 内容 + 使用多种方法彻底解决403问题 + + Returns: + 48字节的meta内容 + """ + print("🌐 正在请求 grok.com...") + + # 定义多种绕过策略 + strategies = [ + self._try_curl_with_proxy, + self._try_curl_with_different_ua, + self._try_requests_with_session, + self._try_curl_cffi_advanced, + self._try_alternative_endpoints, + self._try_cached_content + ] + + for i, strategy in enumerate(strategies): + try: + print(f" 尝试策略 {i+1}: {strategy.__name__}") + result = strategy() + if result: + return result + except Exception as e: + print(f" 策略 {i+1} 失败: {e}") + continue + + # 所有策略都失败,使用备用内容 + print(" ❌ 所有策略都失败,使用备用meta内容") + fallback = b"backup-grok-meta-content-when-request-fails-ok" + return fallback + b'\x00' * (48 - len(fallback)) + + def _try_curl_with_proxy(self) -> bytes: + """策略1: 使用curl + 代理""" + import subprocess + + # 尝试多个公共代理 + proxies = [ + None, # 无代理 + "socks5://127.0.0.1:1080", # 本地代理 + "http://127.0.0.1:8080", # 本地HTTP代理 + ] + + for proxy in proxies: + try: + curl_command = [ + 'curl', '-s', '-L', '--max-time', '15', + '--user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + '--header', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + '--header', 'Accept-Language: en-US,en;q=0.5', + '--header', 'Accept-Encoding: gzip, deflate', + '--header', 'Connection: keep-alive', + '--header', 'Upgrade-Insecure-Requests: 1', + '--compressed' + ] + + if proxy: + curl_command.extend(['--proxy', proxy]) + + curl_command.append(self.grok_url) + + result = subprocess.run(curl_command, capture_output=True, text=True, timeout=15) + + if result.returncode == 0 and len(result.stdout) > 1000: + print(f" ✅ curl成功 (代理: {proxy or '无'})") + return self._extract_meta_from_html(result.stdout) + + except Exception: + continue + + return None + + def _try_curl_with_different_ua(self) -> bytes: + """策略2: 使用不同的User-Agent""" + import subprocess + + user_agents = [ + 'Mozilla/5.0 (iPhone; CPU iPhone OS 17_0 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Mobile/15E148 Safari/604.1', + 'Mozilla/5.0 (Android 13; Mobile; rv:109.0) Gecko/109.0 Firefox/119.0', + 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.1 Safari/605.1.15' + ] + + for ua in user_agents: + try: + curl_command = [ + 'curl', '-s', '-L', '--max-time', '10', + '--user-agent', ua, + '--header', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + '--header', 'Accept-Language: en-US,en;q=0.9', + '--header', 'Cache-Control: no-cache', + '--header', 'Pragma: no-cache', + '--compressed', + self.grok_url + ] + + result = subprocess.run(curl_command, capture_output=True, text=True, timeout=10) + + if result.returncode == 0 and len(result.stdout) > 1000: + print(f" ✅ 不同UA成功") + return self._extract_meta_from_html(result.stdout) + + except Exception: + continue + + return None + + def _try_requests_with_session(self) -> bytes: + """策略3: 使用requests session模拟真实浏览器行为""" + import requests + from requests.adapters import HTTPAdapter + from urllib3.util.retry import Retry + + session = requests.Session() + + # 配置重试策略 + retry_strategy = Retry( + total=3, + backoff_factor=1, + status_forcelist=[429, 500, 502, 503, 504], + ) + adapter = HTTPAdapter(max_retries=retry_strategy) + session.mount("http://", adapter) + session.mount("https://", adapter) + + # 模拟真实浏览器行为 + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36', + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.9', + 'Accept-Encoding': 'gzip, deflate, br', + 'DNT': '1', + 'Connection': 'keep-alive', + 'Upgrade-Insecure-Requests': '1', + 'Sec-Fetch-Dest': 'document', + 'Sec-Fetch-Mode': 'navigate', + 'Sec-Fetch-Site': 'none', + 'Sec-Fetch-User': '?1', + 'Cache-Control': 'max-age=0' + } + + try: + # 先访问主页建立session + session.get('https://x.com', headers=headers, timeout=5) + + # 再访问grok + response = session.get(self.grok_url, headers=headers, timeout=10) + + if response.status_code == 200 and len(response.text) > 1000: + print(f" ✅ session请求成功") + return self._extract_meta_from_html(response.text) + + except Exception: + pass + + return None + + def _try_curl_cffi_advanced(self) -> bytes: + """策略4: 使用curl_cffi高级模拟""" + try: + from curl_cffi import requests as curl_requests + + # 尝试不同的浏览器模拟 + impersonations = ['chrome120', 'chrome119', 'safari17', 'firefox119'] + + for imp in impersonations: + try: + response = curl_requests.get( + self.grok_url, + impersonate=imp, + timeout=10, + headers={ + 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + 'Accept-Language': 'en-US,en;q=0.9', + 'Cache-Control': 'no-cache' + } + ) + + if response.status_code == 200 and len(response.text) > 1000: + print(f" ✅ curl_cffi成功 ({imp})") + return self._extract_meta_from_html(response.text) + + except Exception: + continue + + except ImportError: + pass + + return None + + def _try_alternative_endpoints(self) -> bytes: + """策略5: 尝试替代端点""" + import subprocess + + # 尝试不同的URL路径 + alternative_urls = [ + 'https://grok.com/', + 'https://grok.com/login', + 'https://grok.com/home', + 'https://x.com/i/grok' + ] + + for url in alternative_urls: + try: + curl_command = [ + 'curl', '-s', '-L', '--max-time', '8', + '--user-agent', 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36', + '--header', 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', + '--compressed', + url + ] + + result = subprocess.run(curl_command, capture_output=True, text=True, timeout=8) + + if result.returncode == 0 and len(result.stdout) > 500: + print(f" ✅ 替代端点成功: {url}") + meta_result = self._extract_meta_from_html(result.stdout) + if meta_result: + return meta_result + + except Exception: + continue + + return None + + def _try_cached_content(self) -> bytes: + """策略6: 使用缓存或预设内容""" + # 如果有真实的grok meta内容,可以在这里硬编码 + known_meta_contents = [ + "grok-site-verification-content-2024-production-v1", + "x-grok-verification-meta-content-stable-release", + "grok-meta-verification-string-for-api-access" + ] + + for content in known_meta_contents: + try: + meta_bytes = content.encode('utf-8') + if len(meta_bytes) < 48: + meta_bytes = meta_bytes + b'\x00' * (48 - len(meta_bytes)) + elif len(meta_bytes) > 48: + meta_bytes = meta_bytes[:48] + + print(f" ✅ 使用预设内容: {content[:30]}...") + return meta_bytes + + except Exception: + continue + + return None + + def _extract_meta_from_html(self, html_content: str) -> bytes: + """从HTML中提取meta内容""" + patterns = [ + r' 48: + meta_bytes = meta_bytes[:48] + + return meta_bytes + + # 如果没找到特定的meta标签,尝试从HTML中提取其他有用信息 + if 'grok' in html_content.lower() and len(html_content) > 1000: + # 使用HTML内容的哈希作为meta内容 + import hashlib + content_hash = hashlib.sha256(html_content.encode()).hexdigest()[:48] + meta_bytes = content_hash.encode('utf-8') + if len(meta_bytes) < 48: + meta_bytes = meta_bytes + b'\x00' * (48 - len(meta_bytes)) + + print(f" ✅ 使用内容哈希作为meta: {content_hash[:32]}...") + return meta_bytes + + return None + + def generate_browser_fingerprint(self) -> str: + """ + 生成浏览器指纹信息 (结合方法1和方法3) + + Returns: + 指纹字符串 + """ + print("🔍 生成浏览器指纹...") + + # 模拟浏览器指纹信息 + fingerprint_data = { + "userAgent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36", + "language": "en", + "languages": ["en", "zh", "zh-TW", "zh-CN"], + "platform": "MacIntel", + "cookieEnabled": True, + "doNotTrack": None, + "screenWidth": 450, + "screenHeight": 654, + "screenColorDepth": 24, + "screenPixelDepth": 24, + "screenAvailWidth": 450, + "screenAvailHeight": 654, + "innerWidth": 450, + "innerHeight": 654, + "outerWidth": 1920, + "outerHeight": 1055, + "timezone": "Asia/Shanghai", + "timezoneOffset": -480, + "hardwareConcurrency": 14, + "deviceMemory": 8, + "maxTouchPoints": 0 + } + + # 方法3: 生成指纹哈希 + fingerprint_string = json.dumps(fingerprint_data, sort_keys=True, separators=(',', ':')) + fingerprint_hash = hashlib.sha256(fingerprint_string.encode('utf-8')).hexdigest() + + print(f" 指纹数据长度: {len(fingerprint_string)} 字符") + print(f" 指纹哈希: {fingerprint_hash[:32]}...") + + return fingerprint_hash + + def generate_x_statsig_id(self, method: str = "GET", pathname: str = "/") -> str: + """ + 生成完整的 x-statsig-id + + Args: + method: 请求方式 (GET/POST) + pathname: 请求路径 + + Returns: + 生成的 x-statsig-id 字符串 + """ + print("=" * 60) + print("🚀 开始生成 x-statsig-id") + print("=" * 60) + + print(f"📋 生成参数:") + print(f" Method: {method}") + print(f" Pathname: {pathname}") + + # 1. 获取 grok.com 的 meta content + meta_content = self.get_grok_meta_content() + + # 2. 生成浏览器指纹 + fingerprint = self.generate_browser_fingerprint() + + # 3. 生成当前时间戳 + current_timestamp = int(time.time()) + relative_timestamp = current_timestamp - self.base_timestamp + + print(f"⏰ 时间信息:") + print(f" 当前时间戳: {current_timestamp}") + print(f" 基准时间戳: {self.base_timestamp}") + print(f" 相对时间戳: {relative_timestamp}") + + # 4. 生成时间戳字节 (小端序) + timestamp_bytes = struct.pack(' bool: + """ + 验证生成的ID结构是否正确 + + Args: + statsig_id: 要验证的ID + + Returns: + 验证是否通过 + """ + print("\n" + "=" * 60) + print("🔍 验证生成的ID结构") + print("=" * 60) + + try: + # Base64解码 + decoded_bytes = base64.b64decode(statsig_id) + print(f"✅ Base64解码成功,长度: {len(decoded_bytes)} 字节") + + # 提取异或key + xor_key = decoded_bytes[0] + print(f"✅ 异或key: 0x{xor_key:02x} ({xor_key})") + + # 异或解密 + decrypted = bytearray() + for i in range(1, len(decoded_bytes)): + decrypted.append(decoded_bytes[i] ^ xor_key) + + print(f"✅ 解密后长度: {len(decrypted)} 字节") + + # 验证数据结构 + expected_length = 48 + 4 + 16 + 1 # meta + timestamp + sha256 + fixed + if len(decrypted) == expected_length: + print(f"✅ 数据长度正确: {len(decrypted)}/{expected_length}") + else: + print(f"❌ 数据长度错误: {len(decrypted)}/{expected_length}") + return False + + # 检查固定值 + fixed_val = decrypted[-1] + if fixed_val == 3: + print(f"✅ 固定值正确: {fixed_val}") + else: + print(f"❌ 固定值错误: {fixed_val} (期望: 3)") + return False + + # 解析时间戳 + timestamp_bytes = decrypted[48:52] + timestamp = struct.unpack(' float: + def bezier(u: float): + omu = 1.0 - u + b1 = 3.0 * omu * omu * u + b2 = 3.0 * omu * u * u + b3 = u * u * u + x = b1 * x1 + b2 * x2 + b3 + y = b1 * y1 + b2 * y2 + b3 + return x, y + + lo, hi = 0.0, 1.0 + for _ in range(80): + mid = 0.5 * (lo + hi) + if bezier(mid)[0] < t: + lo = mid + else: + hi = mid + u = 0.5 * (lo + hi) + return bezier(u)[1] + + @staticmethod + def xa(svg: str) -> List[List[int]]: + s = (svg) + substr = s[9:] + parts = substr.split("C") + out = [] + for part in parts: + cleaned = sub(r"[^\d]+", " ", part).strip() + if cleaned == "": + nums = [0] + else: + nums = [int(tok) for tok in cleaned.split() if tok != ""] + out.append(nums) + return out + + @staticmethod + def tohex(num: float) -> str: + rounded = round(float(num), 2) + if rounded == 0.0: + return "0" + sign = "-" if copysign(1.0, rounded) < 0 else "" + absval = abs(rounded) + intpart = int(floor(absval)) + frac = absval - intpart + if frac == 0.0: + return sign + format(intpart, "x") + frac_digits = [] + f = frac + for _ in range(20): + f *= 16 + digit = int(floor(f + 1e-12)) + frac_digits.append(format(digit, "x")) + f -= digit + if abs(f) < 1e-12: + break + frac_str = "".join(frac_digits).rstrip("0") + if frac_str == "": + return sign + format(intpart, "x") + return sign + format(intpart, "x") + "." + frac_str + + @staticmethod + def simulateStyle(values: List[int], c: int) -> Dict[str,str]: + duration = 4096 + currentTime = round(c / 10.0) * 10 + t = currentTime / duration + + cp = [Signature._h(v, -1 if (i % 2) else 0, 1, False) for i, v in enumerate(values[7:])] + + easedY = Signature.cubicBezierEased(t, cp[0], cp[1], cp[2], cp[3]) + + start = [float(x) for x in values[0:3]] + end = [float(x) for x in values[3:6]] + r = round(start[0] + (end[0] - start[0]) * easedY) + g = round(start[1] + (end[1] - start[1]) * easedY) + b = round(start[2] + (end[2] - start[2]) * easedY) + color = f"rgb({r}, {g}, {b})" + + endAngle = Signature._h(values[6], 60, 360, True) + angle = endAngle * easedY + rad = angle * pi / 180.0 + + def is_effectively_zero(val: float) -> bool: + return abs(val) < 1e-7 + + def is_effectively_integer(val: float) -> bool: + return abs(val - round(val)) < 1e-7 + + cosv = cos(rad) + sinv = sin(rad) + + if is_effectively_zero(cosv): + a = 0 + d = 0 + else: + if is_effectively_integer(cosv): + a = int(round(cosv)) + d = int(round(cosv)) + else: + a = f"{cosv:.6f}" + d = f"{cosv:.6f}" + + if is_effectively_zero(sinv): + bval = 0 + cval = 0 + else: + if is_effectively_integer(sinv): + bval = int(round(sinv)) + cval = int(round(-sinv)) + else: + bval = f"{sinv:.7f}" + cval = f"{(-sinv):.7f}" + + transform = f"matrix({a}, {bval}, {cval}, {d}, 0, 0)" + return {"color": color, "transform": transform} + + @staticmethod + def xs(x_bytes: bytes, svg: str, x_values: list) -> str: + arr = list(x_bytes) + idx = arr[x_values[0]] % 16 + c = ((arr[x_values[1]] % 16) * (arr[x_values[2]] % 16)) * (arr[x_values[3]] % 16) + o = Signature.xa(svg) + vals = o[idx] + k = Signature.simulateStyle(vals, c) + + concat = str(k["color"]) + str(k["transform"]) + matches = findall(r"[\d\.\-]+", concat) + converted = [] + for m in matches: + num = float(m) + hexstr = Signature.tohex(num) + converted.append(hexstr) + joined = "".join(converted) + cleaned = joined.replace(".", "").replace("-", "") + return cleaned + + @staticmethod + def generate_sign(path: str, method: str, verification: str, svg: str, x_values: list, time_n: int = None, random_float: float = None) -> str: + + n = int(time() - 1682924400) if not time_n else time_n + t = pack(' 0: + first = arr[0] + for i in range(1, len(arr)): + arr[i] = arr[i] ^ first + + return b64encode(bytes(arr)).decode('ascii').replace('=', '') + + +def main(): + sig = Signature.generate_sign('/rest/app-chat/conversations/new', 'POST', self.verification_token, self.svg_data, self.numbers) + print('Signature', sig) + pass + +if __name__ == 'main': + main() diff --git a/crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_1_from_upload.txt b/crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_1_from_upload.txt new file mode 100644 index 0000000000..6b4a8ddccd --- /dev/null +++ b/crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_1_from_upload.txt @@ -0,0 +1,23 @@ +curl 'https://grok.com/rest/app-chat/conversations/new' \ + -H 'accept: */*' \ + -H 'accept-language: en-US,en;q=0.9' \ + -H 'baggage: sentry-environment=production,sentry-public_key=b311e0f2690c81f25e2c4cf6d4f7ce1c,sentry-trace_id=a70178dd605614c0d7d802211bb98d58,sentry-org_id=4508179396558848,sentry-sampled=false,sentry-sample_rand=0.6923031198588183,sentry-sample_rate=0' \ + -H 'cache-control: no-cache' \ + -H 'content-type: application/json' \ + -b '_ga=GA1.1.1232202746.1760710013; i18nextLng=en; sso=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOGU3MDFiNzctOTdkNC00ZjM0LWExOTctOWFmMDU1MzY3NDAwIn0.-a6x0InxbGzfTVfUlrdzxskxCnvMDI8lC90z4wHeGIk; sso-rw=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOGU3MDFiNzctOTdkNC00ZjM0LWExOTctOWFmMDU1MzY3NDAwIn0.-a6x0InxbGzfTVfUlrdzxskxCnvMDI8lC90z4wHeGIk; stblid=b3331fc1-45d7-466b-83df-67427c0b2367; cf_clearance=r8Af0A6SdygBrS_n_CoVmSdnYlDuZYCbuQ7ctUUnzH0-1761153368-1.2.1.1-0OFIiAijcxNPep6Hsj0zGk3OElsfpd66VUxZ0_3kGokIi0VB6QRnwagSG1BVJwlguWf7ij19dieSYMgMML_SwgijuN0GYN3PPGHR0HBzOwBmHhMPs1Z05GS621E9Q3hKkiM7BdeRzFs2ZpTnRVJUEV0OfuNeOvsH0K_GAxQ05LBz4EuQL7_EujHDFNB_KHpC.hg7Z2mMqRKN2JThEv8KmrjIWq9MiJ7uJq2EkkzTdu0; 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.s1761152442$o14$g1$t1761154051$j49$l0$h0' \ + -H 'origin: https://grok.com' \ + -H 'pragma: no-cache' \ + -H 'priority: u=1, i' \ + -H 'referer: https://grok.com/imagine/post/5088adf9-85fd-4f51-a514-005aae2e1027' \ + -H 'sec-ch-ua: "Google Chrome";v="141", "Not?A_Brand";v="8", "Chromium";v="141"' \ + -H 'sec-ch-ua-mobile: ?0' \ + -H 'sec-ch-ua-platform: "macOS"' \ + -H 'sec-fetch-dest: empty' \ + -H 'sec-fetch-mode: cors' \ + -H 'sec-fetch-site: same-origin' \ + -H 'sentry-trace: a70178dd605614c0d7d802211bb98d58-9b67b382ef8b611d-0' \ + -H 'traceparent: 00-1e9cf7a2c56a1f16783b613191e7a1a9-e2c806c705dd0856-00' \ + -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36' \ + -H 'x-statsig-id: JWnSxWdSIehXqgWnPtVBmedI/AeX2F7u0mrBWtlqQYItKm6hn0T2jo3+FgysEfOmUrCVjCHzUY/R6BeVN8JyIRKv6Zm8Jg' \ + -H 'x-xai-request-id: d22009f5-bf35-41b4-834f-123aed8c935e' \ + --data-raw '{"temporary":true,"modelName":"grok-3","message":"https://assets.grok.com/users/85980643-ffab-4984-a3de-59a608c47d7f/5088adf9-85fd-4f51-a514-005aae2e1027/content --mode=normal","fileAttachments":["5088adf9-85fd-4f51-a514-005aae2e1027"],"toolOverrides":{"videoGen":true}}' \ No newline at end of file diff --git a/crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_2_from_upload_and_prompt.txt b/crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_2_from_upload_and_prompt.txt new file mode 100644 index 0000000000..ceaf1d1922 --- /dev/null +++ b/crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_2_from_upload_and_prompt.txt @@ -0,0 +1,23 @@ +curl 'https://grok.com/rest/app-chat/conversations/new' \ + -H 'accept: */*' \ + -H 'accept-language: en-US,en;q=0.9' \ + -H 'baggage: sentry-environment=production,sentry-public_key=b311e0f2690c81f25e2c4cf6d4f7ce1c,sentry-trace_id=a70178dd605614c0d7d802211bb98d58,sentry-org_id=4508179396558848,sentry-sampled=false,sentry-sample_rand=0.6923031198588183,sentry-sample_rate=0' \ + -H 'cache-control: no-cache' \ + -H 'content-type: application/json' \ + -b '_ga=GA1.1.1232202746.1760710013; i18nextLng=en; sso=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOGU3MDFiNzctOTdkNC00ZjM0LWExOTctOWFmMDU1MzY3NDAwIn0.-a6x0InxbGzfTVfUlrdzxskxCnvMDI8lC90z4wHeGIk; sso-rw=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOGU3MDFiNzctOTdkNC00ZjM0LWExOTctOWFmMDU1MzY3NDAwIn0.-a6x0InxbGzfTVfUlrdzxskxCnvMDI8lC90z4wHeGIk; stblid=b3331fc1-45d7-466b-83df-67427c0b2367; cf_clearance=r8Af0A6SdygBrS_n_CoVmSdnYlDuZYCbuQ7ctUUnzH0-1761153368-1.2.1.1-0OFIiAijcxNPep6Hsj0zGk3OElsfpd66VUxZ0_3kGokIi0VB6QRnwagSG1BVJwlguWf7ij19dieSYMgMML_SwgijuN0GYN3PPGHR0HBzOwBmHhMPs1Z05GS621E9Q3hKkiM7BdeRzFs2ZpTnRVJUEV0OfuNeOvsH0K_GAxQ05LBz4EuQL7_EujHDFNB_KHpC.hg7Z2mMqRKN2JThEv8KmrjIWq9MiJ7uJq2EkkzTdu0; 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.s1761152442$o14$g1$t1761154054$j46$l0$h0' \ + -H 'origin: https://grok.com' \ + -H 'pragma: no-cache' \ + -H 'priority: u=1, i' \ + -H 'referer: https://grok.com/imagine/post/5088adf9-85fd-4f51-a514-005aae2e1027' \ + -H 'sec-ch-ua: "Google Chrome";v="141", "Not?A_Brand";v="8", "Chromium";v="141"' \ + -H 'sec-ch-ua-mobile: ?0' \ + -H 'sec-ch-ua-platform: "macOS"' \ + -H 'sec-fetch-dest: empty' \ + -H 'sec-fetch-mode: cors' \ + -H 'sec-fetch-site: same-origin' \ + -H 'sentry-trace: a70178dd605614c0d7d802211bb98d58-b7262a86b9e17c69-0' \ + -H 'traceparent: 00-500b380fc103cc5ed0d67c08afcb760f-3468484e94e4b4d3-00' \ + -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/141.0.0.0 Safari/537.36' \ + -H 'x-statsig-id: OXXO2XtOPfRLthm7IsldhftU4BuLxELyznbdRsV2XZ4xNnK9g1jqkpHiChCwDe+6TtmJkD3ZVxtt5raP7qpwux2GVfTCOg' \ + -H 'x-xai-request-id: 7cb93340-5fb6-4fb3-b88d-ff9f5d99d456' \ + --data-raw '{"temporary":true,"modelName":"grok-3","message":"https://assets.grok.com/users/85980643-ffab-4984-a3de-59a608c47d7f/5088adf9-85fd-4f51-a514-005aae2e1027/content --mode=normal","fileAttachments":["5088adf9-85fd-4f51-a514-005aae2e1027"],"toolOverrides":{"videoGen":true}}' \ No newline at end of file diff --git a/crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_3_from_upload_and_prompt.txt b/crates/api_clients/grok_client/src/requests/video_gen_chat_conversation/metadata/more_requests/video_3_from_upload_and_prompt.txt new file mode 100644 index 0000000000..e69de29bb2