grok2api / app /services /grok /statsig.py
JXJBing's picture
Upload 45 files
1a9e2c2 verified
"""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:
完整的请求头字典
"""
# 获取或生成statsig-id
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