| """Grok 请求头管理 - 生成动态请求头和Statsig ID""" |
|
|
| import base64 |
| import random |
| import string |
| import uuid |
| from typing import Dict |
|
|
| from app.core.logger import logger |
| from app.core.config import setting |
|
|
|
|
| |
| BASE_HEADERS = { |
| "Accept": "*/*", |
| "Accept-Language": "zh-CN,zh;q=0.9", |
| "Accept-Encoding": "gzip, deflate, br, zstd", |
| "Connection": "keep-alive", |
| "Origin": "https://grok.com", |
| "Priority": "u=1, i", |
| "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/133.0.0.0 Safari/537.36", |
| "Sec-Ch-Ua": '"Not(A:Brand";v="99", "Google Chrome";v="133", "Chromium";v="133"', |
| "Sec-Ch-Ua-Mobile": "?0", |
| "Sec-Ch-Ua-Platform": '"macOS"', |
| "Sec-Fetch-Dest": "empty", |
| "Sec-Fetch-Mode": "cors", |
| "Sec-Fetch-Site": "same-origin", |
| "Baggage": "sentry-environment=production,sentry-public_key=b311e0f2690c81f25e2c4cf6d4f7ce1c", |
| } |
|
|
|
|
| def _random_string(length: int, letters_only: bool = True) -> str: |
| """生成随机字符串""" |
| chars = string.ascii_lowercase if letters_only else string.ascii_lowercase + string.digits |
| return ''.join(random.choices(chars, k=length)) |
|
|
|
|
| def _generate_statsig_id() -> str: |
| """生成x-statsig-id |
| |
| 随机选择两种格式: |
| 1. e:TypeError: Cannot read properties of null (reading 'children['xxxxx']') |
| 2. e:TypeError: Cannot read properties of undefined (reading 'xxxxxxxxxx') |
| """ |
| if random.choice([True, False]): |
| rand = _random_string(5, letters_only=False) |
| msg = f"e:TypeError: Cannot read properties of null (reading 'children['{rand}']')" |
| else: |
| rand = _random_string(10) |
| msg = f"e:TypeError: Cannot read properties of undefined (reading '{rand}')" |
| |
| return base64.b64encode(msg.encode()).decode() |
|
|
|
|
| def get_dynamic_headers(pathname: str = "/rest/app-chat/conversations/new") -> Dict[str, str]: |
| """获取请求头 |
| |
| Args: |
| pathname: 请求路径 |
| |
| Returns: |
| 完整的请求头字典 |
| """ |
| |
| if setting.grok_config.get("dynamic_statsig", False): |
| statsig_id = _generate_statsig_id() |
| logger.debug(f"[Statsig] 动态生成: {statsig_id}") |
| else: |
| statsig_id = setting.grok_config.get("x_statsig_id") |
| if not statsig_id: |
| raise ValueError("配置文件中未设置 x_statsig_id") |
| logger.debug(f"[Statsig] 使用固定值: {statsig_id}") |
|
|
| |
| headers = BASE_HEADERS.copy() |
| headers["x-statsig-id"] = statsig_id |
| headers["x-xai-request-id"] = str(uuid.uuid4()) |
| headers["Content-Type"] = "text/plain;charset=UTF-8" if "upload-file" in pathname else "application/json" |
|
|
| return headers |