处理了新增的签名问题。截止 20251007 有效
加上轮询,上下文和转 OpenAI 逻辑就是一个成熟的 2api 项目
对于带历史对话的,参数 t 是最近一次 user content
防止有人不知道还是提一下,token 来自网页 cookie 的 token 值,目前看来是长期有效
import time, hmac, hashlib, requests, uuid, json, base64 token = "" def decode_jwt_payload(token): parts = token.split('.') payload = parts[1] padding = 4 - len(payload) % 4 if padding != 4: payload += '=' * padding decoded = base64.urlsafe_b64decode(payload) return json.loads(decoded) def zs(e, t, timestamp): r = str(timestamp) i = f"{e}|{t}|{r}" n = timestamp // (5 * 60 * 1000) key = "junjie".encode('utf-8') o = hmac.new(key, str(n).encode('utf-8'), hashlib.sha256).hexdigest() signature = hmac.new(o.encode('utf-8'), i.encode('utf-8'), hashlib.sha256).hexdigest() return { "signature": signature, "timestamp": timestamp } def make_request(): payload = decode_jwt_payload(token) user_id = payload['id'] chat_id = str(uuid.uuid4()) timestamp = int(time.time() * 1000) request_id = str(uuid.uuid4()) t = input("Hello, how can I help you ?\n - ") e = f"requestId,{request_id},timestamp,{timestamp},user_id,{user_id}" result = zs(e, t, timestamp) signature = result["signature"] url = "https://chat.z.ai/api/chat/completions" params = { "timestamp": timestamp, "requestId": request_id, "user_id": user_id, "token": token, "current_url": f"https://chat.z.ai/c/{chat_id}", "pathname": f"/c/{chat_id}", "signature_timestamp": timestamp } headers = { "Authorization": f"Bearer {token}", "X-FE-Version": "prod-fe-1.0.95", "X-Signature": signature } payload = { "stream": True, "model": "GLM-4-6-API-V1", "messages": [ {"role": "user", "content": t} ], "params": {}, "features": { "image_generation": False, "web_search": False, "auto_web_search": False, "preview_mode": True, }, "enable_thinking": True, "chat_id": chat_id, "id": str(uuid.uuid4()) } respOnse= requests.post(url, params=params, headers=headers, json=payload, stream=True) response.raise_for_status() for chunk in response.iter_content(chunk_size=8192): if chunk: print(chunk.decode('utf-8'), end='') if __name__ == "__main__": make_request()