commit 33f966ccea1f02a4c4675919cc3f8208a68d9f03 Author: Chaos Date: Sun Jul 12 08:10:44 2026 +0800 Initial commit: grok-register with private config and auth artifacts. Include local config, CPA auth files, account dumps, and temp-mail deploy helpers for the private Gitea repo. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ba952b6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Python runtime / cache +.venv/ +__pycache__/ +*.py[cod] +*.egg-info/ +.pytest_cache/ +.mypy_cache/ + +# Local agent / IDE +.workbuddy/ +.idea/ +.vscode/ +*.swp +.DS_Store diff --git a/_temp_email_deploy/README.md b/_temp_email_deploy/README.md new file mode 100644 index 0000000..737b14a --- /dev/null +++ b/_temp_email_deploy/README.md @@ -0,0 +1,50 @@ +# Temp Mail 部署(cloudflare_temp_email) + +目标域名默认:`zhangyunuo.net` + +| 路径 | 说明 | +|------|------| +| `~/projects/cloudflare_temp_email` | 上游源码 | +| `~/projects/temp-email-deploy/deploy.sh` | 一键部署脚本 | +| `~/projects/temp-email-deploy/secrets.env` | 域名 / Admin 密码 / JWT | + +## 一键部署 + +```bash +# 1) 登录 Cloudflare(交互,浏览器授权) +cd ~/projects/cloudflare_temp_email/worker +pnpm exec wrangler login + +# 或设置 token: +# export CLOUDFLARE_API_TOKEN=你的token + +# 2) 部署 +~/projects/temp-email-deploy/deploy.sh +``` + +## 部署后:Email Routing(必做) + +Cloudflare 面板 → `zhangyunuo.net` → Email → Email Routing: + +1. Enable Email Routing(MX 生效) +2. Catch-all → **Send to a Worker** → `temp-email-zhangyunuo` +3. 会覆盖现有取码 Worker;若要保留取码,改用子域 `mail.zhangyunuo.net` + +## 自测 + +```bash +source ~/projects/temp-email-deploy/secrets.env +BASE=https://temp-email-zhangyunuo..workers.dev + +curl -sS -X POST "$BASE/admin/new_address" \ + -H "content-type: application/json" \ + -H "x-admin-auth: $ADMIN_PASSWORD" \ + -d '{"name":"test1","domain":"zhangyunuo.net","enablePrefix":true}' +``` + +成功返回 `address` + `jwt` 后,给该地址发一封测试信,再: + +```bash +curl -sS "$BASE/api/mails?limit=20&offset=0" \ + -H "Authorization: Bearer " +``` diff --git a/_temp_email_deploy/deploy.sh b/_temp_email_deploy/deploy.sh new file mode 100644 index 0000000..e3c0412 --- /dev/null +++ b/_temp_email_deploy/deploy.sh @@ -0,0 +1,130 @@ +#!/usr/bin/env bash +set -euo pipefail + +ROOT="$(cd "$(dirname "$0")" && pwd)" +REPO="${REPO:-$HOME/projects/cloudflare_temp_email}" +WORKER_DIR="$REPO/worker" + +# shellcheck disable=SC1091 +source "$ROOT/secrets.env" + +DOMAIN="${DOMAIN:-zhangyunuo.net}" +WORKER_NAME="${WORKER_NAME:-temp-email-zhangyunuo}" +D1_NAME="${D1_NAME:-temp-email-zhangyunuo}" +ADMIN_PASSWORD="${ADMIN_PASSWORD:?ADMIN_PASSWORD missing in secrets.env}" +JWT_SECRET="${JWT_SECRET:?JWT_SECRET missing in secrets.env}" + +cd "$WORKER_DIR" +export PATH="$WORKER_DIR/node_modules/.bin:$PATH" + +if ! command -v wrangler >/dev/null 2>&1; then + echo "[!] wrangler 不在 PATH,尝试 pnpm exec" + WR="pnpm exec wrangler" +else + WR="wrangler" +fi + +if [ -z "${CLOUDFLARE_API_TOKEN:-}" ]; then + # no token: require interactive oauth session + if ! $WR whoami 2>/dev/null | grep -qiE 'Account Name|Account ID|email:'; then + echo "[!] 未登录 Cloudflare,且未设置 CLOUDFLARE_API_TOKEN" + echo " 方式 A(交互): cd $WORKER_DIR && pnpm exec wrangler login" + echo " 方式 B(推荐服务器): export CLOUDFLARE_API_TOKEN=你的token" + echo " Token 创建: https://dash.cloudflare.com/profile/api-tokens" + echo " 权限至少: Account.D1 Edit + Account.Workers Scripts Edit + Account.Workers KV Storage Edit(可选)" + exit 1 + fi +else + echo "[*] 使用 CLOUDFLARE_API_TOKEN 部署" +fi + +echo "[*] 创建/查找 D1: $D1_NAME" +CREATE_OUT=$($WR d1 create "$D1_NAME" 2>&1 || true) +echo "$CREATE_OUT" + +DB_ID="" +if echo "$CREATE_OUT" | grep -q "database_id"; then + DB_ID=$(echo "$CREATE_OUT" | sed -n 's/.*database_id *= *"\([^"]*\)".*/\1/p' | head -1) + if [ -z "$DB_ID" ]; then + DB_ID=$(echo "$CREATE_OUT" | sed -n 's/.*database_id = \([a-f0-9-]*\).*/\1/p' | head -1) + fi +fi + +if [ -z "$DB_ID" ]; then + DB_ID=$($WR d1 list --json 2>/dev/null | python3 -c ' +import sys, json +name = sys.argv[1] +data = json.load(sys.stdin) +items = data if isinstance(data, list) else data.get("result", data.get("databases", [])) +print(next((str(x.get("uuid") or x.get("id") or "") for x in items if x.get("name") == name), ""), end="") +' "$D1_NAME" || true) +fi + +if [ -z "$DB_ID" ]; then + echo "[!] 无法解析 database_id,请检查 wrangler 登录权限后重试" + exit 1 +fi +echo "[+] D1 id=$DB_ID" + +python3 - "$DOMAIN" "$WORKER_NAME" "$D1_NAME" "$DB_ID" "$ADMIN_PASSWORD" "$JWT_SECRET" <<'PY' +from pathlib import Path +import sys +domain, name, db_name, db_id, admin, jwt = sys.argv[1:7] +text = f'''name = "{name}" +main = "src/worker.ts" +compatibility_date = "2025-04-01" +compatibility_flags = [ "nodejs_compat" ] +keep_vars = true + +[vars] +PREFIX = "" +ADMIN_PASSWORDS = ["{admin}"] +DEFAULT_DOMAINS = ["{domain}"] +DOMAINS = ["{domain}"] +JWT_SECRET = "{jwt}" +BLACK_LIST = "" +ENABLE_USER_CREATE_EMAIL = true +ENABLE_USER_DELETE_EMAIL = true +ENABLE_AUTO_REPLY = false +DEFAULT_LANG = "zh" +TITLE = "Temp Mail" + +[[d1_databases]] +binding = "DB" +database_name = "{db_name}" +database_id = "{db_id}" +''' +Path("wrangler.toml").write_text(text, encoding="utf-8") +print("wrote wrangler.toml") +PY + +echo "[*] 初始化 schema" +$WR d1 execute "$D1_NAME" --remote --file=../db/schema.sql + +echo "[*] 执行 patches" +for f in ../db/*.sql; do + base=$(basename "$f") + [ "$base" = "schema.sql" ] && continue + echo " -> $base" + $WR d1 execute "$D1_NAME" --remote --file="$f" || true +done + +echo "[*] 部署 Worker" +$WR deploy --minify + +echo +echo "[+] 完成 Worker: $WORKER_NAME" +echo "[+] Admin 密码见 $ROOT/secrets.env" +echo "[+] 下一步: Cloudflare Email Routing catch-all -> $WORKER_NAME" +echo "[+] 注册机配置示例:" +cat <.workers.dev", + "cloudflare_api_key": "${ADMIN_PASSWORD}", + "cloudflare_auth_mode": "x-admin-auth", + "cloudflare_path_accounts": "/admin/new_address", + "cloudflare_path_messages": "/api/mails", + "defaultDomains": "${DOMAIN}" +} +CFG diff --git a/_temp_email_deploy/secrets.env.example b/_temp_email_deploy/secrets.env.example new file mode 100644 index 0000000..434f52a --- /dev/null +++ b/_temp_email_deploy/secrets.env.example @@ -0,0 +1,5 @@ +DOMAIN=zhangyunuo.net +WORKER_NAME=temp-email-zhangyunuo +ADMIN_PASSWORD=change-me-long-random +JWT_SECRET=change-me-longer-random +D1_NAME=temp-email-zhangyunuo diff --git a/accounts_20260712_072055.txt b/accounts_20260712_072055.txt new file mode 100644 index 0000000..728f53d --- /dev/null +++ b/accounts_20260712_072055.txt @@ -0,0 +1,4 @@ +ldnhvgcuog@baoxia.top----N444b5508!a7#manXxXuQ----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiM2JjOTJmZjQtNGUyZS00MGM1LTkxNmMtNDY0ZGFmZWYzMjRjIn0.VH5QcCXF-YOhbuoGy4tER03EfZKrLWRYcFqqUL_6LzM +0ut3371zzx@baoxia.top----Naf8b07ba!a7#5-hN-cf0----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZTA1YjZkMWMtYmRlOC00NDNkLWIyYWMtMTU4MTMwMGU5YTRkIn0.bsK1p1LYEEbzkZobZs8cRqcDedx1iUAgncvK33zeG0w +24m63z630y@baoxia.top----N9f63ae63!a7#D3XcyGAS----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMTA1ZWRlOGEtZGE2OS00Y2JmLTg5YmItZGEwOGYwNWY4NGU1In0.w1lONL5qnfqyeFyMj3fsI_-Z6kHExpdDB0wyGHAY9_g +maxdobzdo8@baoxia.top----Nf47e3202!a7#Syv4gMpt----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYzRkOTI5NGItMWUwYS00MDBhLWEzNTgtYWY2MWU4OTIwOTAyIn0.6yYTZN-xAL8ycvFaAmoWKfTCU9ymNZeBZQzzPKL6L9I diff --git a/accounts_20260712_072658.txt b/accounts_20260712_072658.txt new file mode 100644 index 0000000..a3df7ee --- /dev/null +++ b/accounts_20260712_072658.txt @@ -0,0 +1,4 @@ +xpjt7028xd@baoxia.top----N702678ea!a7#-3WCeIuf----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZmU5NDYyNWMtMDk3Mi00ZjQxLTljYTItOGJmMjhmOWI5YmUyIn0.sfY84_djsUff-lspmYRYxwBy2SSonNcMZuqXmLennkE +zdkbp65awf@baoxia.top----N5d34e529!a7#B34cP1wT----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiM2VkZGQwNjEtNTljYy00N2I2LTlhMzEtN2Q1NDE3YzY4NTRkIn0.Pa3Qj-29p5N9S5leOUWcQw0k6um4wHKuUYVrVJ6AaZ4 +t52djkzaix@baoxia.top----N799c1f14!a7#E0dPCkAV----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMzI2MTcwYjktZmNmOS00M2VhLWEwMDMtMTcxMWRlNzVjMzA1In0.R4h3RvM_nEGML2d0gnBGRN8zmkpyOepNNpqWUViLIH4 +yhm3o9cg9j@baoxia.top----N6f2042c0!a7#D9qurdLO----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMDcyY2M3MWYtNTM2MC00NWE0LWE0MGItOTZhZmY5NWY5MzhmIn0.zEs-fWVTwI-bsxkXf7tnoTKNm-96el4Vvo4mkwzysZY diff --git a/accounts_20260712_072947.txt b/accounts_20260712_072947.txt new file mode 100644 index 0000000..b6a782f --- /dev/null +++ b/accounts_20260712_072947.txt @@ -0,0 +1,37 @@ +nb2rgintjk@baoxia.top----N2cf1e788!a7#XN4NEwAi----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZDUyOTBmMTYtNjAyMi00OTcyLWEzZjQtMzUzYWQ3ZjA0NjhmIn0.hWlfTYkDLq2Aymz28v5q9bZB2T2Hgxa9zSiD8aiJzXs +2bzfrxlnn9@baoxia.top----N4dbf8dc6!a7#BAyMpwYI----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNWFkNTQyOTgtY2MyZi00NWM2LWIwZjYtZGYxYTA5NGVjMmMwIn0.281TZMKlCRZDe5HxAX2OWcR8LcSaGoDWeE00nSPapmY +azh24dkd9w@baoxia.top----N7f998917!a7#HKOL9PLd----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMDIxNGM0NGEtNTBiYS00ZjY5LWE2OGEtMzcwMDY1OTcxMDhlIn0.48ofTxdb2_vfjY7wyayHH-CnbvS6LE1JY0d6u7zTxes +estvdafbw0@baoxia.top----Nf3d922a9!a7#jeowoyjs----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNjJjY2E4YjgtODBiZi00NzUyLTg5ODQtOGEwYzljNDgxNjhkIn0.ykcOpb6Cj_VYqdsWJDr7tWb1ladcpJgQwxCsOPozesg +ymdri8j8y6@baoxia.top----N745055b1!a7#8IrjkOpU----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNmMyNTEzNWMtMjhkYS00YzExLThjYzUtZTBhNDFjNzFkMWU5In0.LipX16qO_gWpcgVBiP3uePzzHOR4PWs5nQ8o00fDNqo +jlrtj0krf4@baoxia.top----N199b590d!a7#PWLovSQr----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNTZjNjY5NzEtN2ZiNS00YzRiLTgzODgtZDQ2OGY5MjA0MTcyIn0.RXf6a-RUozdGlJCN0myWfeXh_vx7yYh3QOl-7LnW4A0 +8fpn0gjacl@baoxia.top----N80a56dd3!a7#dY8_Xr26----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMjlhYzk3MTUtNmNmYS00NDZmLTgzMmUtMDE1NDlhOGQzOWIwIn0.IF4RQTNy9_PXr3cyboO-ArajTW1Y8bstF3iljV8dEUw +faiymol7uk@baoxia.top----N5ed02f30!a7#iad7CX2l----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNjljNjlmMGUtNjY3OS00NDdhLTg3MDMtZDIzNjI3ZDg0NzZhIn0.GM52aLjFhVJCqSqwriFddy7wBzj1QjnBzNSmjrBp3nE +mn8sf1iyye@baoxia.top----N276372eb!a7#TCODwOwa----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMmM5NTU5OWMtN2M2ZC00MzRmLTk4M2ItYTFhMDVjMDRlYjczIn0.sPJarFIXyxc7swdMgu6K2LfrsYTwbH_lNWrA5bThdiE +frdco6skje@baoxia.top----Nbcbc7527!a7#w6zb4Tsa----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMWFiMmJhM2QtNzExZC00ZWRkLTg0Y2EtYTZmNDhjZDQ2MDUzIn0.dEIpuoa7XgsUWx2WF9JcqZWwm9qG6nRSWhO9dU9VECY +nsajm34em7@baoxia.top----N34344a02!a7#ZIREXa17----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZWU5MGZmMDgtMDQxZC00OWY1LTg1MmUtZmYyMTY5YTU2OWY2In0.EUobIBo4ipbl_y8XFMrZU2dE7ki94yGhq8kLYS130Aw +5u1b4dyaml@baoxia.top----N84ad21db!a7#D7jk8IRI----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZGMyMTRhMzctOGYyYS00ZDVlLThmMTQtMzM0ZDJhNzU0OWI3In0.Ch0ijBkQu4PrR8KjtuDZuoAGSBngWnI71IpDV3tm-xM +rb27ceq176@baoxia.top----Nc37cf293!a7#JsonO1fT----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZDJmMDc0ZjYtOTAzYS00NTRiLWE1MGYtMTJjZjAxOGM3MGRkIn0.Cf9Vh7SINvxzHAenIOd2RDnYk_S-IhecYjZl4vzD9c8 +x3zg9qlu95@baoxia.top----Nad70a162!a7#f9dRPUnL----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiODA0NWM2YTYtNWM5Mi00ODRhLTg4MTUtOGExNzBjZGMxYWYwIn0.wGUyNMbEYSScJMF-xNA7ZDJgFG2VzVp2yPBDkURYRYE +fia5t2n0og@baoxia.top----N12066060!a7#WT6QwuHq----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNDZlY2E4ODktNzA0Yy00NGVhLWI5MjMtMzA3OTM2Y2I5OWNkIn0.kNsNE7AeGYSgyBjIJE4PUaOcgMu66zRUwkBmFrZUIaI +6wcib1d19x@baoxia.top----Nc54f3cf7!a7#wBTV6TUm----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYTBhMGZiNTYtMDRlMC00MThlLWFiOTEtZTMyM2I5MGUzMmQzIn0.cyo-xo7q2csvoyBpnu0ZopSDpWFaHIoPDGpggCYR91M +8ujfsqp8zz@baoxia.top----Ndd64d905!a7#oGShTC9E----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMTA1NGFmMzYtYWE4OC00YTI3LWFkZDMtY2JmMDE3OGU5MzMzIn0.2lSYLCPr-5CIQAkqR-LlIwfwzpuxq_rjeRZ5AmU45P0 +43wbsq0jyv@baoxia.top----N6e80bec4!a7#QjgH89kc----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiODA2ODhmZTMtN2JhOC00MjQwLTk2ZDAtZGU4NzBkZDk5MjgxIn0.snMx8ADsGY7urQL7m2RfCHA0cPN2cagaq5T9W7HtCSY +e9z947etdd@baoxia.top----Na533fb82!a7#T8P2NTUw----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNGZlYmFiNWUtYzE1OC00MDM2LTg3MmItMjA4ZTNhZmU2NWM2In0.htQfPZSOjBe8WkjRyLMPR0002Obm78NTyMtiR5Q-VnU +r62zi7flqw@baoxia.top----N803b6fe4!a7#NzPu4UnT----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNTRiYzMwYjgtNWYwMC00MjI4LTg3OWUtMzcwOTkzZWU4ZWNmIn0.UvBeY8NoZ9s5kSQQ8b8Ac_oUmISLvk8lJqnHtdsEiMo +ixe1hjo645@baoxia.top----Nc9d9fee7!a7#gLJQ60vY----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZTYzZWMxMDctMDdjNi00YmI4LTg1NTgtMTVhNjFmN2NkZmJlIn0.LZpxwq8bHpoV60A0FAhpF1bZz_R6Rizt84PJ-QllZwE +2gh9chzsqo@baoxia.top----N0046867f!a7#v9PsHh3e----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNDQ0ZmZhMWEtZTdjZS00OTRkLTg3ODMtZmQwZjk0OGY1ZmE1In0.utJHRxPuFIyDwgOmfrWQMgZh3R5STthbWNUvCgsQhCU +nl45jetu8c@baoxia.top----Nd2d0f3db!a7#O3gXBkCm----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYzU3ZGIyMWUtOTE4Zi00NTY5LTljMzMtZDA5ODI4NmY2YjliIn0.xQuw2G-a-cnTn9Sha9rS8SuN0jpVkHdk0QELQOyBLj8 +vi6utfhjzl@baoxia.top----Nd4616742!a7#Tx8XqJNT----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMDc3ODQ3MTEtMWYzMi00MTI4LWE5ODAtY2FlZGNiZmNlMzBmIn0.2KJKAY17cLIB13PJATb-jVLHEDBM8eXUqXHWSBc-dx4 +e2dsv3te98@baoxia.top----Nd7e438d8!a7#F11hjhV4----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMTVjNjRkNWUtM2VjMi00NGRhLTgyMzctZDU4OGZiMzNiNGYwIn0._kLWYZ7Uyp5WI2_q-ynN-eeI9O0WTCUCqeLuDKdJjC8 +6ya56uc9cm@baoxia.top----N0d4bffb3!a7#U4vXX3Vu----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNzM5YzEzNDQtZDRiNy00MTQzLWFkZTktNDQ3MjQ1NDM2YTI0In0.iXNwU3erw2a1pr1svs3etMo9kNpkF8KGF_BNSR0s49k +u7ahgimo1x@baoxia.top----Nf8b44381!a7#37HCxzR7----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYjIxZWM4NTItMTg4MC00NTcwLWJjMzctNjdhYzY3MjA0NWFiIn0.m1Bz5Pv4KmYv1hy_I_ftsbzQxF5cTnmhURLeR7FEKmg +1smfftlfge@baoxia.top----N5af90a22!a7#4bmHCSAl----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYTZmNzBiZDMtODU3ZC00ZWU3LWFmMDAtMzczMWZjOTUwMTA2In0.QgeVqtvdZeCShRXnkV7k4rKL8ATdCzhmZTqJItJr4d0 +f7bo80h3lm@baoxia.top----N9eed21ee!a7#M5xe4jWU----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZGEzYTM4MjEtZjRhYi00YmE3LWEzYjEtNTY3YTI3NWEwMGZhIn0.y3NFYCVrm-1Z1v469yCo3j4IoHF-VnL_DYuSlCDAOt4 +2bkus632ss@baoxia.top----Neb0e13ec!a7#xNqX7Qst----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiM2E0ODY5MmUtNmZlZi00OWJmLTg3MTctNGFkMTUzZDQ3ZTUzIn0.dLV-AeS-F44UvV6_Vla5-N_-sntGBdFmwOVcDc3Om6I +5uyyzhwpa7@baoxia.top----Nb5620b15!a7#umoDe2lf----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNmQ5Zjg2YzQtMDM0OC00ZTk4LThkYTctNzIyYWM4Nzc5Y2RiIn0.5TBTmxDw9qrbVk8tPwE0Af_Y3IjGrRhmxLkXnJSvC5A +iekcdguksg@baoxia.top----Ndb5f099c!a7#B58d45G6----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMzA0YzhmY2EtZjgyNi00YjUxLWE5Y2QtMzNmODlhMWU5N2ZkIn0.9s1NZxWXKpuqOfF-HWqzkbIAROCLNK48QQf_5tbd-oY +om6aktj95t@baoxia.top----Neadbe4b2!a7#kKQ14heS----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZjM1ZWE2NGMtNzVmYS00NzE1LTllMGQtNTAyNDRlMzgzYmFiIn0.y8cR3mc4-L7rhiv25c1rR2V2j-2Da6OkVl6_zG_hJlU +64uqnvty4h@baoxia.top----N17d14bf5!a7#c9bxzE9H----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZTgxMmE1MzgtMDkzZC00N2I1LWI3ODYtZmFmOTJjYzg3MzA4In0.L_FWqdEdjy8XlRVuSsGI1N803SpBYvWOkqZqchnnvJw +m76yyidh09@baoxia.top----N7f2fe852!a7#hHLjZ_VY----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMTI5MWRmZTEtMjNhYS00NTYxLWJiZmMtNzdmMTg1OTcwMTZkIn0.CaDV4OvMYT7HP5rUC3VpMuhvF16U3mURJDGDS_kaCok +wme8fqq49h@baoxia.top----N52c11c32!a7#owrfrBu7----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNWVkOTI4MjktOGVlNS00ZTFiLWIwYWQtNjVjZTA4MWI4N2ZiIn0.LGIe2GQI3_tOnYDgOttoBa9JL2vXEWuq8EyAaPwYoKk +ki7rmpy5rr@baoxia.top----Nad569255!a7#oKjW9sLM----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNTgwNjQyYjAtMzVlOS00NmZkLWI0NDctN2E5MTY3MzhiMmUxIn0.eEwv3TLKs8CP0eywFEe6g8L3XwotWc7uFTZO1nG3UFU diff --git a/accounts_20260712_074528.txt b/accounts_20260712_074528.txt new file mode 100644 index 0000000..21d7ae0 --- /dev/null +++ b/accounts_20260712_074528.txt @@ -0,0 +1,39 @@ +k13oh7mype@baoxia.top----N9c2466bf!a7#HAimAWEk----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMDQ5MThkMGItMDgzZS00ZDUyLThlNzAtN2YyY2I5MzcwMTUyIn0.4fpUTmzBnRBOZ_2bWiPQaLEBZ0oaM1K6CWSErXV83Ao +9siz1a6w9q@baoxia.top----N118df26b!a7#lg9nv6p8----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOTA5M2U1MmMtZTFmOC00M2NjLTlmNTAtN2MyZGQ3OGI1NWEzIn0.q_P0IXR9Tdxam-LTWVCKVcLEcX2x4VwQQO-ZnvSg0v0 +60c3bel0of@baoxia.top----N9d23b180!a7#t_nUG7Kt----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOGFkOTVlNzAtN2EwMC00YThlLWFlNTYtY2JjM2ZkNjA0NmY1In0.bOU-Iw-W5VL3vQMG8TXogqPrrlvjt1RqXAGKvMhnltM +9reee0ai8h@baoxia.top----Nd0855c65!a7#EsdrAzbw----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOWU0YzNjOGItODhkZS00ZjljLTk1OTctNjJmMzNiZjYxMTFjIn0.s4Cf1UTHQa3deNicm-eDuxfBqFtpxh4Are_Cnl_Ufi4 +6y1m6p9ejg@baoxia.top----Nf6af9c8a!a7#_6E3pu21----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMTQ0YTI4NmMtYzEzNi00MGQzLTg5ZjktNmE5NzJmZjFhNDk5In0.iLr0ueorEyPzoGisP9Uw3oRmb6FYqzUfR7vFciEPLKU +fk9342dhhb@baoxia.top----N5fbcd0d7!a7#Vg6xEqd0----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMzc2MmRlZGUtMjQwZi00OTg3LWI5M2QtZmZmMTZjYmQyNWIyIn0.eM221fZR6V5TY7xqtdRixGHmrCSQWtqmLma6qDESCDk +k51heiyx4b@baoxia.top----N60aaebed!a7#idsGfz8H----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiM2Q4YjFkNzktYzA2Zi00NjRjLTgyNDEtYjlhYmE0NTEzZDllIn0.IQJHVl7H-OTXoJXaZHOlTwReyIWdn-3J8ceEhs7eHB0 +p2mduw32zz@baoxia.top----N658e8d25!a7#KuPhT5RT----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMDhkZjI1M2YtZTM2Yy00N2ZhLTgwMmMtOTM2YWY4MjZmZTZmIn0.mCjetk1Af69sUFOseT6vSOnVoOJjqXrLT-Ym4qgzX9M +0j2ld2ajp9@baoxia.top----N1acb5187!a7#gW8vc3KG----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMDFkYTY2OWEtZTQwZC00N2Y3LTgzZDAtZTAyZDc5ZGFhZjE5In0.Z_7cPIqY7G12aTvOgJXb3rOe45Oh_bEKaHNBI2YGGIE +wsljbjjqqa@baoxia.top----N2b01e384!a7#BAeHPR9d----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNGJmMGM1MDEtY2E5Ni00ODNmLThmYWItODE2YTY2Zjc3NDNlIn0.849_wZmRuNt03dSTKApv3SdH0BnChbx8cd2xt58hMdA +q08qn1kpmz@baoxia.top----Naa8edb01!a7#K3aq98ne----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMzI2NmRjZmMtOTMyNi00N2U2LWI4MjktMmQzMWY5ZTc1NTYzIn0.o4VgXEPU1M6tNCC_xd8yGxGsnN-rpvzcSJus0xXpHbg +xe5dz2gsly@baoxia.top----Na6c61a38!a7#dA2_5NcY----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMzAwZTdjMDctZjUyMS00YjMxLWI0ZDMtMWYwYzU0NWQyN2RhIn0.1tT-8uhzeDPP0jodXUz0HkrSo-6KbMdXshZlxcQk7t4 +975h5exlck@baoxia.top----N2230323a!a7#JdAj8z_2----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNThkYmQwNjUtNmI0Yi00NGI1LTg5ODktZDhiNzNmMTQ0NWYzIn0.OIzm0FcJFry1jEZKkjUttBcENQhF8iIUm4NjfaEEf4I +xep62luxj1@baoxia.top----N742b004d!a7#Jyc8Egev----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYWVkOTM4ZTEtMThiZi00MDg1LWFkOGUtMWQ2ODlmYTAzYWNhIn0.cK2PmthNS4ziOqfDlS4Y-n9o5mC2eGD-d95ANzHmhSI +bywnuxdlst@baoxia.top----Nf4b02450!a7#7JdtIEgo----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZTRmNjI0ZGMtYjQwOS00MzgzLWJiZWEtZDZlMDMwZTZlMzUzIn0.XDhjfQT5VO4KqOWd6m67kwKcgh9qjkyh1oJ0m9Klobg +o5ghn97cez@baoxia.top----N5831a285!a7#6-oe3e1D----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMzdlMTcyZTUtN2Q4Yi00ZWI5LWE0YzUtZWU4MjM3ZDEyOGFkIn0.0zn6kraz0lqQE1rbd7ZJILStMzi7eTaufhxLWMpwvrU +f2fiohvtqg@baoxia.top----N308774d3!a7#cqs9eQuB----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYWRkM2QzYzAtMGRkZC00ZmQyLTkxZWYtMjVjNDA1YzFjNzgyIn0.U663NRxiKXln8p70Ct1YPe_MvB2p9963R96IzelH6dY +ypg51d45r0@baoxia.top----N15f941fa!a7#m-nGrYwK----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNjY1Yjc3MWYtNWQ1OS00MDFhLTg3N2YtYzI5Yzg2ZjljNzVmIn0.P1iFnK7DZkmE0TtaG1TsDyZngpmZIVACjJ3n_iJEIak +omogi0azbx@baoxia.top----N4e4ab29a!a7#R-KpcNR8----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNTAzNTc1ZjQtZTU3NS00YWI0LWI2MjMtZDBjYjRmZjMxYTZhIn0.gT5yZkpNireDhEM88ISy19cVN4Sg5MbG5Zxfm3_Pe_s +kduly97uxq@baoxia.top----N649b7a7c!a7#Tncl3F7T----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYTQ2NWZlZGMtNWEyMS00NzM3LTk3MTUtY2QyNWEzYTYzNjE2In0.z_I9oUmU8uUC9OC0bXCLG1mCeWBeAp3GRmt6YZj9y3E +6331ne6rbc@baoxia.top----Nb8589587!a7#wEoOubgA----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYWU2ZGNjNjYtNGU5Ny00MzEyLWJjYTEtNTNhODhjY2M1N2VmIn0.4lIHzxTv1LVQvR696r1jJTllX7DrW4pS54zG_OVzdTk +s4n7ekbaku@baoxia.top----Nd960eede!a7#tFrnOCLh----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNDMwNGE5ODEtMjAzYS00YzVhLTg5ZWYtZjczZWJhMzU2MzJlIn0.nCRQWY0IucQPSrnUOk2-HCr5a08VD6wDuozP6wK4kqA +a72504smkj@baoxia.top----N9b4f7c03!a7#iGBKiR8x----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNjlhZDRkMzktMTZiMy00MDI3LWI5MWMtY2I0NWZlMzA1YzJmIn0.PW8k1FO8jeFBZkFtWinwXDhnga6QKno1VLoK0oDovgk +lihplift4a@baoxia.top----N89aac625!a7#tGy7itnz----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMjViMGIwMzctMDA3NC00MTUzLWEwZmMtMDA3MThkNjY4MjBhIn0.dC3hiitysmf3qPVG5w1C5M4Dk-Ksq-TOoJiOnbO4zF8 +1b54x8ixhg@baoxia.top----Nd926cea2!a7#QMZPrQtd----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNDJkMzhmMTctODAxZS00MzMzLWI0OWQtMTczYTY3MDgwNGViIn0.LwiMcO70MzubZw1fTE_ZQwfQnug42b0ab_94ZvKJ4ug +6042etmmm8@baoxia.top----Nc130c1a5!a7#QnlvxB_o----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMWM4NTZjYmQtNDA1Ni00MDcyLTk1OGUtYjBjNGI0ODI4OTk2In0.LcS_QvxhggrCZXDiuU1vPWy67Ka8CzmfzfhR-tBn_mc +9v4ceax6zm@baoxia.top----N37ea3b8d!a7#SkbjG4iM----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMjRjNWFjYWEtYzk5Ni00ZDE2LTkxYmItNjY5ZmFhNzk4NzEwIn0.m4Z9DMDDhDnG3eWPs95qvvD3xdg3prCaMDCG6obEOS0 +6dbesrztrw@baoxia.top----Ne73723ee!a7#wXk5lcLL----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZGRlYzJhNDMtMzY0YS00NzM5LThjNzItYTRkZWE4YmNiMDhmIn0.06UaTiKOAya2WSu8Jjtq4W9uHZiRqiScvqSCYT0Hxvo +eejz72mw2o@baoxia.top----N6d934270!a7#1nVgi-BV----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNmNkYTk4NmItZWU3Yy00NjZlLTg2NzEtOTRhZjc5NmU5OWY5In0.Comqop3xV-NjsD3qlwLw9CT2Ae2VEFUB14zMbm0um9s +6kqcobepww@baoxia.top----N6d68df97!a7#AXdwu40m----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZDY1MjllZGItYzA5Yi00NWQxLWJkYjAtNDc2YmYzMzNkNDhhIn0.ABajs_yC_L65KS7nO9LC5TALkPqFZCAAsOAr29unabA +q2nqpgidjv@baoxia.top----N36a6198f!a7#V4qfUcS8----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNDU3MWUwYTItOTY5My00MTdhLThmNjEtMTk4MzUyNGEzMzhlIn0.AXtifTiurVN25xPcnnSXARDcaJOH13KUTxWtofKjsI8 +o95qnz8bdb@baoxia.top----N7911b8e2!a7#MdqgJ4lo----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYzU2ZGRlMDgtYmY3Mi00ODI1LWEyNTItOTlhNmVjM2QyYTg4In0.gZDHxWbbOWuY0xuUARone5tABspp1Wwwamxjbyb6Wf0 +8lnrhvxe3a@baoxia.top----Ne76fc2e1!a7#OTZtJibe----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZTU3YTY0NWEtMWM1OC00ZDg1LWJhM2MtM2U0YzQxNDkyYzhmIn0.mGBVm-4EaTCoKJwuZN0DDqtJgHha67QWc27lni4woSE +3x9cnfep9r@baoxia.top----Ndd7d0351!a7#AdXsYXDc----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMDJiYzc1ZWItZDQwOS00ZWEyLThhYzYtOGRjMjZiMTA5NWNkIn0.FByeKlxQD64ar6rMqUldPEDeeRl6HWoLgukymLnKGy8 +bu06oq50vn@baoxia.top----N89502025!a7#vvgsSxfO----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNDJjMDgzODYtZTk4Yi00Mjc5LThhYjgtZTE1NTFiZGMzMzk4In0.-OSpBQXBi_oPsacf3w8_3_PnuUyOihumSVcvLqVNs80 +t1b5dkoy8p@baoxia.top----Nb5bcc629!a7#iuJ3KK5j----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNWI0MzZkYzktZTc0OS00MTk5LWEwYTYtNzI5N2I2NDk1M2EwIn0.8NLA4VsJ7SLqpMxP4IsvqHPWsriSfOyU24Hk8ai7ibY +fjfnkokfmh@baoxia.top----N4a472337!a7#MxP4Cw3D----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiODE0N2U3ZmQtNWU5Mi00NDVlLWE1ZTUtOTk0NTBhNDdlYjFhIn0.fPxnhg8MEKB0dGJB8NiQbAxEzGQ_yRlxP6jmQ17cjPc +kcp3zw9281@baoxia.top----N93670bbf!a7#hY6rvyOs----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiYmU3NDllNGEtNjE3YS00ZjAzLWJjMzItNDNlYzE5N2EyNjAxIn0.Uqz1xbKncwjNXarTfkbGmKueSTN5vHR2trZEt7uvZ1k +8x4pwvn3zr@baoxia.top----Neb2f49bf!a7#_uStzLvX----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiOGQwOWE0ZTctNjlmNy00OTM3LTk5MmYtYTc1NzUxMDgxYjQ0In0.YV758vluIvRTfIi68EjMi_yVpZ-lmk9mJe19QzE-TFs diff --git a/accounts_20260712_080736.txt b/accounts_20260712_080736.txt new file mode 100644 index 0000000..bcce5a3 --- /dev/null +++ b/accounts_20260712_080736.txt @@ -0,0 +1,6 @@ +wnjhqq4yjk@zhangyunuo.net----Nae6e2892!a7#pI3oDWSe----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZTJmYTllMjctMjkyYy00M2IxLWFkNTgtMWZjZmZiMTQ4ZTI2In0.6N2WOYGHJ36A_MzfVdQK57QgtHI9PXIq8TjkHo5VUrc +j4948gddgu@zhangyunuo.net----N69234801!a7#SrOmvIyK----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiN2ZjMDgzMzQtNDdiZC00MmQ1LWJiMjUtNTA0ZTI3OGQyZTExIn0.ucb48rkTF5JMSF4qr5sdHO0jgyLtHClmMM9Zlz34T_o +8l8swz3y43@zhangyunuo.net----N5c2589d9!a7#zGQ_9cxM----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZGIxYjMwZGUtOGQ1Ny00M2NlLWFhZWUtYTkxYjNmOWUyZmQ1In0.EZ_x5DwMM_32zu6-cCS05TkORm_3DsIrBJ5PPVHCNvQ +9vyw4fh3s7@zhangyunuo.net----Nb2f318ef!a7#27YL0Pto----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiZjA3ZjQ5N2QtYTYwZi00ZGRhLTkzNjgtZWNmZDkzMmE5MjM1In0.1QdLOpp5x0Or1Hqbck8FgHGaeE6Slbv1idmcFGEbd0Y +4fqwg1izka@zhangyunuo.net----N3a76af5b!a7#TMUTXY6J----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiNWU3ZDcwY2YtMmZkYi00OWNhLWI3ZmQtMzJiZTUxNzY3YzJiIn0.feDJL9RVY6mJp2d-_LDmU1AdcYTuP4KRGaZwRLutRJw +607jtxa2km@zhangyunuo.net----Nf5ee1bb0!a7#ZnToQA9j----eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzZXNzaW9uX2lkIjoiMWQyOGU4MDMtOTJhOS00NGNjLWJmMmMtYTVhNGVjZjZhMmEyIn0.1VNa4ACvBGkuRFqjTICQnrK9qMCUmWvbc-nDKOuun0E diff --git a/cf_mail_debug.py b/cf_mail_debug.py new file mode 100644 index 0000000..962960c --- /dev/null +++ b/cf_mail_debug.py @@ -0,0 +1,240 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- + +import argparse +import re +import secrets +import string +import time +from typing import Any, Dict, List, Optional, Tuple + +from curl_cffi import requests + + +def extract_code(text: str, subject: str = "") -> Optional[str]: + if subject: + m = re.search(r"\b([A-Z0-9]{3}-[A-Z0-9]{3})\b", subject, re.IGNORECASE) + if m: + return m.group(1) + m = re.search(r"\b([A-Z0-9]{3}-[A-Z0-9]{3})\b", text, re.IGNORECASE) + if m: + return m.group(1) + for p in [ + r"verification\s+code[:\s]+(\d{4,8})", + r"your\s+code[:\s]+(\d{4,8})", + r"confirm(?:ation)?\s+code[:\s]+(\d{4,8})", + ]: + m = re.search(p, text, re.IGNORECASE) + if m: + return m.group(1) + return None + + +def json_or_text(resp: requests.Response) -> Tuple[Optional[Dict[str, Any]], str]: + try: + data = resp.json() + return data, "" + except Exception: + return None, (resp.text or "")[:400] + + +def generate_username(length: int = 10) -> str: + """生成 cloudflare_temp_email admin API 需要的随机邮箱名称。""" + chars = string.ascii_lowercase + string.digits + return "".join(secrets.choice(chars) for _ in range(length)) + + +def normalize_path(path: str, default_path: str) -> str: + """标准化 API 路径,避免漏写开头斜杠。""" + raw = (path or default_path).strip() or default_path + return raw if raw.startswith("/") else f"/{raw}" + + +def build_auth_headers(auth_mode: str, api_key: str, content_type: bool = False) -> Dict[str, str]: + """按调试参数构造 Cloudflare 临时邮箱接口鉴权请求头。""" + headers = {"Content-Type": "application/json"} if content_type else {} + key = (api_key or "").strip() + mode = (auth_mode or "none").strip().lower() + if not key: + return headers + if mode == "x-admin-auth": + headers["x-admin-auth"] = key + elif mode == "x-api-key": + headers["X-API-Key"] = key + elif mode == "bearer": + headers["Authorization"] = f"Bearer {key}" + return headers + + +def create_address( + api_base: str, + auth_mode: str = "none", + api_key: str = "", + create_path: str = "/api/new_address", + domain: str = "", + name: str = "", +) -> Tuple[str, str]: + """创建 Cloudflare 临时邮箱地址,支持匿名 API 和 admin API。""" + path = normalize_path(create_path, "/api/new_address") + is_admin_create = path.rstrip("/").lower() == "/admin/new_address" + if is_admin_create: + payload: Dict[str, Any] = { + "name": name.strip() if name.strip() else generate_username(), + "enablePrefix": True, + } + if domain.strip(): + payload["domain"] = domain.strip() + headers = build_auth_headers(auth_mode, api_key, content_type=True) + else: + payload = {} + if domain.strip(): + payload["domain"] = domain.strip() + headers = {"Content-Type": "application/json"} + resp = requests.post( + f"{api_base.rstrip('/')}{path}", + json=payload, + headers=headers, + timeout=20, + ) + resp.raise_for_status() + data, raw = json_or_text(resp) + if not data: + raise RuntimeError(f"{path} 非JSON: {raw}") + address = str(data.get("address", "")).strip() + jwt = str(data.get("jwt", "")).strip() + if not address or not jwt: + raise RuntimeError(f"{path} 缺少 address/jwt: {data}") + return address, jwt + + +def fetch_box(api_base: str, jwt: str, path: str, params: Dict[str, Any]) -> List[Dict[str, Any]]: + resp = requests.get( + f"{api_base.rstrip('/')}{path}", + params=params, + headers={"Authorization": f"Bearer {jwt}"}, + timeout=20, + ) + if resp.status_code >= 400: + return [] + data, _ = json_or_text(resp) + if not isinstance(data, dict): + return [] + if isinstance(data.get("results"), list): + return data["results"] + if isinstance(data.get("data"), list): + return data["data"] + if isinstance(data.get("messages"), list): + return data["messages"] + return [] + + +def probe_all_boxes(api_base: str, jwt: str) -> List[Tuple[str, List[Dict[str, Any]]]]: + probes = [ + ("/api/mails", {"limit": 20, "offset": 0}), + ("/api/sendbox", {"limit": 20, "offset": 0}), + ("/api/mails", {"limit": 20, "offset": 0, "box": "trash"}), + ("/api/mails", {"limit": 20, "offset": 0, "folder": "trash"}), + ("/api/mails", {"limit": 20, "offset": 0, "deleted": "1"}), + ("/api/mails", {"limit": 20, "offset": 0, "status": "deleted"}), + ] + out: List[Tuple[str, List[Dict[str, Any]]]] = [] + for path, params in probes: + mails = fetch_box(api_base, jwt, path, params) + out.append((f"{path}?{params}", mails)) + return out + + +def get_detail(api_base: str, jwt: str, mail_id: Any) -> Dict[str, Any]: + for url in [ + f"{api_base.rstrip('/')}/api/mail/{mail_id}", + f"{api_base.rstrip('/')}/api/mails/{mail_id}", + ]: + try: + resp = requests.get(url, headers={"Authorization": f"Bearer {jwt}"}, timeout=20) + if resp.status_code >= 400: + continue + data, _ = json_or_text(resp) + if isinstance(data, dict): + return data + except Exception: + continue + return {} + + +def flatten_mail_text(item: Dict[str, Any], detail: Dict[str, Any]) -> Tuple[str, str]: + subject = str(item.get("subject") or detail.get("subject") or "") + parts: List[str] = [] + for src in (item, detail): + for k in ("text", "raw", "content", "intro", "body", "snippet"): + v = src.get(k) + if isinstance(v, str) and v.strip(): + parts.append(v) + html_val = src.get("html") + if isinstance(html_val, str): + html_val = [html_val] + if isinstance(html_val, list): + for h in html_val: + if isinstance(h, str): + parts.append(re.sub(r"<[^>]+>", " ", h)) + return subject, "\n".join(parts) + + +def main(): + ap = argparse.ArgumentParser() + ap.add_argument("--api-base", required=True) + ap.add_argument("--address", default="") + ap.add_argument("--credential", default="") + ap.add_argument("--auth-mode", default="none", choices=["none", "bearer", "x-api-key", "x-admin-auth"]) + ap.add_argument("--api-key", default="") + ap.add_argument("--create-path", default="/api/new_address") + ap.add_argument("--domain", default="") + ap.add_argument("--name", default="") + ap.add_argument("--timeout", type=int, default=180) + ap.add_argument("--interval", type=int, default=3) + args = ap.parse_args() + + address = args.address.strip() + credential = args.credential.strip() + if not credential: + address, credential = create_address( + args.api_base, + auth_mode=args.auth_mode, + api_key=args.api_key, + create_path=args.create_path, + domain=args.domain, + name=args.name, + ) + print(f"[NEW] address={address}") + print(f"[NEW] credential(jwt)={credential}") + else: + print(f"[USE] address={address or '(unknown, from credential)'}") + + deadline = time.time() + max(args.timeout, 1) + seen_ids = set() + while time.time() < deadline: + boxes = probe_all_boxes(args.api_base, credential) + total = 0 + for name, mails in boxes: + if mails: + print(f"[BOX] {name} -> {len(mails)}") + total += len(mails) + for m in mails: + mail_id = m.get("id") or m.get("mail_id") + if not mail_id or mail_id in seen_ids: + continue + seen_ids.add(mail_id) + detail = get_detail(args.api_base, credential, mail_id) + subj, text = flatten_mail_text(m, detail) + code = extract_code(text, subj) + print(f"[MAIL] id={mail_id} subject={subj!r} code={code!r}") + if code: + print(f"[FOUND] {code}") + return + if total == 0: + print("[INFO] no mails yet") + time.sleep(max(args.interval, 1)) + print("[TIMEOUT] no code found") + + +if __name__ == "__main__": + main() diff --git a/config.json b/config.json new file mode 100644 index 0000000..cc30a00 --- /dev/null +++ b/config.json @@ -0,0 +1,37 @@ +{ + "duckmail_api_key": "", + "cloudflare_api_base": "https://temp-email-zhangyunuo.nopjcn.workers.dev", + "cloudflare_api_key": "394f13544eb74409ee5a97ff5f67c953", + "cloudflare_auth_mode": "x-admin-auth", + "cloudflare_path_domains": "/api/domains", + "cloudflare_path_accounts": "/admin/new_address", + "cloudflare_path_token": "/api/token", + "cloudflare_path_messages": "/api/mails", + "proxy": "", + "enable_nsfw": true, + "register_count": 99999, + "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36", + "cpa_export_enabled": true, + "cpa_auth_dir": "./cpa_auths", + "cpa_base_url": "https://cli-chat-proxy.grok.com/v1", + "cpa_push_enabled": true, + "cpa_remote_base": "https://cpaai.qxy1828.com", + "cpa_remote_secret": "sk-fuLgIiBOn6A7rYrMm", + "cpa_remote_verify_tls": true, + "cpa_push_proxy": "", + "cpa_push_required": false, + "mint_proxy": "", + "mint_timeout_sec": 300, + "mint_required": false, + "email_provider": "cloudflare", + "defaultDomains": "zhangyunuo.net", + "cf_worker_domains": "", + "gmail_worker_enabled": false, + "gmail_worker_url": "https://grok-xai-mail-codes.nopjcn.workers.dev", + "gmail_worker_api_key": "ZhaoChao19950510", + "gmail_worker_timeout_sec": 20, + "gmail_worker_poll_interval": 0.4, + "gmail_imap_fallback": false, + "hide_window": true, + "block_media_fonts": true +} diff --git a/cpa/__init__.py b/cpa/__init__.py new file mode 100644 index 0000000..b1c8e29 --- /dev/null +++ b/cpa/__init__.py @@ -0,0 +1,30 @@ +"""CPA (CLIProxyAPI) xai auth 组装 / 写盘 / 推送远端。""" + +from .client import CpaPushError, push_auth_file +from .schema import ( + API_BASE_URL, + CLI_BASE_URL, + CLIENT_ID, + DEFAULT_BASE_URL, + REDIRECT_URI, + TOKEN_ENDPOINT, + build_cpa_xai_auth, + credential_file_name, + expired_from_access_token, +) +from .writer import write_cpa_xai_auth + +__all__ = [ + "API_BASE_URL", + "CLI_BASE_URL", + "CLIENT_ID", + "DEFAULT_BASE_URL", + "REDIRECT_URI", + "TOKEN_ENDPOINT", + "CpaPushError", + "build_cpa_xai_auth", + "credential_file_name", + "expired_from_access_token", + "push_auth_file", + "write_cpa_xai_auth", +] diff --git a/cpa/client.py b/cpa/client.py new file mode 100644 index 0000000..17df429 --- /dev/null +++ b/cpa/client.py @@ -0,0 +1,93 @@ +"""把 CPA xai auth JSON 推送到远端 CLIProxyAPI 导入。 + +对齐 router-for-me/CLIProxyAPI 管理 API: + POST {base}/v0/management/auth-files?name=xai-.json + X-Management-Key: (管理员密钥) + body = 原始 auth JSON + 成功 -> 200 {"status":"ok"} +""" + +from __future__ import annotations + +import json +import ssl +import urllib.error +import urllib.parse +import urllib.request +from typing import Any + +UPLOAD_PATH = "/v0/management/auth-files" + + +class CpaPushError(RuntimeError): + pass + + +def _opener(proxy: str | None, verify_tls: bool) -> urllib.request.OpenerDirector: + handlers: list[Any] = [] + if proxy: + handlers.append(urllib.request.ProxyHandler({"http": proxy, "https": proxy})) + else: + # 远端管理口通常在内网/直连,显式禁用系统代理,避免误走 mint 代理 + handlers.append(urllib.request.ProxyHandler({})) + ctx = None + if not verify_tls: + ctx = ssl.create_default_context() + ctx.check_hostname = False + ctx.verify_mode = ssl.CERT_NONE + if ctx is not None: + handlers.append(urllib.request.HTTPSHandler(context=ctx)) + return urllib.request.build_opener(*handlers) + + +def push_auth_file( + *, + remote_base: str, + secret: str, + filename: str, + payload: dict | bytes | str, + proxy: str | None = None, + verify_tls: bool = True, + timeout: float = 30.0, +) -> tuple[bool, int, str]: + """把一个 auth 文件推送到远端 CLIProxyAPI。返回 (ok, status, text)。""" + base = (remote_base or "").strip().rstrip("/") + if not base: + raise CpaPushError("cpa_remote_base 未配置") + if not secret: + raise CpaPushError("cpa_remote_secret 未配置") + if "://" not in base: + base = "http://" + base + if not filename.endswith(".json"): + filename += ".json" + + if isinstance(payload, dict): + body = (json.dumps(payload, ensure_ascii=False) + "\n").encode("utf-8") + elif isinstance(payload, str): + body = payload.encode("utf-8") + else: + body = payload + + url = f"{base}{UPLOAD_PATH}?name={urllib.parse.quote(filename)}" + req = urllib.request.Request( + url, + data=body, + method="POST", + headers={ + "X-Management-Key": secret, + "Content-Type": "application/json", + "Accept": "application/json", + "User-Agent": "grok-reg-cpa-push/1.0", + }, + ) + opener = _opener(proxy, verify_tls) + try: + with opener.open(req, timeout=timeout) as resp: + status = int(getattr(resp, "status", 200) or 200) + text = resp.read().decode("utf-8", errors="replace") + return (200 <= status < 300), status, text + except urllib.error.HTTPError as e: + text = e.read().decode("utf-8", errors="replace") + return False, int(e.code), text + except Exception as e: # noqa: BLE001 + raise CpaPushError(str(e)) from e diff --git a/cpa/schema.py b/cpa/schema.py new file mode 100644 index 0000000..d80ee22 --- /dev/null +++ b/cpa/schema.py @@ -0,0 +1,135 @@ +"""CPA (CLIProxyAPI) xAI auth JSON 组装,对齐 router-for-me/CLIProxyAPI +internal/auth/xai/token.go 的 TokenStorage 结构。 + +生成的 xai-.json 可被 CLIProxyAPI 直接加载;CLIProxyAPI 请求 grok 时会 +自带 x-grok-client-version 头(xai_executor.go 硬编码 0.2.93),免费 Build 账号 +不会 426。 +""" + +from __future__ import annotations + +import base64 +import json +import re +from datetime import datetime, timezone +from typing import Any + +# 对齐 CLIProxyAPI internal/auth/xai/types.go +CLIENT_ID = "b1a00492-073a-47ea-816f-4c329264a828" +ISSUER = "https://auth.x.ai" +TOKEN_ENDPOINT = "https://auth.x.ai/oauth2/token" +REDIRECT_URI = "http://127.0.0.1:56121/callback" +# 免费 Grok 4.5 (Build) 走 cli-chat-proxy;付费 API 用 https://api.x.ai/v1 +CLI_BASE_URL = "https://cli-chat-proxy.grok.com/v1" +API_BASE_URL = "https://api.x.ai/v1" +DEFAULT_BASE_URL = CLI_BASE_URL + + +def _sanitize_file_segment(value: str) -> str: + """对齐 CPA CredentialFileName 的清洗规则。""" + value = (value or "").strip() + if not value: + return "" + out: list[str] = [] + for ch in value: + if ( + ("a" <= ch <= "z") + or ("A" <= ch <= "Z") + or ("0" <= ch <= "9") + or ch in {"@", ".", "_", "-"} + ): + out.append(ch) + else: + out.append("-") + return "".join(out).strip("-") + + +def credential_file_name(email: str = "", sub: str = "") -> str: + """返回 CPA 认证文件名:xai-.json。""" + email_s = _sanitize_file_segment(email) + if email_s: + return f"xai-{email_s}.json" + sub_s = _sanitize_file_segment(sub) + if sub_s: + return f"xai-{sub_s}.json" + ts = int(datetime.now(tz=timezone.utc).timestamp() * 1000) + return f"xai-{ts}.json" + + +def _jwt_payload(token: str) -> dict[str, Any]: + parts = (token or "").split(".") + if len(parts) < 2: + raise ValueError("not a JWT") + seg = parts[1] + seg += "=" * (-len(seg) % 4) + return json.loads(base64.urlsafe_b64decode(seg)) + + +def expired_from_access_token(access_token: str) -> tuple[str, int, str]: + """从 access_token 解析 (expired_rfc3339, expires_in, sub)。""" + pl = _jwt_payload(access_token) + exp = int(pl["exp"]) + iat = int(pl["iat"]) if pl.get("iat") is not None else exp - 21600 + expired = datetime.fromtimestamp(exp, tz=timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + sub = str(pl.get("sub") or pl.get("principal_id") or "").strip() + return expired, max(exp - iat, 0), sub + + +def build_cpa_xai_auth( + *, + email: str, + access_token: str, + refresh_token: str, + sub: str | None = None, + id_token: str | None = None, + expires_in: int | None = None, + expired: str | None = None, + last_refresh: str | None = None, + base_url: str = DEFAULT_BASE_URL, + token_endpoint: str = TOKEN_ENDPOINT, + redirect_uri: str = REDIRECT_URI, +) -> dict[str, Any]: + """组装一个 CLIProxyAPI 可导入的 xai auth 对象(TokenStorage 字段)。""" + access_token = (access_token or "").strip() + refresh_token = (refresh_token or "").strip() + if not access_token: + raise ValueError("access_token is required") + if not refresh_token: + raise ValueError("refresh_token is required (CPA 无法在缺 refresh_token 时续期)") + + try: + exp_s, exp_in, sub_jwt = expired_from_access_token(access_token) + except Exception: + exp_s, exp_in, sub_jwt = "", 21600, "" + + if not expired: + expired = exp_s + if expires_in is None: + expires_in = exp_in or 21600 + if not sub: + sub = sub_jwt + if not last_refresh: + last_refresh = datetime.now(tz=timezone.utc).strftime("%Y-%m-%dT%H:%M:%SZ") + + base_url = (base_url or DEFAULT_BASE_URL).rstrip("/") + if not re.search(r"/v1$", base_url) and base_url.endswith("cli-chat-proxy.grok.com"): + base_url = base_url + "/v1" + + payload: dict[str, Any] = { + "type": "xai", + "auth_kind": "oauth", + "access_token": access_token, + "refresh_token": refresh_token, + "token_type": "Bearer", + "expires_in": int(expires_in), + "expired": expired, + "last_refresh": last_refresh, + "email": (email or "").strip(), + "sub": (sub or "").strip(), + "base_url": base_url, + "token_endpoint": token_endpoint, + "redirect_uri": redirect_uri, + } + if id_token: + payload["id_token"] = id_token.strip() + return payload diff --git a/cpa/writer.py b/cpa/writer.py new file mode 100644 index 0000000..3c1234a --- /dev/null +++ b/cpa/writer.py @@ -0,0 +1,56 @@ +"""原子写 CPA xAI auth 文件(mode 0600)。""" + +from __future__ import annotations + +import json +import os +import tempfile +from pathlib import Path +from typing import Any + +from .schema import credential_file_name + + +def write_cpa_xai_auth( + auth_dir: str | Path, + payload: dict[str, Any], + *, + filename: str | None = None, +) -> Path: + """把 payload 原子写到 auth_dir/xai-.json,返回最终路径。""" + auth_dir = Path(auth_dir).expanduser().resolve() + auth_dir.mkdir(parents=True, exist_ok=True) + + if not filename: + filename = credential_file_name( + str(payload.get("email") or ""), + str(payload.get("sub") or ""), + ) + if not filename.endswith(".json"): + filename = filename + ".json" + + dest = auth_dir / filename + data = json.dumps(payload, indent=2, ensure_ascii=False) + "\n" + + fd, tmp_name = tempfile.mkstemp(prefix=".xai-", suffix=".tmp", dir=str(auth_dir)) + try: + with os.fdopen(fd, "w", encoding="utf-8") as f: + f.write(data) + f.flush() + os.fsync(f.fileno()) + try: + os.chmod(tmp_name, 0o600) + except OSError: + pass + os.replace(tmp_name, dest) + try: + os.chmod(dest, 0o600) + except OSError: + pass + finally: + if os.path.exists(tmp_name): + try: + os.unlink(tmp_name) + except OSError: + pass + return dest diff --git a/cpa_auths/cpa_auth_failed.txt b/cpa_auths/cpa_auth_failed.txt new file mode 100644 index 0000000..42cfabe --- /dev/null +++ b/cpa_auths/cpa_auth_failed.txt @@ -0,0 +1,8 @@ +nl45jetu8c@baoxia.top--------1783812949 +e2dsv3te98@baoxia.top--------1783813013 +2gh9chzsqo@baoxia.top----'searchId'----1783813031 +r62zi7flqw@baoxia.top----device auth timed out waiting for user approval----1783813148 +2bkus632ss@baoxia.top----device auth timed out waiting for user approval----1783813391 +8x4pwvn3zr@baoxia.top---- +与页面的连接已断开。 +版本: 4.1.1.3----1783814849 diff --git a/cpa_auths/xai-0j2ld2ajp9@baoxia.top.json b/cpa_auths/xai-0j2ld2ajp9@baoxia.top.json new file mode 100644 index 0000000..fd0c6e6 --- /dev/null +++ b/cpa_auths/xai-0j2ld2ajp9@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjJhZGMzZmMwLWFkMTctNDA3Yi05NDhiLWJkNzI1NWFjYWVhYiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTc3MCwiaWF0IjoxNzgzODE0MTcwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMmFkYzNmYzAtYWQxNy00MDdiLTk0OGItYmQ3MjU1YWNhZWFiIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiM2YyYWVhM2ItNDI4My00MTg2LWIzMGUtMzg0NWRkNGFmY2MwIiwidGVhbV9pZCI6IjlmY2E2YjRkLWJhMzYtNGU2ZS05ZmU3LTQwZTQ1MzJjNzRkYSJ9.Zav-y_PTi8nj3ZCK_lCVbpwUqWG_JHdbDxROdhjFnQLkbHqwK5KutZbPp2ecGTJJwdvgKjQfqPDH_TTXpvHDAw", + "refresh_token": "XYl1I2zXocqtMcNCMgsKBoZ46DEcurBeZtPXB59Q0q9IGJcVCq4lPZDwsAfUWYZOTmx3M3PidShQ0gdGP2uXoA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:56:10Z", + "last_refresh": "2026-07-11T23:56:11Z", + "email": "0j2ld2ajp9@baoxia.top", + "sub": "2adc3fc0-ad17-407b-948b-bd7255acaeab", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjJhZGMzZmMwLWFkMTctNDA3Yi05NDhiLWJkNzI1NWFjYWVhYiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTc3MCwiaWF0IjoxNzgzODE0MTcwLCJnaXZlbl9uYW1lIjoiUm9iaW4iLCJmYW1pbHlfbmFtZSI6IkhvdSIsImVtYWlsIjoiMGoybGQyYWpwOUBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.3df2kFOlWAR4vF47XdYALrli8xYZMQu0bV2rVyuKxxwjqf4858PTY1RRZTSCZl0sudJho9VEyCd0j9b2RsJ1Bw" +} diff --git a/cpa_auths/xai-0ut3371zzx@baoxia.top.json b/cpa_auths/xai-0ut3371zzx@baoxia.top.json new file mode 100644 index 0000000..252c687 --- /dev/null +++ b/cpa_auths/xai-0ut3371zzx@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjVmODQwOWI2LThkMzQtNDAyZS04YWQzLTllYmVlZDFlOTBiZiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzMzc3MSwiaWF0IjoxNzgzODEyMTcxLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNWY4NDA5YjYtOGQzNC00MDJlLThhZDMtOWViZWVkMWU5MGJmIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYjgzYTc4M2UtY2NmNC00YTdiLTllZWMtYmVjYzNlNWNkM2Q3IiwidGVhbV9pZCI6IjIwOWE2YTE1LTI0YzYtNDU2Ni05Y2Q1LWUxNmQ2M2M1YTc2MSJ9.TK0LydAaPwK2Zd3lDD7pXVDxcZOd2DTWa_fgl6LUSl2DLINmXpZZ9SpDTJyMfvGwNrNiIR-ak49CQGxI-fF_DQ", + "refresh_token": "v19LIsgzoAmy7yisM-mG1ahkSG9CACWUiCBLnudYXceyWhkeI7PPi77LvcH-maO8q49J1MH8waIV8-4E2dfdDA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:22:51Z", + "last_refresh": "2026-07-11T23:22:53Z", + "email": "0ut3371zzx@baoxia.top", + "sub": "5f8409b6-8d34-402e-8ad3-9ebeed1e90bf", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjVmODQwOWI2LThkMzQtNDAyZS04YWQzLTllYmVlZDFlOTBiZiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzMzc3MSwiaWF0IjoxNzgzODEyMTcxLCJnaXZlbl9uYW1lIjoiTGVvIiwiZmFtaWx5X25hbWUiOiJGYW5nIiwiZW1haWwiOiIwdXQzMzcxenp4QGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.mGw0LnOzB5P4vI7r5P0fDht6HZjvgpPJNntYqANDMlsV85lC0rraAyHUYTjuy7cwaKzW1Xoh4wsEDv5JDgv5vQ" +} diff --git a/cpa_auths/xai-1b54x8ixhg@baoxia.top.json b/cpa_auths/xai-1b54x8ixhg@baoxia.top.json new file mode 100644 index 0000000..3ead8e6 --- /dev/null +++ b/cpa_auths/xai-1b54x8ixhg@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImNjMDA5NWNkLTQ0NzctNGJlMS1iZTQzLTVmYzY1NGVlMTU1MSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjE0MCwiaWF0IjoxNzgzODE0NTQwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiY2MwMDk1Y2QtNDQ3Ny00YmUxLWJlNDMtNWZjNjU0ZWUxNTUxIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZjZhZmVlMTktNTZmMC00NzlmLWFiY2YtMGYzNDMxMzg3YWQ3IiwidGVhbV9pZCI6IjZmYzgxMDI4LTU3MzctNGY2My1hZGZkLTNiNzhkNmZkZDVkMyJ9.t94_UOBAs85FEcL_zUUhBi_tV7w5F7UMnYIvR3SP9Lyra6vp6WVmVS7kKInz_cEpoOZghbFJkCpH2NJKzkzsqQ", + "refresh_token": "AKChDVlonejGpDrb-rAfhteNsnp2T6ey_4ZxN3Yk4vFMwnYm1F3t5ebFQ9JqS7P1y_gN2sSptKd74bOaKM6_Pw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:02:20Z", + "last_refresh": "2026-07-12T00:02:20Z", + "email": "1b54x8ixhg@baoxia.top", + "sub": "cc0095cd-4477-4be1-be43-5fc654ee1551", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImNjMDA5NWNkLTQ0NzctNGJlMS1iZTQzLTVmYzY1NGVlMTU1MSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjE0MCwiaWF0IjoxNzgzODE0NTQwLCJnaXZlbl9uYW1lIjoiWGF2aWVyIiwiZmFtaWx5X25hbWUiOiJDaGVuIiwiZW1haWwiOiIxYjU0eDhpeGhnQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.cuaEk_O2ykyT3AjrjmI7rOHu42Z1uyAKj4N8uW8Y46C0qMPQkhavcFJ4znMeoc70cP7vELuV1AIwoMD3BR-mIg" +} diff --git a/cpa_auths/xai-1smfftlfge@baoxia.top.json b/cpa_auths/xai-1smfftlfge@baoxia.top.json new file mode 100644 index 0000000..f06b970 --- /dev/null +++ b/cpa_auths/xai-1smfftlfge@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjU5YWQyNDkzLWFkZDMtNDEwMC1hZDQ1LWM2ZWE1NjE1Y2MwNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDYwNSwiaWF0IjoxNzgzODEzMDA1LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNTlhZDI0OTMtYWRkMy00MTAwLWFkNDUtYzZlYTU2MTVjYzA2IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZmE5ZTI3YTYtYmJiNi00YTU4LTkxYWMtZGEwNDEyZTAyMzU5IiwidGVhbV9pZCI6IjJiMDhkM2IzLTRlMzItNGNjYS1hMDg4LWZhMzMwOTI1MjJmNCJ9.MBUxO7qOzLWV_BOkyoClH3xoTWazsH5csuN0zZFgTa9N_dXwntJO531uld2sszEcSvMP0o4jOIFWv2JNVKiZ9w", + "refresh_token": "HhdiqDE0twHo8BOaFTj7eoDqUz-rXCrDmLHHZvVnK4jbROTF7wocpRgNp8NGHwtc1cMs2-xX--OOP2j_jWm-mA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:36:45Z", + "last_refresh": "2026-07-11T23:36:47Z", + "email": "1smfftlfge@baoxia.top", + "sub": "59ad2493-add3-4100-ad45-c6ea5615cc06", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjU5YWQyNDkzLWFkZDMtNDEwMC1hZDQ1LWM2ZWE1NjE1Y2MwNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDYwNSwiaWF0IjoxNzgzODEzMDA1LCJnaXZlbl9uYW1lIjoiU2ltb24iLCJmYW1pbHlfbmFtZSI6Ilh1IiwiZW1haWwiOiIxc21mZnRsZmdlQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.N2fyXflorOaRkOGuPDfnmYXdB42B_52Pk2N86jAsE5hLTL5UPe6oF1b9KPr9CpzYlwmtSsZVc77QOo7q0W-Y6A" +} diff --git a/cpa_auths/xai-24m63z630y@baoxia.top.json b/cpa_auths/xai-24m63z630y@baoxia.top.json new file mode 100644 index 0000000..307079f --- /dev/null +++ b/cpa_auths/xai-24m63z630y@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjMxZTQ5YTQ3LTMyNjEtNDU2Mi04YmVjLWU0ZjhmYWQ0ODU2OSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzMzgxNCwiaWF0IjoxNzgzODEyMjE0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMzFlNDlhNDctMzI2MS00NTYyLThiZWMtZTRmOGZhZDQ4NTY5IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiODMwY2ZhOTgtYzQ2My00MmE0LWE4NjUtNTYyOGFiODQyYjRhIiwidGVhbV9pZCI6ImI5YzVmNjdiLTQ5NWUtNDQ0ZC04ZTcyLTE4ZmY1ZjQxZTA0MSJ9.DmfOs7yrEWt3DhQwt-6FU72GekXJ4SfSXwQF2eO39ABmB7B3uPm4sdosSWjZgGFSvU-Kq5v-GNpk8Pcd0z6YnA", + "refresh_token": "iYbECsdKqj_Ykyh1qAiUOJc5zk3izm5wA0DMJLrAWraSvfEGxfxR_Y06B1ARbFAPtELvrSTQJHdxz1IPFU7ezg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:23:34Z", + "last_refresh": "2026-07-11T23:23:35Z", + "email": "24m63z630y@baoxia.top", + "sub": "31e49a47-3261-4562-8bec-e4f8fad48569", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjMxZTQ5YTQ3LTMyNjEtNDU2Mi04YmVjLWU0ZjhmYWQ0ODU2OSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzMzgxNCwiaWF0IjoxNzgzODEyMjE0LCJnaXZlbl9uYW1lIjoiTG9nYW4iLCJmYW1pbHlfbmFtZSI6Ik5pZSIsImVtYWlsIjoiMjRtNjN6NjMweUBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.mSx-Nx_86TDAbhAKHHUmV2LahtsLURcVTrcmfRvgM5-srjEmgxLFeyDHs6gdcP_onjqLm3PsMKvXIYau4SQPXg" +} diff --git a/cpa_auths/xai-2bzfrxlnn9@baoxia.top.json b/cpa_auths/xai-2bzfrxlnn9@baoxia.top.json new file mode 100644 index 0000000..8153acd --- /dev/null +++ b/cpa_auths/xai-2bzfrxlnn9@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImJkMTQ5ODRmLWU4MmYtNDkyMi1iOGI0LTc1OTRkYzZjNmVjMSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI0MCwiaWF0IjoxNzgzODEyNjQwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYmQxNDk4NGYtZTgyZi00OTIyLWI4YjQtNzU5NGRjNmM2ZWMxIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMDllYWE1MzMtOTZhOC00Y2IwLTk3Y2YtMzMyY2RiNzlmMTkzIiwidGVhbV9pZCI6IjZhNDE2MDI5LTQyZDItNGZkOS04ZmFkLWM4ZDQ1NmNlNmUxNiJ9.fLnqWBDO1enepu-BHLB-5faZmOoR-3Kv-3Lt_hZmUqqquwosxt-_lJh1cAA_tRnBH1pNx8TgG0XWvcCKhChy6Q", + "refresh_token": "1Tc9xMAQea-fkXIqtbQaUNZZCtRvoIKYBrbW8KQYducukDY06_AZhEC8eT4K3T8NEL2uxEYxKnFxx3moi7Z8Gw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:30:40Z", + "last_refresh": "2026-07-11T23:30:40Z", + "email": "2bzfrxlnn9@baoxia.top", + "sub": "bd14984f-e82f-4922-b8b4-7594dc6c6ec1", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImJkMTQ5ODRmLWU4MmYtNDkyMi1iOGI0LTc1OTRkYzZjNmVjMSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI0MCwiaWF0IjoxNzgzODEyNjQwLCJnaXZlbl9uYW1lIjoiQ2FydGVyIiwiZmFtaWx5X25hbWUiOiJIZSIsImVtYWlsIjoiMmJ6ZnJ4bG5uOUBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.4gFWIz-f1FbquBOT_GqpZhG-P2W1KGyBY1psggsnhW30j2UeDFFWIzVLd1CNK9aGRRxNTaa6Jz98fp9Pl3qdTA" +} diff --git a/cpa_auths/xai-3x9cnfep9r@baoxia.top.json b/cpa_auths/xai-3x9cnfep9r@baoxia.top.json new file mode 100644 index 0000000..0a20505 --- /dev/null +++ b/cpa_auths/xai-3x9cnfep9r@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjJhYjlkOTNhLWY4ZjEtNDcxYS1hYTI5LTBkYTI5ODkwZjRmNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjMyMCwiaWF0IjoxNzgzODE0NzIwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMmFiOWQ5M2EtZjhmMS00NzFhLWFhMjktMGRhMjk4OTBmNGY2IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiY2ZmOGVkOTctZDVmNS00MjY2LWIzZDItOTA0NGQ1ODgxNmVhIiwidGVhbV9pZCI6IjQ0OTI5MmEwLTYyNjAtNDMzYi05YjJjLWYzYTJlZjk3OWE1YyJ9.-JQvsDMEy9Sg64aOAJt_-qIaECKesTzb1lFuEzMlj053XOq5JKFbpJDCY1AVMUBjN75c0KQsuO0rxCVJ6YSDBw", + "refresh_token": "-7rFHjAl6B_xVGGCDBM1kecKp4H6C5gcngTRCP9St85gvZTVpXQ3hUuH6aLfmgrJEWwST6tasvG_5FHosc5RUA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:05:20Z", + "last_refresh": "2026-07-12T00:05:20Z", + "email": "3x9cnfep9r@baoxia.top", + "sub": "2ab9d93a-f8f1-471a-aa29-0da29890f4f6", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjJhYjlkOTNhLWY4ZjEtNDcxYS1hYTI5LTBkYTI5ODkwZjRmNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjMyMCwiaWF0IjoxNzgzODE0NzIwLCJnaXZlbl9uYW1lIjoiRXRoYW4iLCJmYW1pbHlfbmFtZSI6IkxpdSIsImVtYWlsIjoiM3g5Y25mZXA5ckBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.TLJi2MfNGWVTgybvLdE-qEYTQpT3j8j7vdbGUsI7TlsVn1ek7S-cv-vkVeO5AmccOOhrRoHUWz7cKPYxSJ81RA" +} diff --git a/cpa_auths/xai-43wbsq0jyv@baoxia.top.json b/cpa_auths/xai-43wbsq0jyv@baoxia.top.json new file mode 100644 index 0000000..b2d105a --- /dev/null +++ b/cpa_auths/xai-43wbsq0jyv@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImEzNGUxZjE5LWQ3OTUtNDk2Yy1iYTY0LWNkMjIzYTE2MjU4YiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDM1OCwiaWF0IjoxNzgzODEyNzU4LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYTM0ZTFmMTktZDc5NS00OTZjLWJhNjQtY2QyMjNhMTYyNThiIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiOTBiMGY2MzctNDlhNi00NGE1LTg3NzQtZDhlYmE4YTliOGE3IiwidGVhbV9pZCI6IjRkZDA3N2JmLWUxYzQtNDEzMy05MDFmLWE0NTg0ZGIwMjE4NCJ9.YN_d8kxP62XOeps2s--Onfu-13mSJpLD-aXtxCy-A42rJp7oNLqqIgQ7HWr5BA4MsTFFJMLPPRVEUwGGSoZpOA", + "refresh_token": "fNr_odbxZrEqe1ra4eiYjQ4E-NsMKL-A892r8F33tw_h9iAQhqFLnQzYddOwvZZW0RD5TMbLTiqjM1z1SY44Ug", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:32:38Z", + "last_refresh": "2026-07-11T23:32:39Z", + "email": "43wbsq0jyv@baoxia.top", + "sub": "a34e1f19-d795-496c-ba64-cd223a16258b", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImEzNGUxZjE5LWQ3OTUtNDk2Yy1iYTY0LWNkMjIzYTE2MjU4YiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDM1OCwiaWF0IjoxNzgzODEyNzU4LCJnaXZlbl9uYW1lIjoiTG9nYW4iLCJmYW1pbHlfbmFtZSI6IldlaSIsImVtYWlsIjoiNDN3YnNxMGp5dkBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.WeIiuemgTYZGSuGxgiHhXL4WXyUv80EVqLDDG2uYbce89zJ8ijHOiVTGDvR47Bbb_zVUw9WCkPSfAuWqBdV-Sw" +} diff --git a/cpa_auths/xai-4fqwg1izka@zhangyunuo.net.json b/cpa_auths/xai-4fqwg1izka@zhangyunuo.net.json new file mode 100644 index 0000000..14787d7 --- /dev/null +++ b/cpa_auths/xai-4fqwg1izka@zhangyunuo.net.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImJiZDY1MzZjLTI0YmMtNGM0ZC1hNjNhLWE2N2MzYTcyNDJlMCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjU4NCwiaWF0IjoxNzgzODE0OTg0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYmJkNjUzNmMtMjRiYy00YzRkLWE2M2EtYTY3YzNhNzI0MmUwIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMzMzM2MxMTYtOGJiOS00MjA4LThlY2EtOTAyMDQxNDhiZTcyIiwidGVhbV9pZCI6IjJkMDU0YTU4LTkxYTMtNGM0My1hM2ZkLTJiN2NkNTRiZTNlOSJ9.9Eb0duwZBB6iGwEO7zJBI4hGrfg5qf0f6KRnKc4Nqia6cp_6dLfEyeZrglgwfDLwdEloZVGRRecpzrxLRUsIMQ", + "refresh_token": "W-_9Icnkh51hs0UiUn5LfDBi-7WdGknh4vj0ybcCL9LFgHxco5lCqOhx2h6RRdMZ9YURFVUhrqjC375zstOjMQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:09:44Z", + "last_refresh": "2026-07-12T00:09:44Z", + "email": "4fqwg1izka@zhangyunuo.net", + "sub": "bbd6536c-24bc-4c4d-a63a-a67c3a7242e0", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImJiZDY1MzZjLTI0YmMtNGM0ZC1hNjNhLWE2N2MzYTcyNDJlMCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjU4NCwiaWF0IjoxNzgzODE0OTg0LCJnaXZlbl9uYW1lIjoiSGVucnkiLCJmYW1pbHlfbmFtZSI6Ik1hIiwiZW1haWwiOiI0ZnF3ZzFpemthQHpoYW5neXVudW8ubmV0IiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.rasZFGmjfSZVuOedGgUMrFvtRwffO5OpozLql9MQTbvnnOXNtvE8fqV58SSc3Jd784O7DVT6WnVjVYZ8QbD5jw" +} diff --git a/cpa_auths/xai-5u1b4dyaml@baoxia.top.json b/cpa_auths/xai-5u1b4dyaml@baoxia.top.json new file mode 100644 index 0000000..b99f188 --- /dev/null +++ b/cpa_auths/xai-5u1b4dyaml@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjFiMjc3MzY5LWFiZmUtNGQwNy1hZDRkLTQyMDMxMzJjYzVlOCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMwMCwiaWF0IjoxNzgzODEyNzAwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMWIyNzczNjktYWJmZS00ZDA3LWFkNGQtNDIwMzEzMmNjNWU4IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiOTFmYjExY2UtNWQ5YS00NDc2LTlmMGItZWY4ZDgyYjVlMzIxIiwidGVhbV9pZCI6IjViODY5NzU0LTdjZWUtNGE4MC1hNzhmLTNjNTI0ZTBlZDJkNCJ9.73RZHE4YrD4LpP_bE1exxe6mNJy265ZegRVOXPjBG0QaeH-Sf9vFK_Zak4zzLCK1LKlnfHA8i5pjH4Kr-oceYA", + "refresh_token": "jBOp_rhwjSGOcx57YfVUJY-b6xwyNvIPcy2OKWbryN-Re5RGnHb-bcI_jeo0tLZp02zpjr1i7Q_WvoYU8tFNrw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:31:40Z", + "last_refresh": "2026-07-11T23:31:41Z", + "email": "5u1b4dyaml@baoxia.top", + "sub": "1b277369-abfe-4d07-ad4d-4203132cc5e8", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjFiMjc3MzY5LWFiZmUtNGQwNy1hZDRkLTQyMDMxMzJjYzVlOCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMwMCwiaWF0IjoxNzgzODEyNzAwLCJnaXZlbl9uYW1lIjoiWmFuZSIsImZhbWlseV9uYW1lIjoiWmhvdSIsImVtYWlsIjoiNXUxYjRkeWFtbEBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.hnMzXKGG_uvbl4QGhtg46m9Tbm_OgrdcuiWsbhjVoDhM1Mvj2FgRjuOzaorMmgujoP4CYpkunVzyhOSWXFmJrg" +} diff --git a/cpa_auths/xai-5uyyzhwpa7@baoxia.top.json b/cpa_auths/xai-5uyyzhwpa7@baoxia.top.json new file mode 100644 index 0000000..d13c7e2 --- /dev/null +++ b/cpa_auths/xai-5uyyzhwpa7@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjA0YzRlMWY1LWI2NzMtNDJkOC04ZWFlLTkzY2NhMzkyMzM4MiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY1OSwiaWF0IjoxNzgzODEzMDU5LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMDRjNGUxZjUtYjY3My00MmQ4LThlYWUtOTNjY2EzOTIzMzgyIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZjhjYTcwYTYtOThkOC00Yzg2LTllNDQtNzNlYjljOWMzMGQwIiwidGVhbV9pZCI6ImFhN2JhOTEzLTdmZGItNDNiZS05ZDM4LTEyZWJiZTQxZTU0MiJ9.py5tvvAwCt65ZbsJxq4mG2Xbyh_DQp3eGYpZE8fJ4eKWpOqWNTdSIBp_KW3jroZpSrrlDxAMxn-dgd-BgxtweQ", + "refresh_token": "vlvTQKfKdjMXsSZESoti2kHrWF1FnZG6pXcASZBII0A4FImpC8AgPzYHs6-lWfVPcH7sH7kT6nkwxk-b7ZYRmg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:37:39Z", + "last_refresh": "2026-07-11T23:37:39Z", + "email": "5uyyzhwpa7@baoxia.top", + "sub": "04c4e1f5-b673-42d8-8eae-93cca3923382", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjA0YzRlMWY1LWI2NzMtNDJkOC04ZWFlLTkzY2NhMzkyMzM4MiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY1OSwiaWF0IjoxNzgzODEzMDU5LCJnaXZlbl9uYW1lIjoiUGV0ZXIiLCJmYW1pbHlfbmFtZSI6Ill1IiwiZW1haWwiOiI1dXl5emh3cGE3QGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.Bi07eMDcQJOmRRY_lklzvQ2v7X5FLAgXpgOFnCxPsVH2WaON0Lytxgkn0KDP38BmoGnjM9GJwWyHh2ITiJlELw" +} diff --git a/cpa_auths/xai-6042etmmm8@baoxia.top.json b/cpa_auths/xai-6042etmmm8@baoxia.top.json new file mode 100644 index 0000000..f456688 --- /dev/null +++ b/cpa_auths/xai-6042etmmm8@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjRjZDliZjZlLTI0OWEtNDA0Yy1hNjliLTE2NDU3NDhiNzIyNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjE0MCwiaWF0IjoxNzgzODE0NTQwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNGNkOWJmNmUtMjQ5YS00MDRjLWE2OWItMTY0NTc0OGI3MjI2IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiOTBlYTk3N2QtZGQwNS00NjlkLTliMDctMmZlODU4Mjc0ODc1IiwidGVhbV9pZCI6IjJjM2RhMDMwLTU0NTktNGY3OC04YjYyLTJmYzBkNTM1YmE1YSJ9.1wIK8YO6cm8p-iFC3Uk4SmErqhIdODh8yzgih1DnrMYYA0MO7UehOX5NOw825n9fMjsHklM7jyXby3CJ467rlw", + "refresh_token": "7cum4xujXxIHV4i6Mttv_4mlNLLdFhvgqEn8W7Gfa2LB55kCRTu69b4PHr23Ej7MIVIX_yznIWKNelxoPOji2g", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:02:20Z", + "last_refresh": "2026-07-12T00:02:21Z", + "email": "6042etmmm8@baoxia.top", + "sub": "4cd9bf6e-249a-404c-a69b-1645748b7226", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjRjZDliZjZlLTI0OWEtNDA0Yy1hNjliLTE2NDU3NDhiNzIyNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjE0MCwiaWF0IjoxNzgzODE0NTQwLCJnaXZlbl9uYW1lIjoiQ29saW4iLCJmYW1pbHlfbmFtZSI6IldhbmciLCJlbWFpbCI6IjYwNDJldG1tbThAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.MGGErLZGi2x7GVV0ue11saL-2S7tJQpWE-0wrQ0bcAZPPxNB-NT_BiITtuwdVJKpII3cF-Icz_Ugv6Z05SHz9w" +} diff --git a/cpa_auths/xai-607jtxa2km@zhangyunuo.net.json b/cpa_auths/xai-607jtxa2km@zhangyunuo.net.json new file mode 100644 index 0000000..6cfc0b4 --- /dev/null +++ b/cpa_auths/xai-607jtxa2km@zhangyunuo.net.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjM1ZGMwMDBkLTI4OWItNDE4NC1iNjQ2LTY5YzEyZTJiYjk5ZCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjYyOCwiaWF0IjoxNzgzODE1MDI4LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMzVkYzAwMGQtMjg5Yi00MTg0LWI2NDYtNjljMTJlMmJiOTlkIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNGQ0ODZkZWEtNmZiMS00ZGU5LTgxZGEtY2I0M2FkNTEzNjNlIiwidGVhbV9pZCI6ImMyMTI2N2VmLTFlNjgtNDQ2Ny05MWRlLTIyNTE2OTIwZmY3NCJ9._YRr2ckXS8UjC2ssuPiZ_dZcywNQtQPaaDNMbIQdfWrXcTPAIABDis0GbR2Wk6kYuMBLrklR8CDWjJnt_rS3GA", + "refresh_token": "K88wPSHuTYrNvTEVNThwvX0aHtT5p1t-zGu0aV-xmOEWpNgIc5pwMgkA8gvS0wNayxzfSzIW8O4wu7k5SdZCvQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:10:28Z", + "last_refresh": "2026-07-12T00:10:29Z", + "email": "607jtxa2km@zhangyunuo.net", + "sub": "35dc000d-289b-4184-b646-69c12e2bb99d", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjM1ZGMwMDBkLTI4OWItNDE4NC1iNjQ2LTY5YzEyZTJiYjk5ZCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjYyOCwiaWF0IjoxNzgzODE1MDI4LCJnaXZlbl9uYW1lIjoiUm9iaW4iLCJmYW1pbHlfbmFtZSI6IkxpbiIsImVtYWlsIjoiNjA3anR4YTJrbUB6aGFuZ3l1bnVvLm5ldCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.xjrw0a_qkfaECTzqP-lFHrfj6ygaXI-EIVpQdb5RKC2DKqQ53C5ncq4TQ_ZXyhYlcAeDrk9ZBjm_58aPuJly3g" +} diff --git a/cpa_auths/xai-60c3bel0of@baoxia.top.json b/cpa_auths/xai-60c3bel0of@baoxia.top.json new file mode 100644 index 0000000..136b454 --- /dev/null +++ b/cpa_auths/xai-60c3bel0of@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImVjNGVhNjUxLWY5OTctNDE1YS05MjFiLTcyNjVlZTI1OTVhMSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTYyMywiaWF0IjoxNzgzODE0MDIzLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZWM0ZWE2NTEtZjk5Ny00MTVhLTkyMWItNzI2NWVlMjU5NWExIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZjYyNWZhNzMtNDA4Ni00NTA2LWJjOTUtNGNjYmExYzNiM2JjIiwidGVhbV9pZCI6IjIxMjg1ODM5LWE0NGQtNGExZS1iMzNjLWYyOGIzODRkYTUxMSJ9.lLN-K52FmPbWSvQ3PURD2XL-OqgYrlfCGrFQFhHH-6eIF4B8gvkc4EMklI4Yg-uWw_5vcVyvv_Vfu_H-nCge9w", + "refresh_token": "Zin4hD-QZQg9h3yegDxMIdzSkPFiL3EtrcIHCSg5MAarG9Tx4kS5sdeCGUiYD_64ojEs2XJ_nHdapBhbG18kbg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:53:43Z", + "last_refresh": "2026-07-11T23:53:44Z", + "email": "60c3bel0of@baoxia.top", + "sub": "ec4ea651-f997-415a-921b-7265ee2595a1", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImVjNGVhNjUxLWY5OTctNDE1YS05MjFiLTcyNjVlZTI1OTVhMSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTYyMywiaWF0IjoxNzgzODE0MDIzLCJnaXZlbl9uYW1lIjoiRWxpbyIsImZhbWlseV9uYW1lIjoiSmlhbmciLCJlbWFpbCI6IjYwYzNiZWwwb2ZAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.KZZxrf0JlWLQoRH6dfkMUkLt85X8BSXfuXfKFWsa6oOFhyc6udoguMbUce4udwfu_3EnOXsFxFxiYB8tMC_Psg" +} diff --git a/cpa_auths/xai-6331ne6rbc@baoxia.top.json b/cpa_auths/xai-6331ne6rbc@baoxia.top.json new file mode 100644 index 0000000..b326469 --- /dev/null +++ b/cpa_auths/xai-6331ne6rbc@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjdkMzVjZjU2LWQ1MzEtNGJiNC05YzYwLWE4ZDM3YWQwZTQzYSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjAxNiwiaWF0IjoxNzgzODE0NDE2LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiN2QzNWNmNTYtZDUzMS00YmI0LTljNjAtYThkMzdhZDBlNDNhIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZGYzMDkzOWMtMTlkYi00ZTBlLTg3NzgtMDYzZDdkN2Q4ZTYxIiwidGVhbV9pZCI6ImZjZjYyOTlkLWRhODQtNGE3YS1hNmQxLTI4YjE5NzNiMzY5ZiJ9.8gwlQ-6KJpHykXvrwdJTbJ1Av6pG5WSL2rckD5Y4nSyiMldxvhmlhAJn880QjtVTFEgE9V2S7yPMjyP2b8n0CQ", + "refresh_token": "Yz5oP3CQgLa-VLUidzbP7Q50YAA-xWLuXOHZj2YOQFSd-gR3GKMrIv51ToBXer1QZTES194_vls0gEcYf1n_7w", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:00:16Z", + "last_refresh": "2026-07-12T00:00:16Z", + "email": "6331ne6rbc@baoxia.top", + "sub": "7d35cf56-d531-4bb4-9c60-a8d37ad0e43a", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjdkMzVjZjU2LWQ1MzEtNGJiNC05YzYwLWE4ZDM3YWQwZTQzYSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjAxNiwiaWF0IjoxNzgzODE0NDE2LCJnaXZlbl9uYW1lIjoiVmljdG9yIiwiZmFtaWx5X25hbWUiOiJaaGFvIiwiZW1haWwiOiI2MzMxbmU2cmJjQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.DcDBlr4SrKp0P3FrvGZAapo1wbboRJoxjec94iGct6MZA1mO8zNwVUDezjOTVXBui-SlIMUfRRiVmy5EiaEJdg" +} diff --git a/cpa_auths/xai-64uqnvty4h@baoxia.top.json b/cpa_auths/xai-64uqnvty4h@baoxia.top.json new file mode 100644 index 0000000..a72a37a --- /dev/null +++ b/cpa_auths/xai-64uqnvty4h@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImI4YjcwNGMyLWRjN2EtNGUzNi04ZDYyLTViY2QwMDM0MzEwNyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY4MSwiaWF0IjoxNzgzODEzMDgxLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYjhiNzA0YzItZGM3YS00ZTM2LThkNjItNWJjZDAwMzQzMTA3IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiODc5YzExOTEtZjJjOS00MmRmLTkyYjEtMmU4OWM4YjFjOTFjIiwidGVhbV9pZCI6IjFhM2M5OWIxLTM4YWUtNGIzYi05OWY1LWYwOTg2NTVjYmYzNyJ9.bbAoD3upWimHn6cArrd7KvrgmGRwUTQgQjPBKz6UCy-HHf2m-ioQUlja--e_cU-4mMksVh9_IH9t8962lnDOUA", + "refresh_token": "4pyGP264IahCs7dF5jg-RMvMywgOQTJc2r_CnLWXMNbjvwToVDlLoJRPraIVwNgVX-GARWE3S8byMX9VLgaHIw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:38:01Z", + "last_refresh": "2026-07-11T23:38:03Z", + "email": "64uqnvty4h@baoxia.top", + "sub": "b8b704c2-dc7a-4e36-8d62-5bcd00343107", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImI4YjcwNGMyLWRjN2EtNGUzNi04ZDYyLTViY2QwMDM0MzEwNyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY4MSwiaWF0IjoxNzgzODEzMDgxLCJnaXZlbl9uYW1lIjoiV2VzbGV5IiwiZmFtaWx5X25hbWUiOiJUaWFuIiwiZW1haWwiOiI2NHVxbnZ0eTRoQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.4awMRfT6UqehpXXGthFgRADOpZ3gcmrtzyBpiOgICEBoYVVGsKBNqn3T7irtaUs15P6HpdyEnIrXWEn837uZJw" +} diff --git a/cpa_auths/xai-6dbesrztrw@baoxia.top.json b/cpa_auths/xai-6dbesrztrw@baoxia.top.json new file mode 100644 index 0000000..0000699 --- /dev/null +++ b/cpa_auths/xai-6dbesrztrw@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjY4NzgzMmYwLWJlZGYtNDQwYi05OTRlLWQyOWNmNWIzY2I3OSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjE4NywiaWF0IjoxNzgzODE0NTg3LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNjg3ODMyZjAtYmVkZi00NDBiLTk5NGUtZDI5Y2Y1YjNjYjc5IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMWY1ZmNhZDMtYjY0NS00MmEyLTkwNTUtZmIwMzIyZDYyOTBmIiwidGVhbV9pZCI6IjZmOGYyZjkyLTYzOGItNDQ0NC1hMDI2LWRmZjRiZTJhY2Q1MCJ9.PoC_og4QoBoBlQfvBJzZPRpb_uAQhYQ-DgVmAVOnDmB5QXrmQzF2etdkWVIIPuV3x9V4Do2Qp1Rp_8TqwZ-olg", + "refresh_token": "sP4TQToRdrs48BR_lpFciPv6zgDdy2Lj2cp3PBM496mNhDWB7kpAYMqgwTnvyxNJsI1PIkUwaC05VUPfzeSJ2g", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:03:07Z", + "last_refresh": "2026-07-12T00:03:09Z", + "email": "6dbesrztrw@baoxia.top", + "sub": "687832f0-bedf-440b-994e-d29cf5b3cb79", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjY4NzgzMmYwLWJlZGYtNDQwYi05OTRlLWQyOWNmNWIzY2I3OSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjE4NywiaWF0IjoxNzgzODE0NTg3LCJnaXZlbl9uYW1lIjoiVmljdG9yIiwiZmFtaWx5X25hbWUiOiJGdSIsImVtYWlsIjoiNmRiZXNyenRyd0BiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.68zkpkA2hePZy_ijFFzYDuQwA2ZajoQd9Sb8KL6mXhugVqBhNKCDBkODr74xsh3PLJ3EZ2UUYp8CfSTkF0evlA" +} diff --git a/cpa_auths/xai-6kqcobepww@baoxia.top.json b/cpa_auths/xai-6kqcobepww@baoxia.top.json new file mode 100644 index 0000000..41cd604 --- /dev/null +++ b/cpa_auths/xai-6kqcobepww@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjcwM2NhNDVkLTIxMGYtNDBlNC1hYWVkLWJjYzZmYTQ3MWRkMyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjIwOSwiaWF0IjoxNzgzODE0NjA5LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNzAzY2E0NWQtMjEwZi00MGU0LWFhZWQtYmNjNmZhNDcxZGQzIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZTBjNjRlZGMtODExYS00NWZiLTgzYTgtZTczMWRlMjcwZWExIiwidGVhbV9pZCI6IjZhMWY5ODdkLTU1ODYtNDA2Ny1hMjQ3LTQxNmJjMTdlMmVkMSJ9.bs3GLSfF0hhs3kDKmBc-dLThMhhvj4Ql_GNmrz23r_X_PfvWb8sBV2Ts4M1VR4hoPTxk9Ujpust1wlqPjH5iaA", + "refresh_token": "HlCq0Lx_KeF6irCsFznyVtgZLlgySyNtMdhl9yVDOzxa9yuyKgiSPT-6wdbbd8Ybtd_V_c7lnTVolcFAwdbWQg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:03:29Z", + "last_refresh": "2026-07-12T00:03:30Z", + "email": "6kqcobepww@baoxia.top", + "sub": "703ca45d-210f-40e4-aaed-bcc6fa471dd3", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjcwM2NhNDVkLTIxMGYtNDBlNC1hYWVkLWJjYzZmYTQ3MWRkMyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjIwOSwiaWF0IjoxNzgzODE0NjA5LCJnaXZlbl9uYW1lIjoiUm9iaW4iLCJmYW1pbHlfbmFtZSI6IlBlbmciLCJlbWFpbCI6IjZrcWNvYmVwd3dAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.cG8YgM6ZizzJfUOlsDTlCmjECAtVFfwpYhUFjYTe989tNWMjpCpSsOoF1OT6SK8Zk_SEpLXjZAud-c1jaW_bSA" +} diff --git a/cpa_auths/xai-6wcib1d19x@baoxia.top.json b/cpa_auths/xai-6wcib1d19x@baoxia.top.json new file mode 100644 index 0000000..54dc6e6 --- /dev/null +++ b/cpa_auths/xai-6wcib1d19x@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjljMzkyZTQxLTYzNzUtNGIxZC04Yjg2LTAzOWYyMTlhYWRhZSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMyNCwiaWF0IjoxNzgzODEyNzI0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiOWMzOTJlNDEtNjM3NS00YjFkLThiODYtMDM5ZjIxOWFhZGFlIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYjMxMGIyZTktMDNkZi00OTQxLTkxNWMtZDAzZjhlMDQ0ZjA5IiwidGVhbV9pZCI6IjkwYTk1MjE1LThkMmQtNDAyYS1hZjk0LWFkNjE2YWQ2ODEzNSJ9.fe1NY3VmJjYMStfBwu0hwbeyf9z-IMk-4YNH5xJ-E_iH2EQfEZfsznoq-4dkXN8oCvqg2eGgOjoi4gJkgbYlxA", + "refresh_token": "AgYN0PoKyQsK_6n_SPDjJ_22oZBw33KfaZ_NgYFwSYI6Ow8lJYu92lisb4VJWomjdztA8Vai89B8qGS8u4M_CQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:32:04Z", + "last_refresh": "2026-07-11T23:32:06Z", + "email": "6wcib1d19x@baoxia.top", + "sub": "9c392e41-6375-4b1d-8b86-039f219aadae", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjljMzkyZTQxLTYzNzUtNGIxZC04Yjg2LTAzOWYyMTlhYWRhZSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMyNCwiaWF0IjoxNzgzODEyNzI0LCJnaXZlbl9uYW1lIjoiSXZhbiIsImZhbWlseV9uYW1lIjoiU2hpIiwiZW1haWwiOiI2d2NpYjFkMTl4QGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.H8gfXkzHRsx9jpG4sYChixJSmiq_R2XVq2VoPLWLb8uLL1XT-86kpT6Hh9gE9hQSS5jReqASP2mAjGu3m_Bonw" +} diff --git a/cpa_auths/xai-6y1m6p9ejg@baoxia.top.json b/cpa_auths/xai-6y1m6p9ejg@baoxia.top.json new file mode 100644 index 0000000..13c812f --- /dev/null +++ b/cpa_auths/xai-6y1m6p9ejg@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjYwNTU0ZmQ0LTg1NzUtNDFiMy1iMTQyLTFiY2ExYzhjYWQzNCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTY5MiwiaWF0IjoxNzgzODE0MDkyLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNjA1NTRmZDQtODU3NS00MWIzLWIxNDItMWJjYTFjOGNhZDM0IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMTFlZjRiOTYtNmNkMi00OWM4LTk2MjItZTFhOWRkYzI0ODY5IiwidGVhbV9pZCI6IjljMGM5NDkxLWY1ZjMtNDMwZC1iZDdkLWJlMjRlOWVkYzAzMSJ9.OamytVciJWpsL36f6IdNi6VzEm6h4R1RC3H7dIzqZP1GqNSgli1KOzDdEfsy1nQ9tHnQOBTMteDTe5yKEgjKRw", + "refresh_token": "WKimd_ckNXN00Hqn9lnt3-D-6C6p3nq74DM98mnF2wl-HI2mSt6okiFICmQGGcfvvbJslQbRevQUuz3to1EVVw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:54:52Z", + "last_refresh": "2026-07-11T23:54:53Z", + "email": "6y1m6p9ejg@baoxia.top", + "sub": "60554fd4-8575-41b3-b142-1bca1c8cad34", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjYwNTU0ZmQ0LTg1NzUtNDFiMy1iMTQyLTFiY2ExYzhjYWQzNCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTY5MiwiaWF0IjoxNzgzODE0MDkyLCJnaXZlbl9uYW1lIjoiWmFuZSIsImZhbWlseV9uYW1lIjoiUWlhbyIsImVtYWlsIjoiNnkxbTZwOWVqZ0BiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.SNlHVSNn9yEnYs9Pufe0T-gINiMy9FJFE1pGKtc02hGyxExuL1ZOjbQtFiZsNcfNd_J2kYSuXgpa86xA1ErDjA" +} diff --git a/cpa_auths/xai-6ya56uc9cm@baoxia.top.json b/cpa_auths/xai-6ya56uc9cm@baoxia.top.json new file mode 100644 index 0000000..5a14cf0 --- /dev/null +++ b/cpa_auths/xai-6ya56uc9cm@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjAzYWNlOTE3LTRhNGMtNDE2My04YzkyLWI1MjI3NTA2NmY0OCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY0MCwiaWF0IjoxNzgzODEzMDQwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMDNhY2U5MTctNGE0Yy00MTYzLThjOTItYjUyMjc1MDY2ZjQ4IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiM2YzODRkZDQtYThlMS00NjBjLWJiNjAtN2ZlNDk3ZDAyNWM0IiwidGVhbV9pZCI6ImVmOGI5NmQ5LWIxOTAtNGE2OS05NDYwLTQyMmJlZWFhYmJjOSJ9.LVMYFhElyCHmS8MfeNZI_tbiJuPPdZ_op2dNmtEgacx4674WcEfPFSuVy1p5el4Qruaz285KQEdtPpL0hplP0g", + "refresh_token": "2eLWHyOh46IbVPQNAiS1Vttn78UFKlnZicvADhqSerU2Pb7SHLDecNEvHOQYw54XQAS9oXZ3ApsRQITRMua0xw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:37:20Z", + "last_refresh": "2026-07-11T23:37:21Z", + "email": "6ya56uc9cm@baoxia.top", + "sub": "03ace917-4a4c-4163-8c92-b52275066f48", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjAzYWNlOTE3LTRhNGMtNDE2My04YzkyLWI1MjI3NTA2NmY0OCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY0MCwiaWF0IjoxNzgzODEzMDQwLCJnaXZlbl9uYW1lIjoiS2V2aW4iLCJmYW1pbHlfbmFtZSI6IktvbmciLCJlbWFpbCI6IjZ5YTU2dWM5Y21AYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.ouT8YDkgHJh20VvN_M7XeGYEHcupOnxUgONRNIxHBw_7ZImO45rff_w6m0dknjDamXc8bUdq97WZ4ZszYN6BVA" +} diff --git a/cpa_auths/xai-8fpn0gjacl@baoxia.top.json b/cpa_auths/xai-8fpn0gjacl@baoxia.top.json new file mode 100644 index 0000000..79ffefa --- /dev/null +++ b/cpa_auths/xai-8fpn0gjacl@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjRjZmJlNmUyLWZlNzctNGRkYy1iZmExLTRjYmQ2OWYzOTg1ZSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI2MSwiaWF0IjoxNzgzODEyNjYxLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNGNmYmU2ZTItZmU3Ny00ZGRjLWJmYTEtNGNiZDY5ZjM5ODVlIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiODNkMzQyZmYtNDc4Ny00ZTdmLTgyMDAtNjJmNWFhYWM1MGM4IiwidGVhbV9pZCI6ImYxMzUwYzZlLWIxOTItNGM1My05YTU4LWZlZTFiMGEzMjg1MSJ9.R5jGSmAnzgbjKPkmgt9_Y-IC8Npk6iEr0Yyxvk2Ht9SAjBql4Ht0Qcq1Ye7APfQx4JwrQ5Ince0DwkN_1mVKMA", + "refresh_token": "wMSV3EMvMeZWGo14ZeF9iEXLPTudFRcNFjEaPXvGRJRs3IBw5zEA2nttK1vApACM_K0-RgpA5_si9UF1XtTH-w", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:31:01Z", + "last_refresh": "2026-07-11T23:31:02Z", + "email": "8fpn0gjacl@baoxia.top", + "sub": "4cfbe6e2-fe77-4ddc-bfa1-4cbd69f3985e", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjRjZmJlNmUyLWZlNzctNGRkYy1iZmExLTRjYmQ2OWYzOTg1ZSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI2MSwiaWF0IjoxNzgzODEyNjYxLCJnaXZlbl9uYW1lIjoiQWFyb24iLCJmYW1pbHlfbmFtZSI6Ild1IiwiZW1haWwiOiI4ZnBuMGdqYWNsQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.IgxshNtVi-r0VWRfbSDQJjQjMq2LzyulhAW2XGSEt__iZ316nYdUJfmO9s_ysb0LFKMlUGnAqV3364-SaUa12A" +} diff --git a/cpa_auths/xai-8l8swz3y43@zhangyunuo.net.json b/cpa_auths/xai-8l8swz3y43@zhangyunuo.net.json new file mode 100644 index 0000000..197f3e6 --- /dev/null +++ b/cpa_auths/xai-8l8swz3y43@zhangyunuo.net.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjI4NDEwYTJkLTJmZmQtNGRiMi04NWRhLTdiNDgyZDlmZDRhOSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjUzMSwiaWF0IjoxNzgzODE0OTMxLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMjg0MTBhMmQtMmZmZC00ZGIyLTg1ZGEtN2I0ODJkOWZkNGE5IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiOWI3MDU4MDYtYWJkNi00MmJmLTgxZGMtNjcwZmI0MjliYzUyIiwidGVhbV9pZCI6IjMwYjVhYmMxLWYzMTMtNDE5Zi1iMjdmLTg2Zjc3YzRjZGJhNiJ9.Jd6aoyqmU7wgaKbF-ITxR5xKL4Yn9cZzdtinqQeh3Uj8pv68M_Qc-0I9ivQWzoo7LTGWSyv3xUUUDSYHlN4LhA", + "refresh_token": "NLoE-60ba__18wCITr293jeq3o8QEJFIyVgk8inbnJhcPWQIxXl94PWrU_jB4ukCiK_0COxY3XYx1KA_aIakwg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:08:51Z", + "last_refresh": "2026-07-12T00:08:52Z", + "email": "8l8swz3y43@zhangyunuo.net", + "sub": "28410a2d-2ffd-4db2-85da-7b482d9fd4a9", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjI4NDEwYTJkLTJmZmQtNGRiMi04NWRhLTdiNDgyZDlmZDRhOSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjUzMSwiaWF0IjoxNzgzODE0OTMxLCJnaXZlbl9uYW1lIjoiS2V2aW4iLCJmYW1pbHlfbmFtZSI6IlNvbmciLCJlbWFpbCI6IjhsOHN3ejN5NDNAemhhbmd5dW51by5uZXQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.6asMy-wbQYULgtvF9T5MASXl4jnWTwu2PfwLtYhm27Z1aP54_PflaeWe06-__7u8qg-VWjMZOS8Ae0nAAv2Nyw" +} diff --git a/cpa_auths/xai-8lnrhvxe3a@baoxia.top.json b/cpa_auths/xai-8lnrhvxe3a@baoxia.top.json new file mode 100644 index 0000000..095b1f9 --- /dev/null +++ b/cpa_auths/xai-8lnrhvxe3a@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImU1NTg3MTViLTkwNTgtNDE0OC05MzY5LTk2MjJlNTYwNzg3YiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjI4MCwiaWF0IjoxNzgzODE0NjgwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZTU1ODcxNWItOTA1OC00MTQ4LTkzNjktOTYyMmU1NjA3ODdiIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZDM3N2JhMzAtN2U1Ny00YWRjLWIyMWMtNWUzNmE2MTBmMTc4IiwidGVhbV9pZCI6IjIwZWNkNmJjLTE2YzQtNGZiNC05NDI5LWRjYzk1NzNiYzI0MCJ9.BqxhF2wPkWSu6YIG_YnK8ztTn1lhNOM7JC7bFFd_KqD9ndbZ9wxIwlqWe_tzxUizeMXqlmDpjsAmMuSx7qgBJA", + "refresh_token": "GhW1TS7r_rvZVO0P1GbW-izKBZylu195OKV1pnlcDpWE4fY4s3l_fE5jVDG76UQrh4TYdHvLH26soODMi793hQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:04:40Z", + "last_refresh": "2026-07-12T00:04:41Z", + "email": "8lnrhvxe3a@baoxia.top", + "sub": "e558715b-9058-4148-9369-9622e560787b", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImU1NTg3MTViLTkwNTgtNDE0OC05MzY5LTk2MjJlNTYwNzg3YiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjI4MCwiaWF0IjoxNzgzODE0NjgwLCJnaXZlbl9uYW1lIjoiTGVvIiwiZmFtaWx5X25hbWUiOiJZYW8iLCJlbWFpbCI6IjhsbnJodnhlM2FAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.jWcrm18sLi8HlWTI5xt5QX9ato-UfLk43m50fXPWCepd83qA1FwcfX4VR17xyFAqoEaYPsqPVYMVJziubU6PNw" +} diff --git a/cpa_auths/xai-8ujfsqp8zz@baoxia.top.json b/cpa_auths/xai-8ujfsqp8zz@baoxia.top.json new file mode 100644 index 0000000..a0c00ad --- /dev/null +++ b/cpa_auths/xai-8ujfsqp8zz@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImIxODZkMzUwLTdhNTMtNDkzOS05ZWY4LWI2NjU1MGM4MDkxYiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMyOCwiaWF0IjoxNzgzODEyNzI4LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYjE4NmQzNTAtN2E1My00OTM5LTllZjgtYjY2NTUwYzgwOTFiIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYzNiNDg1YTMtNTc2My00MjU3LWEwZWMtMmUxY2RmN2NkNjY0IiwidGVhbV9pZCI6Ijc1N2VhM2Y1LTY2MGQtNDE4My04MzIwLTUzYjBlNzNhYjg5MSJ9.drw882MRb6fU8l4XEQbNEfBJo-VN8B04cam1ticC8tljo4YYx6r-by-7hE8nQHbTBHJdHlyS8vxNqJA7z2M50A", + "refresh_token": "hhBL22ef8dT6mlfLaIRCnZFOcKv_GkSCGstt2uFjAJ3vlkw9Qna0v2UsxwI9vsM5iqsCanD0vERQqZNhvPBVqQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:32:08Z", + "last_refresh": "2026-07-11T23:32:08Z", + "email": "8ujfsqp8zz@baoxia.top", + "sub": "b186d350-7a53-4939-9ef8-b66550c8091b", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImIxODZkMzUwLTdhNTMtNDkzOS05ZWY4LWI2NjU1MGM4MDkxYiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMyOCwiaWF0IjoxNzgzODEyNzI4LCJnaXZlbl9uYW1lIjoiWmFuZSIsImZhbWlseV9uYW1lIjoiWGlvbmciLCJlbWFpbCI6Ijh1amZzcXA4enpAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.9NC9AkbPrW_uXri6b-vHZuIPvJX9OxDvtai0WkqzznFQhcBCUhMM1zbbenu9kNy0O4sPsplosPS6P6h53yXpsg" +} diff --git a/cpa_auths/xai-975h5exlck@baoxia.top.json b/cpa_auths/xai-975h5exlck@baoxia.top.json new file mode 100644 index 0000000..a92540c --- /dev/null +++ b/cpa_auths/xai-975h5exlck@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6Ijc5MGVjMWI4LTVkMzUtNDk4Mi04MTEwLTY0MmE0ODIyOWQyNyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTg0NCwiaWF0IjoxNzgzODE0MjQ0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNzkwZWMxYjgtNWQzNS00OTgyLTgxMTAtNjQyYTQ4MjI5ZDI3IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNjJhNjE0YzItMTI1ZC00ZjNmLTk1NzktYTYzMTJjN2ViNjQwIiwidGVhbV9pZCI6ImM1YmFlYjgxLWMwMzgtNGU5OC1hOTNlLTlkYzQ2MWM4MGFkYyJ9.i47p1fmF2Sz5CTmOzl3-gyy1LjymtH0kqrOjv6FUS4aAs8hA64St8FS7j47f9xm7U-LvCwBDvy-lUEC0wjPs3Q", + "refresh_token": "hzowCfUi4JAJpTnGxuFLkFFRpKCxSwG9op9b0AOAxwVETIHRPT4S9IAfkbOVTOroiafllsRL0PItohnppRHdTw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:57:24Z", + "last_refresh": "2026-07-11T23:57:25Z", + "email": "975h5exlck@baoxia.top", + "sub": "790ec1b8-5d35-4982-8110-642a48229d27", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6Ijc5MGVjMWI4LTVkMzUtNDk4Mi04MTEwLTY0MmE0ODIyOWQyNyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTg0NCwiaWF0IjoxNzgzODE0MjQ0LCJnaXZlbl9uYW1lIjoiTm9haCIsImZhbWlseV9uYW1lIjoiRmFuZyIsImVtYWlsIjoiOTc1aDVleGxja0BiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.DxVB9au-lP6RxC2NgexOPciC6Cf3lUJNHjDpg4qs-E36tcmyf9sE0BKcUgKiCXApZUWwUjr9O5Smxk8AvU0MFA" +} diff --git a/cpa_auths/xai-9reee0ai8h@baoxia.top.json b/cpa_auths/xai-9reee0ai8h@baoxia.top.json new file mode 100644 index 0000000..dcfa3fc --- /dev/null +++ b/cpa_auths/xai-9reee0ai8h@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImY0YjFiNGYzLWMzZjktNDU0ZS1hZTljLThjMTNhNWU5N2Q1OCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTY3NywiaWF0IjoxNzgzODE0MDc3LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZjRiMWI0ZjMtYzNmOS00NTRlLWFlOWMtOGMxM2E1ZTk3ZDU4IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiODRlNjVhYjctNmJiMy00NjY3LWE0NTQtMzhkZjAxOWE3ZmQxIiwidGVhbV9pZCI6IjY0YTA3MGM1LTgxYTUtNGM1Mi1iOWZmLWQ0NmYzNDNlMWQ5NiJ9.ZODhdVNSIjNIqus-SsGCEtZo-EWbm-Db0MFZUAsrNnUL6oFDFn0UeQNnYvAGJg5QUoK-U-yY4LP4DujMF1jgyg", + "refresh_token": "q7u_f566P_B8oh-__IsGT_MVxbm-_0ERR0XK9-cNlzaKR7QIOL8KyWkqua0xJvfwy_IsEk_i2LzDaDN2iwNJyg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:54:37Z", + "last_refresh": "2026-07-11T23:54:38Z", + "email": "9reee0ai8h@baoxia.top", + "sub": "f4b1b4f3-c3f9-454e-ae9c-8c13a5e97d58", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImY0YjFiNGYzLWMzZjktNDU0ZS1hZTljLThjMTNhNWU5N2Q1OCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTY3NywiaWF0IjoxNzgzODE0MDc3LCJnaXZlbl9uYW1lIjoiSnVsaWFuIiwiZmFtaWx5X25hbWUiOiJXdSIsImVtYWlsIjoiOXJlZWUwYWk4aEBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.s6wvLp0V-2FkkpZ5p-g24eFWAL-pdhyOcyonnrPOIBUdkmj18EneCd7ofZ7ggk9Rr4hlH63OEvN1a94IIo4jSA" +} diff --git a/cpa_auths/xai-9siz1a6w9q@baoxia.top.json b/cpa_auths/xai-9siz1a6w9q@baoxia.top.json new file mode 100644 index 0000000..fa25d4b --- /dev/null +++ b/cpa_auths/xai-9siz1a6w9q@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImYyZTRkMmM5LWFhNDAtNDU5Ni04MmQ0LWMwNTZiODFhMmRhZSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTYxNiwiaWF0IjoxNzgzODE0MDE2LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZjJlNGQyYzktYWE0MC00NTk2LTgyZDQtYzA1NmI4MWEyZGFlIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYjU4MjM5MTUtODcwNC00NTk4LWE0OWEtMjgxZWU3OWQ4MTg2IiwidGVhbV9pZCI6IjhjN2ZjMWU1LWQxNmYtNGQ0YS05ZTkwLTQ4MTQzNWEyNjNjNSJ9.HsG_03I-a3I1xQX7Bf7A-SGXOjiS5C_iXxZ7nXBgPBGjUx4T3N2yUu5-6H3ga4apDwrIyY--QcbCnEcz01PGhw", + "refresh_token": "igx8SIpj2f_LOEZ9EaNCbMybEGAqtezza_l8jOBWfTyAXpeQbdq9RnitCC0aZ-6wcqUnt4Nwh7sMFtWdTnitVA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:53:36Z", + "last_refresh": "2026-07-11T23:53:37Z", + "email": "9siz1a6w9q@baoxia.top", + "sub": "f2e4d2c9-aa40-4596-82d4-c056b81a2dae", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImYyZTRkMmM5LWFhNDAtNDU5Ni04MmQ0LWMwNTZiODFhMmRhZSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTYxNiwiaWF0IjoxNzgzODE0MDE2LCJnaXZlbl9uYW1lIjoiTmF0aGFuIiwiZmFtaWx5X25hbWUiOiJGYW5nIiwiZW1haWwiOiI5c2l6MWE2dzlxQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.0uGQuFKuK7q2TPHlSx4eekCvenMMwRqfyPfKjPT30IaTB7AumZI-ML2JVPWaQSLXAdKobXotcOQNT_-V9txnVA" +} diff --git a/cpa_auths/xai-9v4ceax6zm@baoxia.top.json b/cpa_auths/xai-9v4ceax6zm@baoxia.top.json new file mode 100644 index 0000000..849efe2 --- /dev/null +++ b/cpa_auths/xai-9v4ceax6zm@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjhiODY4NWRiLTRmNGItNDJhMy1iNWZlLTdmOTllZGEyZmY0MiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjE0OCwiaWF0IjoxNzgzODE0NTQ4LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiOGI4Njg1ZGItNGY0Yi00MmEzLWI1ZmUtN2Y5OWVkYTJmZjQyIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMmM3ZmY4YjEtOThlZS00OTc0LThkODMtYmM2MzVhZDU0MjgxIiwidGVhbV9pZCI6ImE1NWU0MTgzLTU4ZTItNDExMi05ZTMxLTU5MWI5M2EzN2YyNiJ9.m9tjWY5ownRvXu4v0fbqL3i5dUJyed336wJG05ICiHNAmUm0AHsFRcaGeNZ00qd8l6FVjZj-3_UBBmsrd31mMw", + "refresh_token": "Z_98Yk1YmfrohQtuLTBo1v1LQ4sS5zLKDFc2B-1vWBLhRAzRT9mv98RN8ZhOxvH2KL7GYgLPd089hVhN3_c7iQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:02:28Z", + "last_refresh": "2026-07-12T00:02:28Z", + "email": "9v4ceax6zm@baoxia.top", + "sub": "8b8685db-4f4b-42a3-b5fe-7f99eda2ff42", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjhiODY4NWRiLTRmNGItNDJhMy1iNWZlLTdmOTllZGEyZmY0MiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjE0OCwiaWF0IjoxNzgzODE0NTQ4LCJnaXZlbl9uYW1lIjoiRWxpbyIsImZhbWlseV9uYW1lIjoiVGlhbiIsImVtYWlsIjoiOXY0Y2VheDZ6bUBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.BCmaWjDbRoH-b4p4V5TKHxJUWU_Hw5inpY02gWkR6T_ILoC2XvOAMx8BdCoYUvjhpqqCS8KLxaWdnkMtVQErgw" +} diff --git a/cpa_auths/xai-9vyw4fh3s7@zhangyunuo.net.json b/cpa_auths/xai-9vyw4fh3s7@zhangyunuo.net.json new file mode 100644 index 0000000..e103511 --- /dev/null +++ b/cpa_auths/xai-9vyw4fh3s7@zhangyunuo.net.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjY2NGIxY2UxLTZhMzUtNDk4Mi1iZTQ4LTI1Zjg1ODQ3YTE1NiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjU4MiwiaWF0IjoxNzgzODE0OTgyLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNjY0YjFjZTEtNmEzNS00OTgyLWJlNDgtMjVmODU4NDdhMTU2IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiOTIyM2ZmYjQtNTVkOS00YTNiLTljNGEtZWNkZjdiMTczOTlkIiwidGVhbV9pZCI6IjdiZmZmYWMwLTBhZjktNGQ0MC04MzBhLWJhYTFmYWQ4ZmM1YyJ9.ihsJSnvlaMcjsPQL4K7SM8Uo6DmirH1cB0bDHU-lYiuHIkpISDx_y7VMETpMl_hi_VJsuqxJMkHSW0282wYOCg", + "refresh_token": "zwXF_siYow-9uhgYRD6xQ5Xlk0l8H7SVhV3UAfNB9Gv7ynT9FWyyI09ON87xPiFGI7frWYkmTxvVnSnxyVTYLw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:09:42Z", + "last_refresh": "2026-07-12T00:09:43Z", + "email": "9vyw4fh3s7@zhangyunuo.net", + "sub": "664b1ce1-6a35-4982-be48-25f85847a156", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjY2NGIxY2UxLTZhMzUtNDk4Mi1iZTQ4LTI1Zjg1ODQ3YTE1NiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjU4MiwiaWF0IjoxNzgzODE0OTgyLCJnaXZlbl9uYW1lIjoiTG91aXMiLCJmYW1pbHlfbmFtZSI6IlFpYW8iLCJlbWFpbCI6Ijl2eXc0ZmgzczdAemhhbmd5dW51by5uZXQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.gVyrOnh7MHeofiU7Ie9KKJba-SnCH5GvgGZBHoQKXAQJR7vrAwyDAeswZ5vD5HaRJ0GG6eS0f5nStjrxK-9Piw" +} diff --git a/cpa_auths/xai-a72504smkj@baoxia.top.json b/cpa_auths/xai-a72504smkj@baoxia.top.json new file mode 100644 index 0000000..24e5912 --- /dev/null +++ b/cpa_auths/xai-a72504smkj@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImM4OGQyY2Q2LWNjNGQtNDcwMi1iNjY2LTg0NjA5MTc0MzEyMCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjA2MiwiaWF0IjoxNzgzODE0NDYyLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYzg4ZDJjZDYtY2M0ZC00NzAyLWI2NjYtODQ2MDkxNzQzMTIwIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMWJkN2RkNTMtZTI1YS00ZWZiLWExMDUtNmE5M2U5NGJmZjkwIiwidGVhbV9pZCI6IjI5OGJhMWNkLTQxNTYtNGQ4Ni1hYWE0LTAzZDE4MWEzOWVlZCJ9.YT0rF1OQ0N8S-AmyrdRZgMNZ1Yf41UlMQ4DpJb68O4z5rmoUbkrs2KIjgT_PRIHsq-9RWvte68v9hhJohnXrFQ", + "refresh_token": "dh9s0sLqAft1qmSJGx8sI5eRy5cVOyz77drPDM-23YfaO389K15Acj4Ang4TXXl5N3Fuqbxo63OIwCk7wgzI2A", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:01:02Z", + "last_refresh": "2026-07-12T00:01:03Z", + "email": "a72504smkj@baoxia.top", + "sub": "c88d2cd6-cc4d-4702-b666-846091743120", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImM4OGQyY2Q2LWNjNGQtNDcwMi1iNjY2LTg0NjA5MTc0MzEyMCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjA2MiwiaWF0IjoxNzgzODE0NDYyLCJnaXZlbl9uYW1lIjoiV2VzbGV5IiwiZmFtaWx5X25hbWUiOiJDaGVuIiwiZW1haWwiOiJhNzI1MDRzbWtqQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.bmasc7cxnOVMyOjNtqv2AaLOnDY8c3Ap9Y5kyBNoI2SgXEuQWw8nmimCJ5hMQr5x49_cDgIifdWsXR-4yEkZiA" +} diff --git a/cpa_auths/xai-azh24dkd9w@baoxia.top.json b/cpa_auths/xai-azh24dkd9w@baoxia.top.json new file mode 100644 index 0000000..baf64c3 --- /dev/null +++ b/cpa_auths/xai-azh24dkd9w@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjRhYzU2ZTQ4LTE5MzMtNGJlYi05ZWY0LTEzZjVlOWE3OTc3MSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI0MiwiaWF0IjoxNzgzODEyNjQyLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNGFjNTZlNDgtMTkzMy00YmViLTllZjQtMTNmNWU5YTc5NzcxIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNTZmNWY2NGItYWUyYi00OTYyLThlYTctZmZlM2NiYTMwZTA0IiwidGVhbV9pZCI6ImNiZGNkZWY4LTQ4MGYtNGFjNC1hMDlmLTM4NmVmMWFkY2FhNiJ9.hhf5T6LBmuKexdLK1felOYfCplJljomUU6TUh8E8Iy9-kc6VvU6DbYc020CLJe1msQ_-iMIkRkOqQm9zORqD_w", + "refresh_token": "M60dF8dEe-tVJo7url2dQYkQVcybMnYWMeCZkOKIfNMDkPCIA4Igekj8npEmtNtVB9ophlBAcG-lfwWoQ3f4aQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:30:42Z", + "last_refresh": "2026-07-11T23:30:43Z", + "email": "azh24dkd9w@baoxia.top", + "sub": "4ac56e48-1933-4beb-9ef4-13f5e9a79771", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjRhYzU2ZTQ4LTE5MzMtNGJlYi05ZWY0LTEzZjVlOWE3OTc3MSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI0MiwiaWF0IjoxNzgzODEyNjQyLCJnaXZlbl9uYW1lIjoiTG9nYW4iLCJmYW1pbHlfbmFtZSI6IkxpdSIsImVtYWlsIjoiYXpoMjRka2Q5d0BiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.-WSNGhI-nVSH6iotmEV19Tms5Fw3ibiQAEFo6G4Em-1PG_OSuK8kHLZEGs4wDe75c-vp_jj3FSi-fk6FyuCcnA" +} diff --git a/cpa_auths/xai-bu06oq50vn@baoxia.top.json b/cpa_auths/xai-bu06oq50vn@baoxia.top.json new file mode 100644 index 0000000..db79749 --- /dev/null +++ b/cpa_auths/xai-bu06oq50vn@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImFhY2MzY2Y1LTFmNWEtNDI1Yy1hYjRkLWIzMzI0MGQwOGJlMCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjMzNywiaWF0IjoxNzgzODE0NzM3LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYWFjYzNjZjUtMWY1YS00MjVjLWFiNGQtYjMzMjQwZDA4YmUwIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZmE2MjYzNzItZDA3Zi00NTNmLWI1NTQtY2ExYzk4ZjU3OTk3IiwidGVhbV9pZCI6ImViZmFlZDQ1LTE4MmUtNGQ3Zi1iMWY2LTRlZDFkZWUyMzE1YSJ9.u2pR7gWZO1HyHScsr7jzbqI924_TTu4Zx_ImAGAc0XPMMvbORnCAFHq3fjPryDuxoHB3_u53EZ1fm9niOQ0ewg", + "refresh_token": "3DjqGi1JxMtW0leZoNDjNxgfd-sUPh6VEdT9J0A9JeUANvQBdWG7WvZjq71YbNjzZFjheboFAcPDitNnEKD9MA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:05:37Z", + "last_refresh": "2026-07-12T00:05:38Z", + "email": "bu06oq50vn@baoxia.top", + "sub": "aacc3cf5-1f5a-425c-ab4d-b33240d08be0", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImFhY2MzY2Y1LTFmNWEtNDI1Yy1hYjRkLWIzMzI0MGQwOGJlMCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjMzNywiaWF0IjoxNzgzODE0NzM3LCJnaXZlbl9uYW1lIjoiSnVsaWFuIiwiZmFtaWx5X25hbWUiOiJZdSIsImVtYWlsIjoiYnUwNm9xNTB2bkBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.-ALVHUfH-oN8KMIWhY6XFFOAapXaFyAB3HN8ZwUzGyKHvLlaLHiwm0W54K_TfbXadgn-U3YxGRodL-hg-Z_Z9w" +} diff --git a/cpa_auths/xai-bywnuxdlst@baoxia.top.json b/cpa_auths/xai-bywnuxdlst@baoxia.top.json new file mode 100644 index 0000000..4e9746d --- /dev/null +++ b/cpa_auths/xai-bywnuxdlst@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjFhNTRkM2RjLTFlMGMtNDZlNy1hNWQ2LWJiNGNjZjMyN2EyMyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTg3MCwiaWF0IjoxNzgzODE0MjcwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMWE1NGQzZGMtMWUwYy00NmU3LWE1ZDYtYmI0Y2NmMzI3YTIzIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYzA5OGNiNGMtMDNhYi00Y2I2LTgyMDQtNzYwM2JmMTdhN2I5IiwidGVhbV9pZCI6Ijc5ZmJjMmM0LWI3OWUtNDIzMC1hY2Q0LTI5N2RlZDgzNmZhNCJ9.bnL_gv4-KFmA5XgHymcDYNanDvG4VYgHz04ZCWX1qZAU9LlCOJdw2K1rn3JIiymjB1FbxxyBYdwCIO3bQFcB1A", + "refresh_token": "4LO5GfRmUjKUibsebczhG8WPBH5Rj7r3G5HlenKGnUFPe-LrIL6L9jkVO3iHJiNLTIUm_EteLcBL2SIv1c7Y5A", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:57:50Z", + "last_refresh": "2026-07-11T23:57:50Z", + "email": "bywnuxdlst@baoxia.top", + "sub": "1a54d3dc-1e0c-46e7-a5d6-bb4ccf327a23", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjFhNTRkM2RjLTFlMGMtNDZlNy1hNWQ2LWJiNGNjZjMyN2EyMyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTg3MCwiaWF0IjoxNzgzODE0MjcwLCJnaXZlbl9uYW1lIjoiQXJvbiIsImZhbWlseV9uYW1lIjoiSmlhbmciLCJlbWFpbCI6ImJ5d251eGRsc3RAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.ox0bQZXQYEthoTP3oq03WtAtK7nBvb65GfOVLiVJY83fPjfB6x9wB-Zxjd5OidR-c3dRaJ7kk704Y-xWJpjUhg" +} diff --git a/cpa_auths/xai-e9z947etdd@baoxia.top.json b/cpa_auths/xai-e9z947etdd@baoxia.top.json new file mode 100644 index 0000000..87a09eb --- /dev/null +++ b/cpa_auths/xai-e9z947etdd@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjZkY2RlMmI5LWE3ZjktNDI0Mi1iZjA0LWQ4ZjE2MGMzYTJkYiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDM0NCwiaWF0IjoxNzgzODEyNzQ0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNmRjZGUyYjktYTdmOS00MjQyLWJmMDQtZDhmMTYwYzNhMmRiIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiM2JlMzE3MjgtNjQxYi00N2JhLTg0YzEtOGY5MmU1ZDcyMWRkIiwidGVhbV9pZCI6IjczZjk0NjYwLTNmNGItNGE2Yy05MWFjLTY3MWRhOGQ1NDU1YyJ9.yCyChU7EEWlzvz0bcx8XSXt_4rdMCjIyog_YhS1dnCZHJcN1Swsq_9QE53xbARy3McN3WS9kfNo3DicmqcqK5g", + "refresh_token": "bbosT6izGDEWWWU9w3CuJt6Dx_1yzMqQzJJpcgOLYdhQyKfcWvz5a-sH8Z6-crmVoF95SJR4Dn4PnMDA9RO71Q", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:32:24Z", + "last_refresh": "2026-07-11T23:32:25Z", + "email": "e9z947etdd@baoxia.top", + "sub": "6dcde2b9-a7f9-4242-bf04-d8f160c3a2db", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjZkY2RlMmI5LWE3ZjktNDI0Mi1iZjA0LWQ4ZjE2MGMzYTJkYiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDM0NCwiaWF0IjoxNzgzODEyNzQ0LCJnaXZlbl9uYW1lIjoiVHJpc3RhbiIsImZhbWlseV9uYW1lIjoiTWFvIiwiZW1haWwiOiJlOXo5NDdldGRkQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.aqPiSnFcLj8yvfdTHk0dxvBJzg5Uu8bSEL0iOoxy2jWRUwQ5H73U5q9oMNbvsNujA5yY-96fhVNfL01ze6SNLQ" +} diff --git a/cpa_auths/xai-eejz72mw2o@baoxia.top.json b/cpa_auths/xai-eejz72mw2o@baoxia.top.json new file mode 100644 index 0000000..50a7905 --- /dev/null +++ b/cpa_auths/xai-eejz72mw2o@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjEzZjBiYWJkLTg0ODItNDZkMi05ZWExLTkyNGQ4YzU1MjljMyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjE5OSwiaWF0IjoxNzgzODE0NTk5LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMTNmMGJhYmQtODQ4Mi00NmQyLTllYTEtOTI0ZDhjNTUyOWMzIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNzAyNTM3YTYtN2RmYi00Nzk5LTg4MTQtNmNhODljNjUwZDVjIiwidGVhbV9pZCI6IjYwOWI1ZWQwLTM3MGQtNGM1NS1iMmE4LTIxYTNjYjYyNjExYyJ9.crw62WGCQosGsd1zb1RGX4ehk14LoOnuBM14kX9w1_VspDPwe8XbhpQY5_6xyZhxmY4lSuQVd7ssvULNaNJDjQ", + "refresh_token": "Yv6XlZtZqxRIEqttjpA1BBrQX02zXmhkoJ457_OS_CYc8jvPee95umB0utGdiqvLQWH6TzLeahoBS_JXcrGi-Q", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:03:19Z", + "last_refresh": "2026-07-12T00:03:20Z", + "email": "eejz72mw2o@baoxia.top", + "sub": "13f0babd-8482-46d2-9ea1-924d8c5529c3", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjEzZjBiYWJkLTg0ODItNDZkMi05ZWExLTkyNGQ4YzU1MjljMyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjE5OSwiaWF0IjoxNzgzODE0NTk5LCJnaXZlbl9uYW1lIjoiQWRhbSIsImZhbWlseV9uYW1lIjoiR2FvIiwiZW1haWwiOiJlZWp6NzJtdzJvQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.VzqMjY7e0edSVoaftNdgqlDqM-QUjN1RBH5rYCn6blayo0NpcbFHX3O4RIa7xuiYB_9-5R-H1yYzeiTIN_DC2A" +} diff --git a/cpa_auths/xai-estvdafbw0@baoxia.top.json b/cpa_auths/xai-estvdafbw0@baoxia.top.json new file mode 100644 index 0000000..5a2599e --- /dev/null +++ b/cpa_auths/xai-estvdafbw0@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImZiNmQ0YzE3LTM5NTYtNDM0My04MTdjLWFjNTBkMDA2MWY5OSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI0NSwiaWF0IjoxNzgzODEyNjQ1LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZmI2ZDRjMTctMzk1Ni00MzQzLTgxN2MtYWM1MGQwMDYxZjk5IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMDA3ZjZjMWEtNjE1OS00NjQ3LWIwNTQtMThkNmZmM2ZiZDY4IiwidGVhbV9pZCI6ImFhYWQ3MWUyLTJhZGMtNDc4Ny1iZjViLWZkNGRkZmVlZDlkOSJ9.9FOruPFzxr5S7-B-ClgBQSk2v1yh54umIPnFXhjfWkmos8i1FYNy_cMmjgbgBAOCev3Y7DACP1BGBmDaVgICTA", + "refresh_token": "YyMOjkRAZwdyhC36sK55wCW31HCZXUXkr8h_nv1Q1CnnIipHY2D4PaD0W1IbSFPs-3ap9Ox0rnVYc0u77WAqHg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:30:45Z", + "last_refresh": "2026-07-11T23:30:46Z", + "email": "estvdafbw0@baoxia.top", + "sub": "fb6d4c17-3956-4343-817c-ac50d0061f99", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImZiNmQ0YzE3LTM5NTYtNDM0My04MTdjLWFjNTBkMDA2MWY5OSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI0NSwiaWF0IjoxNzgzODEyNjQ1LCJnaXZlbl9uYW1lIjoiRmVsaXgiLCJmYW1pbHlfbmFtZSI6IkxpbiIsImVtYWlsIjoiZXN0dmRhZmJ3MEBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.gabnoOA7GSlgOXwaRXC2ts4DIZLTPBnexKC2Rui-Mf-eRX21dh38hX6Skg3D6JD7X9gKKDY751IqgK2pBQkKsw" +} diff --git a/cpa_auths/xai-f2fiohvtqg@baoxia.top.json b/cpa_auths/xai-f2fiohvtqg@baoxia.top.json new file mode 100644 index 0000000..133a0ec --- /dev/null +++ b/cpa_auths/xai-f2fiohvtqg@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImEzYzIwOWU2LWJkN2MtNDliZi1hMDgwLTUxMTliZDdiOWU0YiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTkwMiwiaWF0IjoxNzgzODE0MzAyLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYTNjMjA5ZTYtYmQ3Yy00OWJmLWEwODAtNTExOWJkN2I5ZTRiIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiOTcxMDcyNmQtN2E2Ni00M2U5LWFiNDctMWMzNWE4ZjIzMGE5IiwidGVhbV9pZCI6ImIzZDIyZTczLWEyNDAtNGZhNi04ZjUwLTFhNGYxNGMxNTg0NCJ9.GpUrev32NQQk2_Q5hJrlxPYYc-CaLx7ttgSYhFiSCeP3Wm7lW3eFqijx9lqtTGLg3wp7-OmQgu3M-h3sKhV5hA", + "refresh_token": "x16ZDLyDWITFomq3fbaxvWuQRfSwfKW4WKTwEMrp71pg_w5TJVfgnt2ZaxsXCNnTgAKjFb_SHwcZTmK-e711-g", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:58:22Z", + "last_refresh": "2026-07-11T23:58:23Z", + "email": "f2fiohvtqg@baoxia.top", + "sub": "a3c209e6-bd7c-49bf-a080-5119bd7b9e4b", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImEzYzIwOWU2LWJkN2MtNDliZi1hMDgwLTUxMTliZDdiOWU0YiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTkwMiwiaWF0IjoxNzgzODE0MzAyLCJnaXZlbl9uYW1lIjoiUm9iaW4iLCJmYW1pbHlfbmFtZSI6IkJhaSIsImVtYWlsIjoiZjJmaW9odnRxZ0BiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.V0wo-9enLUoXNVyZJOLx3_MJmHJaswoJANfi9qy4gn5iB4FbLFOUswssDcPZw4Pqxmvj151avJJp7laDfCHzng" +} diff --git a/cpa_auths/xai-f7bo80h3lm@baoxia.top.json b/cpa_auths/xai-f7bo80h3lm@baoxia.top.json new file mode 100644 index 0000000..d58ede8 --- /dev/null +++ b/cpa_auths/xai-f7bo80h3lm@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjkzMTlkMWNhLWViZDMtNDQyMi1hNDZmLTgyOGFkODBmN2MwNCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDYzNCwiaWF0IjoxNzgzODEzMDM0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiOTMxOWQxY2EtZWJkMy00NDIyLWE0NmYtODI4YWQ4MGY3YzA0IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiY2U0MmQ3YzItZDVhZi00ZTQzLWFhOWQtNTljNmVjYjI5YWVkIiwidGVhbV9pZCI6ImZkNWM3OTU5LWE5YzctNGY4Mi05YmI2LTMwOWQ0NTA0ZGYxZiJ9.eF132kc_nvHBImk9HozV0Hu3Wx5qniU5KdqGIC_pzIhkXZcB8pbSCYWbcvuBGQ5_x429p2kPgdHMqgkBo90i_w", + "refresh_token": "-YBNvKKdLQrTegWKWg0dyY4ernJlzYYrPb71Rg89sHWzyGQEuRGtL7_y-9eDkajq8eaqNjHjaHU-lknKduZxnA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:37:14Z", + "last_refresh": "2026-07-11T23:37:14Z", + "email": "f7bo80h3lm@baoxia.top", + "sub": "9319d1ca-ebd3-4422-a46f-828ad80f7c04", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjkzMTlkMWNhLWViZDMtNDQyMi1hNDZmLTgyOGFkODBmN2MwNCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDYzNCwiaWF0IjoxNzgzODEzMDM0LCJnaXZlbl9uYW1lIjoiRXpyYSIsImZhbWlseV9uYW1lIjoiU2hhbyIsImVtYWlsIjoiZjdibzgwaDNsbUBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.A3kDi76oPsnMWBacMhQudD-LBLNGNGE26CZOaAhJwjodpA8Wil-HyZKtGfBnb037PCMRYdD6hF32o4zYjT6ZtQ" +} diff --git a/cpa_auths/xai-faiymol7uk@baoxia.top.json b/cpa_auths/xai-faiymol7uk@baoxia.top.json new file mode 100644 index 0000000..147db10 --- /dev/null +++ b/cpa_auths/xai-faiymol7uk@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjM1ODlkOTQwLTk2NjMtNDY3My1iMDNjLTA0YzAzNDA3MzRhMSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI3OCwiaWF0IjoxNzgzODEyNjc4LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMzU4OWQ5NDAtOTY2My00NjczLWIwM2MtMDRjMDM0MDczNGExIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMzM5ODcyYzctMGRmYy00OWZhLWJkZmItNjE4N2E1NWU0NzA5IiwidGVhbV9pZCI6ImI4NzI0NGQ0LTE2MzMtNGRkOS1hZGY2LTgwMTAwNmQyMzczZCJ9.8p3kJ_UpmbU2Lv3cr20mdjkUPLnj6tzjBxpYk7x5HTWkVPbhE3pixOUPcxwniy5aa69HsLLrVJIo6fqfBAREMw", + "refresh_token": "9H_yjeoVbM83IlqKU0coUoOnp-2gmn8WwveunTHl4Qc_TT8T17oic270o2DFmSXTLy6QJMMmHi866cODx9DI5g", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:31:18Z", + "last_refresh": "2026-07-11T23:31:19Z", + "email": "faiymol7uk@baoxia.top", + "sub": "3589d940-9663-4673-b03c-04c0340734a1", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjM1ODlkOTQwLTk2NjMtNDY3My1iMDNjLTA0YzAzNDA3MzRhMSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI3OCwiaWF0IjoxNzgzODEyNjc4LCJnaXZlbl9uYW1lIjoiRmVsaXgiLCJmYW1pbHlfbmFtZSI6IkppYW5nIiwiZW1haWwiOiJmYWl5bW9sN3VrQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.skp7eVX4YJhIvfXWPVZEMOr2mLyYXI4kIFkPDyzY-fBmzl-G3YvJ05IPvt3bvCS-UOb1VSsmSEU76ydTEUjfbA" +} diff --git a/cpa_auths/xai-fia5t2n0og@baoxia.top.json b/cpa_auths/xai-fia5t2n0og@baoxia.top.json new file mode 100644 index 0000000..de0b973 --- /dev/null +++ b/cpa_auths/xai-fia5t2n0og@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjNjZDFmZWM2LTM3NGQtNGU5OS1hMWE3LTMzZTRkNTViMWY2YiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMyMSwiaWF0IjoxNzgzODEyNzIxLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiM2NkMWZlYzYtMzc0ZC00ZTk5LWExYTctMzNlNGQ1NWIxZjZiIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMzMyZDA1YjMtZTBiZi00YjVmLThjYTAtMjQ5OTBjMWNjNzc3IiwidGVhbV9pZCI6ImExNWRmNmM1LWMzNjItNDYzMC04ZWJhLWE3YzRkN2JiNzliNCJ9.xZV41Ch7lZNjndPorM5v9C1FEn114tIgJF2OJMx_uKLejCyZfaKKMFDNl_q0xAZwHhiYrwjo9nMbYHa492QWtw", + "refresh_token": "91FErc6eoevvd4RBGRKLay84nmPoKjNzsLf9fLYibxgNyVRpIlk7fii-nN_PpdvhZxBzQhhEHnsZhOlNiw_Cwg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:32:01Z", + "last_refresh": "2026-07-11T23:32:03Z", + "email": "fia5t2n0og@baoxia.top", + "sub": "3cd1fec6-374d-4e99-a1a7-33e4d55b1f6b", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjNjZDFmZWM2LTM3NGQtNGU5OS1hMWE3LTMzZTRkNTViMWY2YiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMyMSwiaWF0IjoxNzgzODEyNzIxLCJnaXZlbl9uYW1lIjoiSmFzb24iLCJmYW1pbHlfbmFtZSI6Ikx1IiwiZW1haWwiOiJmaWE1dDJuMG9nQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.TuML_fTzOWS072i7FmEM2gswXncGsaocDQJ0YckCKxAmQMolejwTxacwsCv8GquPC337W0m0cJ6aIUfJiZW0Vg" +} diff --git a/cpa_auths/xai-fjfnkokfmh@baoxia.top.json b/cpa_auths/xai-fjfnkokfmh@baoxia.top.json new file mode 100644 index 0000000..a3f3f9e --- /dev/null +++ b/cpa_auths/xai-fjfnkokfmh@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjQyMjNlYmI1LWJhNDAtNGZlYy1iODhkLTUwYzQxOTQ1NWM5ZiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjQ0MCwiaWF0IjoxNzgzODE0ODQwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNDIyM2ViYjUtYmE0MC00ZmVjLWI4OGQtNTBjNDE5NDU1YzlmIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNTNlMzk1Y2MtZDllZC00MDFmLTkwYTItNzc0ZTA0YzMyMzg0IiwidGVhbV9pZCI6Ijg5ZDMzNjUzLWUyNGItNDVhYS1iNWZiLTQ5NDY2MzZlYzE5NiJ9.G7gWninw1Fi0q0ZM_9PBUxnGws5zmhaql3zo2jgx3lCJL__UbhY65F9VlLcF0QGqZEFahKA-zvVaORPPMDzqRA", + "refresh_token": "JKPOyhIjsZcm3_VrOovQU0LYh4IAx2-37kqyNLX5xECP4GKqNcG9vYR0vrovZSb_ev8YHnNV_7ZwTRnpl9VlGQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:07:20Z", + "last_refresh": "2026-07-12T00:07:21Z", + "email": "fjfnkokfmh@baoxia.top", + "sub": "4223ebb5-ba40-4fec-b88d-50c419455c9f", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjQyMjNlYmI1LWJhNDAtNGZlYy1iODhkLTUwYzQxOTQ1NWM5ZiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjQ0MSwiaWF0IjoxNzgzODE0ODQxLCJnaXZlbl9uYW1lIjoiVmljdG9yIiwiZmFtaWx5X25hbWUiOiJZYW4iLCJlbWFpbCI6ImZqZm5rb2tmbWhAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.BzQGtkV59nEONCxjq8yTNpV63wmkHvbwcMIvOXDFC4HCiZpyBFDNJkmhb_OdkqSME6I5-iEby_5BI6G0W9bH_g" +} diff --git a/cpa_auths/xai-fk9342dhhb@baoxia.top.json b/cpa_auths/xai-fk9342dhhb@baoxia.top.json new file mode 100644 index 0000000..0165cfc --- /dev/null +++ b/cpa_auths/xai-fk9342dhhb@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjcyMzQ1OTIzLTBkMmEtNGQ0Yi1iY2NjLWRmYmZhNTBjNTYwYyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTcyMSwiaWF0IjoxNzgzODE0MTIxLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNzIzNDU5MjMtMGQyYS00ZDRiLWJjY2MtZGZiZmE1MGM1NjBjIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNTJjNWUwMTMtYTMxNy00NjIxLTk1NDYtNTUwMTU2ODg3Y2E5IiwidGVhbV9pZCI6ImJlZTM4ODA0LTM3ZjctNDZjMy1hNWNjLTUzYWIzMjI0ZDYzNCJ9.99Lnecry_MD78WmaYdLinLHkySencdHywJbYmYRVediuWZAgqccCPv2XYr-P2HitCME6vt4qYlzsI-5PbMMgHQ", + "refresh_token": "hsPmyEPp8kisnIlHDnWEONAhAE6R_3D8dnbiSu0hzpA1k2A-VMA8g6APGegz7Uh38z9Mlke7rMRjZ-PYx6MTIw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:55:21Z", + "last_refresh": "2026-07-11T23:55:21Z", + "email": "fk9342dhhb@baoxia.top", + "sub": "72345923-0d2a-4d4b-bccc-dfbfa50c560c", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjcyMzQ1OTIzLTBkMmEtNGQ0Yi1iY2NjLWRmYmZhNTBjNTYwYyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTcyMSwiaWF0IjoxNzgzODE0MTIxLCJnaXZlbl9uYW1lIjoiQXJvbiIsImZhbWlseV9uYW1lIjoiRHVhbiIsImVtYWlsIjoiZms5MzQyZGhoYkBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.P_e5n_hPNzW-bpPz4VOn75c-wpGAExv6-Gwoo-RzlDiV2_KVzmStHja7GO9pIm-Filh-5CYxs-CFZLsSRRDNJw" +} diff --git a/cpa_auths/xai-frdco6skje@baoxia.top.json b/cpa_auths/xai-frdco6skje@baoxia.top.json new file mode 100644 index 0000000..ccb3c7c --- /dev/null +++ b/cpa_auths/xai-frdco6skje@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImYxMDk0ZTFiLWQ1NzUtNGM4YS1iM2Q1LWYyMTZiZWRmNmQ0MiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI4OCwiaWF0IjoxNzgzODEyNjg4LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZjEwOTRlMWItZDU3NS00YzhhLWIzZDUtZjIxNmJlZGY2ZDQyIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMTkxNjEwOTUtNWI4OS00M2FhLWIyMWItMmI4NzU4ODEyMmM2IiwidGVhbV9pZCI6IjAxNzlhYWNkLTM5YjAtNGU5Yy1hNjBjLTU5YmVlYmU3OGVhNSJ9.jHmyg_gciVP2F1v2vLC9iCPgfTJplknTQogMboqAoJIbq8cSyXlkinlzGTpmlDeg2diMrVnSOcPxD8O5llTF6Q", + "refresh_token": "AxfR9C9_-fyuHw60h3GmQAJ3JT4OgmSYXO-mm945PGud-fUlYGPO0oJV6G5qCYoqvAAIjqpSOVYvmiXtfVDXhg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:31:28Z", + "last_refresh": "2026-07-11T23:31:29Z", + "email": "frdco6skje@baoxia.top", + "sub": "f1094e1b-d575-4c8a-b3d5-f216bedf6d42", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImYxMDk0ZTFiLWQ1NzUtNGM4YS1iM2Q1LWYyMTZiZWRmNmQ0MiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI4OCwiaWF0IjoxNzgzODEyNjg4LCJnaXZlbl9uYW1lIjoiV2VzbGV5IiwiZmFtaWx5X25hbWUiOiJZdSIsImVtYWlsIjoiZnJkY282c2tqZUBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.3di09LpQRDd9fNGMjBGhaX2ZL9RZsT__O8dXQb82QxVgh5RMblfR2-aljsO_MU5nnBLdvRNhU6DfOYwt7N4OWg" +} diff --git a/cpa_auths/xai-iekcdguksg@baoxia.top.json b/cpa_auths/xai-iekcdguksg@baoxia.top.json new file mode 100644 index 0000000..f9f528d --- /dev/null +++ b/cpa_auths/xai-iekcdguksg@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjJlMTliNzBhLWMzNjQtNDU5Yi04OWQxLTFjODg1YjU4ZmEzNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY3MywiaWF0IjoxNzgzODEzMDczLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMmUxOWI3MGEtYzM2NC00NTliLTg5ZDEtMWM4ODViNThmYTM2IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNTJjMGNhZDQtMGNiYS00ODdhLWJjYmItNTA0ZjFkNjAwMDE2IiwidGVhbV9pZCI6ImE3MDg3ZTg3LWIxM2ItNGRhOC1hYzk3LTRlODZlN2IyMTUxZiJ9.RjsaJa0AGyDAD2pV5IXQsjbLQdOJa6-UfvSaor6vaPb0UQ_jixvYtk53pgLLQh_3Xtg3z_wJ4IQsFXTYmh-h2Q", + "refresh_token": "MrfSViIdIyyeW4pdHgovuW9Combxc4yEwr1RvgBhC6RpTFj-1R2qD0HCw8a9LpusCC6mqhyJ5HFROdV6fc-PhQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:37:53Z", + "last_refresh": "2026-07-11T23:37:53Z", + "email": "iekcdguksg@baoxia.top", + "sub": "2e19b70a-c364-459b-89d1-1c885b58fa36", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjJlMTliNzBhLWMzNjQtNDU5Yi04OWQxLTFjODg1YjU4ZmEzNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY3MywiaWF0IjoxNzgzODEzMDczLCJnaXZlbl9uYW1lIjoiS2V2aW4iLCJmYW1pbHlfbmFtZSI6IlFpbiIsImVtYWlsIjoiaWVrY2RndWtzZ0BiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.mORqQOLQySSXAcPalanxuaEK1Es_P9G4a3-F3kRwzfZLSCMzLNa4PbiAHvYDQHCvTTAF4HPCFUDr1JoL-rU74Q" +} diff --git a/cpa_auths/xai-ixe1hjo645@baoxia.top.json b/cpa_auths/xai-ixe1hjo645@baoxia.top.json new file mode 100644 index 0000000..8efa4b2 --- /dev/null +++ b/cpa_auths/xai-ixe1hjo645@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImYzMGFmZmQ0LWQ4M2EtNGViMC04MGFiLWM4M2I5NjBmYmZjNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDYzNCwiaWF0IjoxNzgzODEzMDM0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZjMwYWZmZDQtZDgzYS00ZWIwLTgwYWItYzgzYjk2MGZiZmM2IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYTc5YmU3MzUtOTE0Ni00YWY4LTgyNTctNjdjNjYzMjBkNDFiIiwidGVhbV9pZCI6IjgwZWMzNWY0LWZkYTYtNDliMi05NzliLWE3NGEwYjQxY2UwZiJ9.8aHUC4setLd9Uzd2eIm26alfGILZsuZ9YEJYgLKCBQ0DAYdD1JFxUVRiagZdYMhtwYhkQnFuxoZ_z2d55Z4bEA", + "refresh_token": "dzbjl7OilC0pfkHByc5w_8aCJXM3lyR8q3qfIWJFIJajoHjbKWklsRtCuiyqgONZsy1wJ1wLzDGc2fNRV80a2g", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:37:14Z", + "last_refresh": "2026-07-11T23:37:17Z", + "email": "ixe1hjo645@baoxia.top", + "sub": "f30affd4-d83a-4eb0-80ab-c83b960fbfc6", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImYzMGFmZmQ0LWQ4M2EtNGViMC04MGFiLWM4M2I5NjBmYmZjNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDYzNCwiaWF0IjoxNzgzODEzMDM0LCJnaXZlbl9uYW1lIjoiS2FpIiwiZmFtaWx5X25hbWUiOiJQYW4iLCJlbWFpbCI6Iml4ZTFoam82NDVAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.qTqhn5O5DPJPjrZDNt-EdgXJn_ce2GJh9Sy-kvFfOM5rxf6sXVe-wdH0p14UDHqiRQqjh22V1w-Fa_EEm71N8g" +} diff --git a/cpa_auths/xai-j4948gddgu@zhangyunuo.net.json b/cpa_auths/xai-j4948gddgu@zhangyunuo.net.json new file mode 100644 index 0000000..da5da59 --- /dev/null +++ b/cpa_auths/xai-j4948gddgu@zhangyunuo.net.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjkzODIxNmIzLWQ4MGItNGY3MC04MDk0LTY0MTQzYjg4OTE4NCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjUyOSwiaWF0IjoxNzgzODE0OTI5LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiOTM4MjE2YjMtZDgwYi00ZjcwLTgwOTQtNjQxNDNiODg5MTg0IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNjliNTU3NGEtMDhiZS00YTNmLWFhNzgtN2Y3Njg0OWM0ODlkIiwidGVhbV9pZCI6IjUyNWE4MmUxLTAyOTItNDA3Yy1iZTgyLThjNTBkOGY4ODI4NyJ9.AOXLVazfLDwIVfyz9-V7NYMJjOVg4bDmSXpq-rK2j-aUZDgdl8YXL76ocXQDcO6v_oKSerT9WVjO3rFPEwO2Tw", + "refresh_token": "ASwiJBL8dlqYPTGabrV9G2siKfLQsxaQbrLQPG4uDPQxPocg4KTXIe_0OHOJiJy50XuG9l-sHz3pn30cK2gbHQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:08:49Z", + "last_refresh": "2026-07-12T00:08:50Z", + "email": "j4948gddgu@zhangyunuo.net", + "sub": "938216b3-d80b-4f70-8094-64143b889184", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjkzODIxNmIzLWQ4MGItNGY3MC04MDk0LTY0MTQzYjg4OTE4NCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjUyOSwiaWF0IjoxNzgzODE0OTI5LCJnaXZlbl9uYW1lIjoiQmxha2UiLCJmYW1pbHlfbmFtZSI6IkNoZW4iLCJlbWFpbCI6Imo0OTQ4Z2RkZ3VAemhhbmd5dW51by5uZXQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.mn-DAyyvm5zTRrHoSewjPhRCwAEghI7VmqQLgvKK9ITctdq6PvqKevQIwMJGOBM80KU9qfIRjFZSeex3ny5vzQ" +} diff --git a/cpa_auths/xai-jlrtj0krf4@baoxia.top.json b/cpa_auths/xai-jlrtj0krf4@baoxia.top.json new file mode 100644 index 0000000..0cdc2ec --- /dev/null +++ b/cpa_auths/xai-jlrtj0krf4@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjY0NWRkNjE1LWUxYmYtNGYyZi1iNDdkLTFjOWZhNjUxODFjYSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI1OCwiaWF0IjoxNzgzODEyNjU4LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNjQ1ZGQ2MTUtZTFiZi00ZjJmLWI0N2QtMWM5ZmE2NTE4MWNhIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMDFjMzJkMjEtNzhjZS00MjUyLTk4NzktY2FhYmQ2MDY2YWQ5IiwidGVhbV9pZCI6Ijg3YWI5MmYxLThlMDktNDcyOS1iNmNiLTNhMzI4YzZjMGM0MCJ9.FhpJg3hFiQuV-ObVNtNyzQiEgA6Rcng8XgVjj0vLDgYU4UUrDuWtTK2zNH9-mTDZ5VopUkPSYvJ7O-e1hy9eMA", + "refresh_token": "pDnFG5GFQRUMU14ycavd4PzuRupze8cds6e4oVQDDK7hiWP0ipXsQRQUgO7FgTtplY70NgJQsOX8B_xXLcNvUg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:30:58Z", + "last_refresh": "2026-07-11T23:30:59Z", + "email": "jlrtj0krf4@baoxia.top", + "sub": "645dd615-e1bf-4f2f-b47d-1c9fa65181ca", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjY0NWRkNjE1LWUxYmYtNGYyZi1iNDdkLTFjOWZhNjUxODFjYSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI1OCwiaWF0IjoxNzgzODEyNjU4LCJnaXZlbl9uYW1lIjoiTm9sYW4iLCJmYW1pbHlfbmFtZSI6Ikh1IiwiZW1haWwiOiJqbHJ0ajBrcmY0QGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.9Amd1Tf0VfOeoFogh4nKDylqdXVk4dxm5wMlS0BrMf2K0J2nx7dHw4pxCDAChqk9W1ub8nD7boPstoqAwxJ91Q" +} diff --git a/cpa_auths/xai-k13oh7mype@baoxia.top.json b/cpa_auths/xai-k13oh7mype@baoxia.top.json new file mode 100644 index 0000000..0775fee --- /dev/null +++ b/cpa_auths/xai-k13oh7mype@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjU1MmFlNDg1LTQxN2EtNGFiNS05YjhlLThjZTk0NDY5MWViYiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTYxNiwiaWF0IjoxNzgzODE0MDE2LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNTUyYWU0ODUtNDE3YS00YWI1LTliOGUtOGNlOTQ0NjkxZWJiIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZDgxODJkZGQtNTlkZS00ZDRiLWJlMTktYjEzZTU2MjhjZjM0IiwidGVhbV9pZCI6ImJjZWEwMzk1LWVmMTctNDFmYS04MGU3LTE0YjlhNGYxZmFlZSJ9.oTwYTa7oxIWET4eqkd4I8M1hi5T6qSpAHalg1etpz5P_GEgKO1YC-ti1XRzPutJZI9iLPyhfoEfqy51a5TLQoQ", + "refresh_token": "R0PGFrHv-XRnmDmZZd5pZ8srv00bc4YYw5qJEKtbaq425YepmA1Q1_Sc9HMwOKY0VQXc0ZGD8WIP9HCCMHg7Yg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:53:36Z", + "last_refresh": "2026-07-11T23:53:38Z", + "email": "k13oh7mype@baoxia.top", + "sub": "552ae485-417a-4ab5-9b8e-8ce944691ebb", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjU1MmFlNDg1LTQxN2EtNGFiNS05YjhlLThjZTk0NDY5MWViYiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTYxNiwiaWF0IjoxNzgzODE0MDE2LCJnaXZlbl9uYW1lIjoiSmFzb24iLCJmYW1pbHlfbmFtZSI6IlRpYW4iLCJlbWFpbCI6ImsxM29oN215cGVAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.SGxonAeNMmheNG6wCp5Kpr5vJomoor2lb5wifutKfkHbJAeuZruo7Sz47p5tTpSdXJ_HlOU2EwJp-kdwcbpq5A" +} diff --git a/cpa_auths/xai-k51heiyx4b@baoxia.top.json b/cpa_auths/xai-k51heiyx4b@baoxia.top.json new file mode 100644 index 0000000..661b8ba --- /dev/null +++ b/cpa_auths/xai-k51heiyx4b@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjNmZGU0MTAzLTYwNWQtNGUyZi1hYjI2LTRiM2FjOTY2NGQ5YSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTczNywiaWF0IjoxNzgzODE0MTM3LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiM2ZkZTQxMDMtNjA1ZC00ZTJmLWFiMjYtNGIzYWM5NjY0ZDlhIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZGQyOWZlYWUtOGE5My00NDM2LWFiZDgtMTQ0MjY3NDNiOGYxIiwidGVhbV9pZCI6Ijk4MTdiYjA4LTAwNzAtNDZlMS05N2E3LTBjYmVlYjA0Y2NiMSJ9.OLDzDrzXQFHPA7bZgscHwT9810uqMdiQMAmKDvU6oJkLITyq7YFe2ZttFMdKrjmxgcdOmjD1ruDBlDMsW6oauA", + "refresh_token": "mxXpQljR9Mg8Z9SAURkDAXUKBqvyjd-w6SiCMS_cS4ZegcJj9QnTrlq6-KvZUouFXO5LRJDpkYhPeaa_ydzmUg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:55:37Z", + "last_refresh": "2026-07-11T23:55:38Z", + "email": "k51heiyx4b@baoxia.top", + "sub": "3fde4103-605d-4e2f-ab26-4b3ac9664d9a", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjNmZGU0MTAzLTYwNWQtNGUyZi1hYjI2LTRiM2FjOTY2NGQ5YSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTczNywiaWF0IjoxNzgzODE0MTM3LCJnaXZlbl9uYW1lIjoiT3dlbiIsImZhbWlseV9uYW1lIjoiTHUiLCJlbWFpbCI6Ims1MWhlaXl4NGJAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.cSe7Ik0OcqAkaLzDwLeci6pSGD-QiPvwkXgAtBviIlBfOZStPsBoy6IOl8pE1XVKIjbwOFyco32uuSGSDrGsrg" +} diff --git a/cpa_auths/xai-kcp3zw9281@baoxia.top.json b/cpa_auths/xai-kcp3zw9281@baoxia.top.json new file mode 100644 index 0000000..df2b0af --- /dev/null +++ b/cpa_auths/xai-kcp3zw9281@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjAxMDEyZTBlLWQ2MGMtNDRjZS04NjQ1LTU1MTRmMDQ1YTJhYSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjQ0NSwiaWF0IjoxNzgzODE0ODQ1LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMDEwMTJlMGUtZDYwYy00NGNlLTg2NDUtNTUxNGYwNDVhMmFhIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiODFmNTk2NjQtMWZhMS00NzhlLWI5NzEtYjRmN2Y0MjUxNjA4IiwidGVhbV9pZCI6IjY1MDE0YmUzLTFmNzYtNGVmMS1hMTNmLTk0YTM2MWFhNjc4YyJ9.irVARgP8qt9R4B5zniyk5igU25Vfq39U8bqLGnfjGpvvNhDZ1Z5UGHL9ivP6oa2DQlvMAsB_YdKLG6oXdq_PcQ", + "refresh_token": "fcNAhG6cQK5272a41Aw4LrmY80L-UR7384zjy3jDx_e9uNAaI_2a22lE9VyXuYhfN7wQquwiyx8uIs2VzkV61A", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:07:25Z", + "last_refresh": "2026-07-12T00:07:26Z", + "email": "kcp3zw9281@baoxia.top", + "sub": "01012e0e-d60c-44ce-8645-5514f045a2aa", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjAxMDEyZTBlLWQ2MGMtNDRjZS04NjQ1LTU1MTRmMDQ1YTJhYSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjQ0NSwiaWF0IjoxNzgzODE0ODQ1LCJnaXZlbl9uYW1lIjoiSGVucnkiLCJmYW1pbHlfbmFtZSI6IlFpYW8iLCJlbWFpbCI6ImtjcDN6dzkyODFAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.109alYzIWle6fhyoTXsKQHF1AjvGGVeVuduemW4yGC2wDhW6c1VL8XRlsv0O0FqA6VbCrsWfSWPjo-NPvHi-Kg" +} diff --git a/cpa_auths/xai-kduly97uxq@baoxia.top.json b/cpa_auths/xai-kduly97uxq@baoxia.top.json new file mode 100644 index 0000000..2abb314 --- /dev/null +++ b/cpa_auths/xai-kduly97uxq@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImE1YmVlOTFjLTkyYmEtNGI3Mi05NGRlLTUwZjIyZDdkZWZhNSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTk1NiwiaWF0IjoxNzgzODE0MzU2LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYTViZWU5MWMtOTJiYS00YjcyLTk0ZGUtNTBmMjJkN2RlZmE1IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiODljMzYwMjYtNjRkZC00YjExLTkxZTUtMjdmZTJmYjhkMzgxIiwidGVhbV9pZCI6IjFlMmFjYjgwLTc3YmQtNDAwZC1hZmFjLTY2YWVhYzBiODNiOCJ9.vHbbIOaFXEuWuZxGHX4sn61vuLxvdbVtId7Hq70n2GFTRVU2rQw4Dh6FOiqpYSaIIyiFUgW_nF44RGzOQB7RhQ", + "refresh_token": "g-1WihzOSJpMTG6L2wNgAErA7i9ASRx1A6Ur1HLM52t7REKNbtxgkHcQs61iCfDwlCHa6YQ8xizKrePXiABKbw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:59:16Z", + "last_refresh": "2026-07-11T23:59:17Z", + "email": "kduly97uxq@baoxia.top", + "sub": "a5bee91c-92ba-4b72-94de-50f22d7defa5", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImE1YmVlOTFjLTkyYmEtNGI3Mi05NGRlLTUwZjIyZDdkZWZhNSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTk1NiwiaWF0IjoxNzgzODE0MzU2LCJnaXZlbl9uYW1lIjoiRWxpbyIsImZhbWlseV9uYW1lIjoiRmFuZyIsImVtYWlsIjoia2R1bHk5N3V4cUBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.blwZJBZAUPmsfJv5r7f_B5AP1z4xqOjSxq_HWQwwN-xQGcZtW8z4uOPyHVG54lyOe8VFU3Qm4BS5m7mlymOgLQ" +} diff --git a/cpa_auths/xai-ki7rmpy5rr@baoxia.top.json b/cpa_auths/xai-ki7rmpy5rr@baoxia.top.json new file mode 100644 index 0000000..1c5d706 --- /dev/null +++ b/cpa_auths/xai-ki7rmpy5rr@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjMxMjMxZjg2LTU0MmItNDA3My1hZjMzLTljZmQ2NDIzMWI1YyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDcxOSwiaWF0IjoxNzgzODEzMTE5LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMzEyMzFmODYtNTQyYi00MDczLWFmMzMtOWNmZDY0MjMxYjVjIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZjAwYzg3ZmItY2YwNi00OTBhLTljYTktNzM0MWE1MTdhMGZkIiwidGVhbV9pZCI6ImNlOGEzNDQ4LTU5OWUtNDkwZi1iNTJlLTMwY2FhOWMyMWI2MyJ9.vLq9JRlgya37AAao4A2zqD7gvNfjn0l9DbxIqwAD9HISEf4BTX8ac3Kyjy_5bJ2AY4P40jherAl6gDjQ8eV_uw", + "refresh_token": "tzco6tRX7HBDAblnUNppZv-mdQQ8gKg3HS39ie_Cfml-kLqZzbbR9zdgXvgDHbyu2HZqBn3aXECUuOF8UOtnrg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:38:39Z", + "last_refresh": "2026-07-11T23:38:40Z", + "email": "ki7rmpy5rr@baoxia.top", + "sub": "31231f86-542b-4073-af33-9cfd64231b5c", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjMxMjMxZjg2LTU0MmItNDA3My1hZjMzLTljZmQ2NDIzMWI1YyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDcxOSwiaWF0IjoxNzgzODEzMTE5LCJnaXZlbl9uYW1lIjoiQmxha2UiLCJmYW1pbHlfbmFtZSI6IkthbmciLCJlbWFpbCI6ImtpN3JtcHk1cnJAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.bbaUmzL4j53uvFR_K1G1csU7RS0KrRetx3W4NGJ3TwiSwH71VYB3TYyvGPIPKyHG9a0e3Q0vNGz0ZcS7BQvsRg" +} diff --git a/cpa_auths/xai-ldnhvgcuog@baoxia.top.json b/cpa_auths/xai-ldnhvgcuog@baoxia.top.json new file mode 100644 index 0000000..1e0ac7e --- /dev/null +++ b/cpa_auths/xai-ldnhvgcuog@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjYyYTNhZjFhLWUxNjktNDA4Yi1iMDk4LTg4M2FiNjdhZGVkOCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzMzcyNCwiaWF0IjoxNzgzODEyMTI0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNjJhM2FmMWEtZTE2OS00MDhiLWIwOTgtODgzYWI2N2FkZWQ4IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiY2EwNDUzZTUtYTg0MC00Mjg1LTk3YTMtMmExNmQ1OGEyNDYxIiwidGVhbV9pZCI6IjllMTBkYTIyLWZkMDctNDhjYi1hMzlkLTNhYmJkZWJjOWUyYiJ9.UFaylZGjvZ0ePEsIJPhFTZU4PZYdQAvGINXkHRyTAzEOJHISqw-nFMGxiiCKrH-d6YjYxUPRL1uPL65giQ3W_w", + "refresh_token": "6b7I9Vp2XGZJ216Az81fT_UPvSajYqIV49QiMjqZqVRtpCuLjevbuA4tBT8dIDFx7HxU_RA4kEoU6rOpW178Hg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:22:04Z", + "last_refresh": "2026-07-11T23:22:05Z", + "email": "ldnhvgcuog@baoxia.top", + "sub": "62a3af1a-e169-408b-b098-883ab67aded8", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjYyYTNhZjFhLWUxNjktNDA4Yi1iMDk4LTg4M2FiNjdhZGVkOCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzMzcyNCwiaWF0IjoxNzgzODEyMTI0LCJnaXZlbl9uYW1lIjoiTHVjYXMiLCJmYW1pbHlfbmFtZSI6IlpoYW5nIiwiZW1haWwiOiJsZG5odmdjdW9nQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.jJkGWs0wAWm_IrsKaofaCozrXGpdKF4Qk9YCVwubQ_XJZkZT2uP0RX7QZrnMisGhYrKGOpe6evtUMBv4xKDJ9Q" +} diff --git a/cpa_auths/xai-lihplift4a@baoxia.top.json b/cpa_auths/xai-lihplift4a@baoxia.top.json new file mode 100644 index 0000000..62ac0b4 --- /dev/null +++ b/cpa_auths/xai-lihplift4a@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImUxOTYwOTFkLTcwNjItNDFiOC05Njg5LTlmOWI1ZGQwMjM0ZCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjA5NCwiaWF0IjoxNzgzODE0NDk0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZTE5NjA5MWQtNzA2Mi00MWI4LTk2ODktOWY5YjVkZDAyMzRkIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiY2VhY2ZkOTMtYzMwMy00ZGMzLWEzMGYtYTBmZWE3ZTEwM2MwIiwidGVhbV9pZCI6IjgxMmYyMzdmLTA5Y2YtNGQ3YS04OWJlLWE0ZGYyZDE1M2M1YSJ9.TzL_FB1LPwQDIN_H_etmHf4PSlszYE3LbrEOoxd9OIdbEYJGA_XoAiXhJLq7sygLD8plaXykIjKDLhuz4hswQA", + "refresh_token": "jGfbr5N1VJcAeuCs1eaq7gu25ZFAP8BGJsKNyAEcXXzz-CHcdo_MLuTPDhfLspberP-m3goNmYzmjLvdkxjQpA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:01:34Z", + "last_refresh": "2026-07-12T00:01:36Z", + "email": "lihplift4a@baoxia.top", + "sub": "e196091d-7062-41b8-9689-9f9b5dd0234d", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImUxOTYwOTFkLTcwNjItNDFiOC05Njg5LTlmOWI1ZGQwMjM0ZCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjA5NCwiaWF0IjoxNzgzODE0NDk0LCJnaXZlbl9uYW1lIjoiQWxleCIsImZhbWlseV9uYW1lIjoiU29uZyIsImVtYWlsIjoibGlocGxpZnQ0YUBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.1mH5ABomYJ6TNuvkAOux87mXDWIBCeIWu2RyTEna0jY4DtMlNRMZ27w4xCNYiRZPE04bwoVGE4PfFHqhfWdvKg" +} diff --git a/cpa_auths/xai-m76yyidh09@baoxia.top.json b/cpa_auths/xai-m76yyidh09@baoxia.top.json new file mode 100644 index 0000000..1e17e00 --- /dev/null +++ b/cpa_auths/xai-m76yyidh09@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImEwNzFiZGE5LTZkNWQtNGEzNy1iODFmLTc4Mjk3YjYwYzc2MiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY5NywiaWF0IjoxNzgzODEzMDk3LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYTA3MWJkYTktNmQ1ZC00YTM3LWI4MWYtNzgyOTdiNjBjNzYyIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiOGZlZTBhYjktNzY0NC00ZTZjLWFkZGMtMmEyOWQ3YzE3NTI3IiwidGVhbV9pZCI6ImViZjEyMGM4LThmNDctNDRmZS04MDkzLThkNGE1NTFiN2YzMCJ9.5pke3XXgGF9W_OGr4SLmm27vq7U6EIhKJnWtXQc17K1fpdOzzLr9MmBj9Uhk8Ee5gWpln7x6XrfhfQSdi55dJg", + "refresh_token": "weAK2dfCxTxo9LrKI6Co26OzeODPn19WlU-Jf6UJ-IrWyLChlOjvFpui0VjOxeOviUIGsVQ6GsULIZZipQniuw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:38:17Z", + "last_refresh": "2026-07-11T23:38:18Z", + "email": "m76yyidh09@baoxia.top", + "sub": "a071bda9-6d5d-4a37-b81f-78297b60c762", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImEwNzFiZGE5LTZkNWQtNGEzNy1iODFmLTc4Mjk3YjYwYzc2MiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY5NywiaWF0IjoxNzgzODEzMDk3LCJnaXZlbl9uYW1lIjoiQWRhbSIsImZhbWlseV9uYW1lIjoiWXUiLCJlbWFpbCI6Im03Nnl5aWRoMDlAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.ay2wfn0D17h2DyfUj6xwNz70s09uuLF4MSL6arus4-kl-TisvYFDZaCB2rFT5bXvMHjdjaO68z4TL7aHu7z4cw" +} diff --git a/cpa_auths/xai-maxdobzdo8@baoxia.top.json b/cpa_auths/xai-maxdobzdo8@baoxia.top.json new file mode 100644 index 0000000..fe48802 --- /dev/null +++ b/cpa_auths/xai-maxdobzdo8@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjAxNGIwZGVmLWUwODAtNDY1MC1iOWE4LTk2Zjk1MDQzMDJjMSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzMzg1OCwiaWF0IjoxNzgzODEyMjU4LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMDE0YjBkZWYtZTA4MC00NjUwLWI5YTgtOTZmOTUwNDMwMmMxIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiY2UxNGRiY2UtNWMzNS00ZGE0LTg1YWItNDg4NjMzNmM0ZDFmIiwidGVhbV9pZCI6IjE5MGJjMDdhLWY4YTItNDY4NC04ODQxLWIxMmQ1MjM5NGFhMSJ9.MTJq0dExBMgsBHlExXtnO1_ycuFpcI84K_w3cyoneR9XqgQ6pGjSrHwWRoLESV6yVtSl1DkmraD7v86zHUpb5g", + "refresh_token": "9wdQ_UuzLga4qu8JQ_dgc-m3e4KdVNgD6r6QOHZKZrDFD2D_4sIki10YZiI0MnHFsKyFiFx7B9sBqZMrqmPrxw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:24:18Z", + "last_refresh": "2026-07-11T23:24:20Z", + "email": "maxdobzdo8@baoxia.top", + "sub": "014b0def-e080-4650-b9a8-96f9504302c1", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjAxNGIwZGVmLWUwODAtNDY1MC1iOWE4LTk2Zjk1MDQzMDJjMSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzMzg1OCwiaWF0IjoxNzgzODEyMjU4LCJnaXZlbl9uYW1lIjoiQWFyb24iLCJmYW1pbHlfbmFtZSI6IlplbmciLCJlbWFpbCI6Im1heGRvYnpkbzhAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.ESRKhrqrZt2JUCgTr7NyjQi-ua0PcUTmNDhEuuHLIEwARyMEy48Qj9Y1wSwBIhWC4-vE03PSlzpocSfN9AiKYQ" +} diff --git a/cpa_auths/xai-mn8sf1iyye@baoxia.top.json b/cpa_auths/xai-mn8sf1iyye@baoxia.top.json new file mode 100644 index 0000000..9596c0b --- /dev/null +++ b/cpa_auths/xai-mn8sf1iyye@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjRjYWI5MjQ5LWYzNzgtNGEyMy04NGNkLTQ2MmIwNTdmNzIxNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI3OSwiaWF0IjoxNzgzODEyNjc5LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNGNhYjkyNDktZjM3OC00YTIzLTg0Y2QtNDYyYjA1N2Y3MjE2IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZjZiNmRjMmItMzY4ZC00ZGU1LWE0OWQtYmYwNTQ1MmRmMzY3IiwidGVhbV9pZCI6ImIyMGVhNGRlLTUzNjMtNDU5OS1hMmU1LWNiZjIzOTMzMjYxNCJ9.Cj5hRmxrItyI7FZPdJTrLKFZ31C6emZv1FLNKDha_ak2oPBQXsVb8GKA0RfFL6pY77HmiKVWOl6xmBy6M3CPWw", + "refresh_token": "Iwm2-7kFgglHwSJzsumJ6_jJ6G2aVXyC2KEbwECBrN46u2M9B2ZKax4Hqkf-k83eX9H-5WWq3oNBN-bhKcSYjA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:31:19Z", + "last_refresh": "2026-07-11T23:31:21Z", + "email": "mn8sf1iyye@baoxia.top", + "sub": "4cab9249-f378-4a23-84cd-462b057f7216", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjRjYWI5MjQ5LWYzNzgtNGEyMy04NGNkLTQ2MmIwNTdmNzIxNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI3OSwiaWF0IjoxNzgzODEyNjc5LCJnaXZlbl9uYW1lIjoiT3NjYXIiLCJmYW1pbHlfbmFtZSI6IlNoYW8iLCJlbWFpbCI6Im1uOHNmMWl5eWVAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.PdCPVr8U2hRZEp9BAQhwmSNOYReBC8lWCljML-uSMNnnTChMtDt8IoP_DTa00yuwV1EVK6aCsKGCD9LZM9WU-A" +} diff --git a/cpa_auths/xai-nb2rgintjk@baoxia.top.json b/cpa_auths/xai-nb2rgintjk@baoxia.top.json new file mode 100644 index 0000000..7e7cca8 --- /dev/null +++ b/cpa_auths/xai-nb2rgintjk@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6Ijk0NWQ5ZTc3LWVmZDgtNDg5YS05YjhiLWZlODE1YTA5MjU4MCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDIzNCwiaWF0IjoxNzgzODEyNjM0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiOTQ1ZDllNzctZWZkOC00ODlhLTliOGItZmU4MTVhMDkyNTgwIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYTU2NzYxYzMtOTFjNy00OWQwLTk0MjAtYTVkYzQ5NDg5M2I2IiwidGVhbV9pZCI6IjliY2JhYmIyLTViODYtNDAwZi04YzJhLTMzNzlhZmU3NDA1MSJ9.nAIRfwbseC_TSywQyht39HM2qadhdVh87dH-IrSenYW1RkJZdy-VHqV9QwsMzhNbAoq_GBxzpMYysqSOt9TjiA", + "refresh_token": "ChMVP0ifYROyMvNgrb1aBkdFakVkCDY6WHTtZyIoXPepVVRwt9rUjRGJ5meMFkQOSWaaeCMmsXbFkPUG7tix1A", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:30:34Z", + "last_refresh": "2026-07-11T23:30:35Z", + "email": "nb2rgintjk@baoxia.top", + "sub": "945d9e77-efd8-489a-9b8b-fe815a092580", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6Ijk0NWQ5ZTc3LWVmZDgtNDg5YS05YjhiLWZlODE1YTA5MjU4MCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDIzNCwiaWF0IjoxNzgzODEyNjM0LCJnaXZlbl9uYW1lIjoiTmVvIiwiZmFtaWx5X25hbWUiOiJEZW5nIiwiZW1haWwiOiJuYjJyZ2ludGprQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.qSa81OpcRRrInyBPxQhKy6_ULB5GIMO4aWoY36hYuwJ3slx-RNVcyh1oLzR-f5JdBxaX4v0TIDce-sbLQuhHzA" +} diff --git a/cpa_auths/xai-nsajm34em7@baoxia.top.json b/cpa_auths/xai-nsajm34em7@baoxia.top.json new file mode 100644 index 0000000..5c13c18 --- /dev/null +++ b/cpa_auths/xai-nsajm34em7@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjUxODQ2OTQ5LWJjMjQtNGEzNy1iOTMxLTU2MDEzZGY1N2ZhNyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI4OCwiaWF0IjoxNzgzODEyNjg4LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNTE4NDY5NDktYmMyNC00YTM3LWI5MzEtNTYwMTNkZjU3ZmE3IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYzQ5MmQ2ODYtODRhNi00ZTZlLWE0YmYtMThhZjM1OWRlYWYzIiwidGVhbV9pZCI6IjE0NGM0OTA5LTQzMjMtNGUyNS05MWJjLTIzMzY4M2VmOWM0OCJ9.ET-2jJG8_hvH2nloDv7V64ijmPakXpwrlC-NJOzVdyqx7cML2ZXsJzIn4VNlbphZhbJUt3xBLmQlt-awtvXp1g", + "refresh_token": "ynetsn4w4xMa0DgxxtlN5GmrlqmORUJX5TWQ8dEDz7QpaaLJoVDW9RAG4YArXQLGoT-AHtr09WWzmq2rz2l6sg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:31:28Z", + "last_refresh": "2026-07-11T23:31:30Z", + "email": "nsajm34em7@baoxia.top", + "sub": "51846949-bc24-4a37-b931-56013df57fa7", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjUxODQ2OTQ5LWJjMjQtNGEzNy1iOTMxLTU2MDEzZGY1N2ZhNyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI4OCwiaWF0IjoxNzgzODEyNjg4LCJnaXZlbl9uYW1lIjoiQ29saW4iLCJmYW1pbHlfbmFtZSI6Ik1hIiwiZW1haWwiOiJuc2FqbTM0ZW03QGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.hg9X7vXeY04diFFrnhprPn9yWIbzE1yP2zYjuVe2dWYkwH1bHUKqWXkEFeZ76W8AXNj_tudXtAhNm5LXfXsevg" +} diff --git a/cpa_auths/xai-o5ghn97cez@baoxia.top.json b/cpa_auths/xai-o5ghn97cez@baoxia.top.json new file mode 100644 index 0000000..59ba9d3 --- /dev/null +++ b/cpa_auths/xai-o5ghn97cez@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImZlODM0Y2QwLTNhMjktNGUwNi1iYTNkLWRlZWIyNjkxMWRhOCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTg5MiwiaWF0IjoxNzgzODE0MjkyLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZmU4MzRjZDAtM2EyOS00ZTA2LWJhM2QtZGVlYjI2OTExZGE4IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMTY3NWFjYzItMjc2OS00MDk4LTg3N2MtYjI0Mzc3MzNiYmE1IiwidGVhbV9pZCI6IjhlYzg4N2FkLTA3MTctNDZjZS05OGIxLTNjZTIyNjg2OTJjNCJ9.xZ5p_FlHx6HpG8XW5JW4SYhUTND-abj3_tYgC_pLkGdi4XYbsBUUl0c1Kla661NyHrIM5pVtYmPXnzHAwEf5gA", + "refresh_token": "KqMvBAf9D2qjjKD-Ybmaoz9F8R_qrUSFUMg0Xo28APriBZnuwWDLScTNFxADTPqULxkV53EHazVC_1tOmDeehw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:58:12Z", + "last_refresh": "2026-07-11T23:58:13Z", + "email": "o5ghn97cez@baoxia.top", + "sub": "fe834cd0-3a29-4e06-ba3d-deeb26911da8", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImZlODM0Y2QwLTNhMjktNGUwNi1iYTNkLWRlZWIyNjkxMWRhOCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTg5MiwiaWF0IjoxNzgzODE0MjkyLCJnaXZlbl9uYW1lIjoiTmVvIiwiZmFtaWx5X25hbWUiOiJTdW4iLCJlbWFpbCI6Im81Z2huOTdjZXpAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.B1lZ_OiFx1UEkRFe6kIeLLEuIXBmXO7Nvxd1o-qm2g2osGX1bHXXyMqbnHNsOjAR637EwLTuh1IJbhhNMG3ITA" +} diff --git a/cpa_auths/xai-o95qnz8bdb@baoxia.top.json b/cpa_auths/xai-o95qnz8bdb@baoxia.top.json new file mode 100644 index 0000000..df1f62c --- /dev/null +++ b/cpa_auths/xai-o95qnz8bdb@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjRlMjhjMzRlLTI1NTUtNGIyNi1hYTg3LWU5N2U5NDE0NzliNSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjI2NywiaWF0IjoxNzgzODE0NjY3LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiNGUyOGMzNGUtMjU1NS00YjI2LWFhODctZTk3ZTk0MTQ3OWI1IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiM2NjZWEwYzUtZTk1OS00YjMwLTg4NzMtMzgzNWZlNjZlMGZjIiwidGVhbV9pZCI6IjdiNzliNzgzLWQwYjQtNDVlMy05YTcxLTYxM2JjYjY3NmRkOSJ9.OEucsH2pjiKJd3b38YdkpHXUD6y86w4jH_YWKwDy4Oww83-Uv1hPFGURu83A93SfMBo2k4LDVQz9GEqL50JV7Q", + "refresh_token": "H1FolvDTByrnG7rSmhNSdM833AyKH9LN9_IqbJonbnEA5KTJrXMUv-Wj2yLYgL8oZpF9WU4OCn4KbVCnbT6ztQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:04:27Z", + "last_refresh": "2026-07-12T00:04:28Z", + "email": "o95qnz8bdb@baoxia.top", + "sub": "4e28c34e-2555-4b26-aa87-e97e941479b5", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjRlMjhjMzRlLTI1NTUtNGIyNi1hYTg3LWU5N2U5NDE0NzliNSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjI2NywiaWF0IjoxNzgzODE0NjY3LCJnaXZlbl9uYW1lIjoiT3NjYXIiLCJmYW1pbHlfbmFtZSI6IkhhbiIsImVtYWlsIjoibzk1cW56OGJkYkBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.VmnSJaIHiljV-NhUH7shRghw-utulDb7_NpAC7MqHMnhHb6tVc06hMArrcyx0hlkz7pBw6gFgMgAAYhLiLimGw" +} diff --git a/cpa_auths/xai-om6aktj95t@baoxia.top.json b/cpa_auths/xai-om6aktj95t@baoxia.top.json new file mode 100644 index 0000000..cde14a9 --- /dev/null +++ b/cpa_auths/xai-om6aktj95t@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImY3OTA0MjdkLWEzZDktNGY5YS04NjYzLTA0MzQ3NjBmMzA5MSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY3NSwiaWF0IjoxNzgzODEzMDc1LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZjc5MDQyN2QtYTNkOS00ZjlhLTg2NjMtMDQzNDc2MGYzMDkxIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZmRkODYzODItOWM5OS00NjkyLTg5ODAtN2NkYjNkNDVhOGU3IiwidGVhbV9pZCI6IjRiODFjZDIyLThkM2QtNDVlZS1iY2JjLWFkNDFiYzE2MWMxZCJ9.NfJmiyyc2vpF_ZCi1TuOz04HTL0YUa-EPAh8r0jBE5t7l-BWkGYljXJeUKgGcuc3aOiohpvy5cc2pCTpDQLQ-w", + "refresh_token": "0_5k9XQDHYTnPMquEuvsCgNTB-28c1BNlDnmSckbi7MWIKqC7YDtEhz4lbtpXY-abqIpLxZS1QfbBy4vyu7O_w", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:37:55Z", + "last_refresh": "2026-07-11T23:37:56Z", + "email": "om6aktj95t@baoxia.top", + "sub": "f790427d-a3d9-4f9a-8663-0434760f3091", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImY3OTA0MjdkLWEzZDktNGY5YS04NjYzLTA0MzQ3NjBmMzA5MSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY3NSwiaWF0IjoxNzgzODEzMDc1LCJnaXZlbl9uYW1lIjoiTGlhbSIsImZhbWlseV9uYW1lIjoiSGUiLCJlbWFpbCI6Im9tNmFrdGo5NXRAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.NFNF-8RoSKJH2n3mdmR17PEuiIEyTivloYIs15ySMEdgLOiABbKj7D06-lg9czB_C-vnMzBMwqQD9scOuwqK0Q" +} diff --git a/cpa_auths/xai-omogi0azbx@baoxia.top.json b/cpa_auths/xai-omogi0azbx@baoxia.top.json new file mode 100644 index 0000000..f37fd94 --- /dev/null +++ b/cpa_auths/xai-omogi0azbx@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImIzZjRkYmIzLTI4MzktNGNiNy05Yjg4LTJhZDNiMjM0MmE3YSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTk0MCwiaWF0IjoxNzgzODE0MzQwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYjNmNGRiYjMtMjgzOS00Y2I3LTliODgtMmFkM2IyMzQyYTdhIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYzM5Mjk2NmUtZTUwYS00NjFiLWI0ZDEtYTIzZGZjYTA5MWYwIiwidGVhbV9pZCI6IjQ0ODlmNzAyLTY3YzMtNGZjNS04ZTk1LTgzYmNjNDk4MjEyNyJ9.CHDwiuksEdD0DbYqfByGwyttIYDrqb1kR1k86KWbBWAgL1MhYCTgMtR1eqQglmyIgUXKwPcZhj8rUl2J4GvBpw", + "refresh_token": "A0EabWO368gE3jHHpjHnJH4GSh1OL8QH_RfJpDKAGZcp6veHZ2uK7btBx8zz_qc8bbDX_SyzcSGRDc4wNS8Kdw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:59:00Z", + "last_refresh": "2026-07-11T23:59:01Z", + "email": "omogi0azbx@baoxia.top", + "sub": "b3f4dbb3-2839-4cb7-9b88-2ad3b2342a7a", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImIzZjRkYmIzLTI4MzktNGNiNy05Yjg4LTJhZDNiMjM0MmE3YSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTk0MCwiaWF0IjoxNzgzODE0MzQwLCJnaXZlbl9uYW1lIjoiQWFyb24iLCJmYW1pbHlfbmFtZSI6IlFpbiIsImVtYWlsIjoib21vZ2kwYXpieEBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.pOx_gi7gFTaFfFMleEFv6mIBkZoZFk2G_s2RKF-VQW86pjqQ99Z_LDRW7p8ojxJWDMgd0flO-_471fKBvt1SOg" +} diff --git a/cpa_auths/xai-p2mduw32zz@baoxia.top.json b/cpa_auths/xai-p2mduw32zz@baoxia.top.json new file mode 100644 index 0000000..ad260f7 --- /dev/null +++ b/cpa_auths/xai-p2mduw32zz@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjE3NTM0OTBlLTg2MDQtNGQ4OC1hMzlhLTI3ZGY3ZGZlZmY0YyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTczNywiaWF0IjoxNzgzODE0MTM3LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMTc1MzQ5MGUtODYwNC00ZDg4LWEzOWEtMjdkZjdkZmVmZjRjIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZTk3OWUzNWUtZTgzZS00MjZjLWFjOWQtYjVjYjVkM2Y5MTJkIiwidGVhbV9pZCI6ImU2OTdkZTQ4LWI1ZjItNDgwYS04NGVkLWVhOGEzOThmYzBjYSJ9.L7cRVKqOtxajGAYzQhFKB4PkErC_zcYt2-ePd78sYYD0TkaioXRO1lDqs_qNDWXCtBK_AZCt55Y4pyLPEDqIBQ", + "refresh_token": "hOt_wdAxArj0GJdM4BJbnORJt-5yhj8zZsI0N8kx8azghGKP7l7MBY0e_02TEZG8Qd8vhxHj_xkZOKd7hfSl5w", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:55:37Z", + "last_refresh": "2026-07-11T23:55:38Z", + "email": "p2mduw32zz@baoxia.top", + "sub": "1753490e-8604-4d88-a39a-27df7dfeff4c", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjE3NTM0OTBlLTg2MDQtNGQ4OC1hMzlhLTI3ZGY3ZGZlZmY0YyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTczNywiaWF0IjoxNzgzODE0MTM3LCJnaXZlbl9uYW1lIjoiTmF0aGFuIiwiZmFtaWx5X25hbWUiOiJMdSIsImVtYWlsIjoicDJtZHV3MzJ6ekBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.VfOcZ-ujCMQzJDmOUoz19yd4cuI9A9EDgA85srs81aohmTGwaEGoCcNNY3f4-xjz2YmEyKRe8DXTk31jeDxemQ" +} diff --git a/cpa_auths/xai-q08qn1kpmz@baoxia.top.json b/cpa_auths/xai-q08qn1kpmz@baoxia.top.json new file mode 100644 index 0000000..3822215 --- /dev/null +++ b/cpa_auths/xai-q08qn1kpmz@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImVhNDBlOThjLWExYmUtNDgyZC1iNzJkLWI4OGQxZTgwNTcxYyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTc5MiwiaWF0IjoxNzgzODE0MTkyLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZWE0MGU5OGMtYTFiZS00ODJkLWI3MmQtYjg4ZDFlODA1NzFjIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMmFlYmFhZGQtNGE3Ni00NDQ5LWFhMzItNGQ4NzJiNWQ5MDE1IiwidGVhbV9pZCI6ImEwNGU5MzViLWVhNDktNDk5Ni05OTljLTdkNDYyMTU1MTRmYiJ9.-FCWF1H-WtmHHb6USHA9U5fQyNfgkvEDoeG9Od8yb5ArrS1oSMWx1SddM8bhQiZgdjB8wUFGWi7cqi7pMcMJFQ", + "refresh_token": "3Ta6VFtgFvsbBGGfDCrml0iGHX7Xse01b3W6M4KgjYUFJrzcsJn9JEuMANsYMOCWr-HP__EVsU2u3_V3PHIHsw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:56:32Z", + "last_refresh": "2026-07-11T23:56:32Z", + "email": "q08qn1kpmz@baoxia.top", + "sub": "ea40e98c-a1be-482d-b72d-b88d1e80571c", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImVhNDBlOThjLWExYmUtNDgyZC1iNzJkLWI4OGQxZTgwNTcxYyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTc5MiwiaWF0IjoxNzgzODE0MTkyLCJnaXZlbl9uYW1lIjoiQnJpYW4iLCJmYW1pbHlfbmFtZSI6IlplbmciLCJlbWFpbCI6InEwOHFuMWtwbXpAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.KlAvFD8oR_J97cKRc3lUPzf3llbXQaTWR-zDtMuMX3wkRoMwwTXMh5-aN62qGaTzewVR9KAz9PWefBQl91rgSg" +} diff --git a/cpa_auths/xai-q2nqpgidjv@baoxia.top.json b/cpa_auths/xai-q2nqpgidjv@baoxia.top.json new file mode 100644 index 0000000..9e5e44c --- /dev/null +++ b/cpa_auths/xai-q2nqpgidjv@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjE5MTUxNzdlLTEwZGYtNDU4MC04YTA3LTViYmRiOGY0ZWY5OSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjI2NiwiaWF0IjoxNzgzODE0NjY2LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMTkxNTE3N2UtMTBkZi00NTgwLThhMDctNWJiZGI4ZjRlZjk5IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMDJlY2Y3ZDctNzgyNy00ZjM5LTkzYWUtMDcwMzc0ZGU3ZmQ4IiwidGVhbV9pZCI6ImZkYTNhMjY0LTI4MDMtNGFkZC04ZTI5LWU3OTkyMGIwNjE1YyJ9.lezYa7T_Sr5gFpJoMVLmGw2FqZ3tZLx15mYU2E_HZdIgDT_iyqjdPNWLD1_3sM2UD0yNfA1JznRbNP7Vf9tcRg", + "refresh_token": "UbjD_OilDfLM3Vry0t73BcIaF8_3Wkfo7MJB9ixBQWYf3f7bfOLaeyI78ACESmtiW8lqtJY7sxNMrI-tHvV1aQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:04:26Z", + "last_refresh": "2026-07-12T00:04:28Z", + "email": "q2nqpgidjv@baoxia.top", + "sub": "1915177e-10df-4580-8a07-5bbdb8f4ef99", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjE5MTUxNzdlLTEwZGYtNDU4MC04YTA3LTViYmRiOGY0ZWY5OSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjI2NiwiaWF0IjoxNzgzODE0NjY2LCJnaXZlbl9uYW1lIjoiQXJvbiIsImZhbWlseV9uYW1lIjoiVGlhbiIsImVtYWlsIjoicTJucXBnaWRqdkBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.it14wSEXuas_gc56MGqENdin-jSftbN6kQ1KPnBlJ7qPBS5ESMydRLN6mD3jP5OrkILVSjfRAxDeT9_c1gVpow" +} diff --git a/cpa_auths/xai-rb27ceq176@baoxia.top.json b/cpa_auths/xai-rb27ceq176@baoxia.top.json new file mode 100644 index 0000000..e2242bb --- /dev/null +++ b/cpa_auths/xai-rb27ceq176@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjMyMjRjMGRhLWYyOGYtNDViNy1iZjhjLTc1OTEyNGFmYjkwNyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMxMSwiaWF0IjoxNzgzODEyNzExLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMzIyNGMwZGEtZjI4Zi00NWI3LWJmOGMtNzU5MTI0YWZiOTA3IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiOTlkNDM3NTUtNmZiNy00YWNjLWI2MjQtNzJhMWZiZjk0YmU0IiwidGVhbV9pZCI6IjViMWVhZGQyLWU4NDEtNDVjMS05MGE5LTJjNTc2NWQzM2EyNCJ9.yM5kKSMPe24mA8wweSGuOr5xpOFEfa9dBBWtNQVLcbiQG0wVkRxXdToJnYnW2wncXKoJ5abt6qY8o47PnNDsnw", + "refresh_token": "fkdDXYI_GoAjtQvhsrh6WdJx326y3PUN0nVCgYsSiIcThIU1gzGT_Hhktyd9A5vf-2dLyMK2bqO8qImmfhqLLw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:31:51Z", + "last_refresh": "2026-07-11T23:31:51Z", + "email": "rb27ceq176@baoxia.top", + "sub": "3224c0da-f28f-45b7-bf8c-759124afb907", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjMyMjRjMGRhLWYyOGYtNDViNy1iZjhjLTc1OTEyNGFmYjkwNyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMxMSwiaWF0IjoxNzgzODEyNzExLCJnaXZlbl9uYW1lIjoiVmljdG9yIiwiZmFtaWx5X25hbWUiOiJHYW8iLCJlbWFpbCI6InJiMjdjZXExNzZAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.zT744lgxlaG5Uwumq2WLSAYhuN_TkinWLaZo7MKSO10oLG07UVmTtVMrBtRUB4L4V4pB9tzrCiU7CqDrdFImSQ" +} diff --git a/cpa_auths/xai-s4n7ekbaku@baoxia.top.json b/cpa_auths/xai-s4n7ekbaku@baoxia.top.json new file mode 100644 index 0000000..7f9eebd --- /dev/null +++ b/cpa_auths/xai-s4n7ekbaku@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImJjNWQ1NjgwLTQyMmUtNDI2Ni05OGRhLTQzNTI4MzQyZTNlOCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjAzOSwiaWF0IjoxNzgzODE0NDM5LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYmM1ZDU2ODAtNDIyZS00MjY2LTk4ZGEtNDM1MjgzNDJlM2U4IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiOGJkMzIwYzgtMjk3Ny00MTNlLWE3ZDUtMmQxZWU3ODUxNDhmIiwidGVhbV9pZCI6IjVlZTA2MWY5LTg0NWYtNGQwNC1hZDUzLTY1MWRkMjI0ZGI1ZiJ9.BP6eSb1xDXIW2Xtryy-iwSdXE7oOXXIqy10_8VLEIy6fl3sl6AVF3eICFF0yFUbjvWRlKfrJLB-CSYz8TmRChQ", + "refresh_token": "c3GSvrIVj_ORmX3jSsOwJtdFoFTaAEbkG6RbIsbSY3kgUX_p8pWi960m3RNnE3xTCERmzajey0ZMjYknufxezA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:00:39Z", + "last_refresh": "2026-07-12T00:00:41Z", + "email": "s4n7ekbaku@baoxia.top", + "sub": "bc5d5680-422e-4266-98da-43528342e3e8", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImJjNWQ1NjgwLTQyMmUtNDI2Ni05OGRhLTQzNTI4MzQyZTNlOCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjAzOSwiaWF0IjoxNzgzODE0NDM5LCJnaXZlbl9uYW1lIjoiTWlsZXMiLCJmYW1pbHlfbmFtZSI6IllhbmciLCJlbWFpbCI6InM0bjdla2Jha3VAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.DGBlq-B7KPEN1Ukc3dOPApvR459w7CRI8amdP4b2J_wNmx8lbYDfxPy4CxMG716lzWLKrbxmRxCmj2-BWx2Y_A" +} diff --git a/cpa_auths/xai-t1b5dkoy8p@baoxia.top.json b/cpa_auths/xai-t1b5dkoy8p@baoxia.top.json new file mode 100644 index 0000000..f1acaa0 --- /dev/null +++ b/cpa_auths/xai-t1b5dkoy8p@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImZjYWJiOTZjLTdkOTYtNDk5Ni04ZWVlLTVjZjZhOTM5ZGI1MSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjM0NCwiaWF0IjoxNzgzODE0NzQ0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZmNhYmI5NmMtN2Q5Ni00OTk2LThlZWUtNWNmNmE5MzlkYjUxIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYTlhOGNhY2ItNmU0ZC00ZWM2LTg5ZGItNzhlODE3NjQ0ZTUwIiwidGVhbV9pZCI6IjliYTk2MzBiLTQ4NmMtNDQxOS1iODVhLTk1YzFmNmNmZWJlNyJ9.0gqdCIDnMkirt8gDMmE5FjHmoRL5AXuuY0Vroo_Lxf4Qb9tSdXnv8pyVUOnutU5_JzRtlskKxENu6IrdP64InA", + "refresh_token": "pTnjyFqK-GyWnAyopSeassuaq64BU66o8SGUDF07RbEgampk2MfsEOz9264YWDF7VQCI8k_TVMAd3UyR6jj06Q", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:05:44Z", + "last_refresh": "2026-07-12T00:05:45Z", + "email": "t1b5dkoy8p@baoxia.top", + "sub": "fcabb96c-7d96-4996-8eee-5cf6a939db51", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImZjYWJiOTZjLTdkOTYtNDk5Ni04ZWVlLTVjZjZhOTM5ZGI1MSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjM0NCwiaWF0IjoxNzgzODE0NzQ0LCJnaXZlbl9uYW1lIjoiQWxleCIsImZhbWlseV9uYW1lIjoiWXUiLCJlbWFpbCI6InQxYjVka295OHBAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.l9PzM4gmwyUu0Q8zAY8CIEBlg_LlPkTpm0_Z96MIJI_65v0A2mOxG-nWEjZSvQskj1t2FiRjGFmFV0YmN6uEeQ" +} diff --git a/cpa_auths/xai-t52djkzaix@baoxia.top.json b/cpa_auths/xai-t52djkzaix@baoxia.top.json new file mode 100644 index 0000000..f733447 --- /dev/null +++ b/cpa_auths/xai-t52djkzaix@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjM3NWJkOTRiLWI3ZGEtNDE2NC1hNGQ2LWE3ZDgzZDMwMGI2ZiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDA3NCwiaWF0IjoxNzgzODEyNDc0LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMzc1YmQ5NGItYjdkYS00MTY0LWE0ZDYtYTdkODNkMzAwYjZmIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMmJhNThiMGMtOGE1MC00ZjJjLTg4ZTUtNmJlYTM4YjZmMTY2IiwidGVhbV9pZCI6IjllMTUzZDg3LTBjZmYtNDJkMi1iODZkLTBlMTZjODIxZmExZSJ9._jak0JfTNgOHV0tFQh6QDs50nI9nuItT-UhB6v7g-lgN_v5yUPbAHcK0ZGvEOmE3ffNfCkAk-rwMgL2DJ59WQg", + "refresh_token": "HP_4n8RobTOOLof7bEqBog31aowBIBUzJ2Uj4uxaqDj6BY2JQWm9laliGDAHn8Or1KqovFEzcU-GS6jK_WXhcQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:27:54Z", + "last_refresh": "2026-07-11T23:27:55Z", + "email": "t52djkzaix@baoxia.top", + "sub": "375bd94b-b7da-4164-a4d6-a7d83d300b6f", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjM3NWJkOTRiLWI3ZGEtNDE2NC1hNGQ2LWE3ZDgzZDMwMGI2ZiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDA3NCwiaWF0IjoxNzgzODEyNDc0LCJnaXZlbl9uYW1lIjoiSmFzb24iLCJmYW1pbHlfbmFtZSI6IlRpYW4iLCJlbWFpbCI6InQ1MmRqa3phaXhAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.Ehhqgq1Q7JKVRmi40zU-_QemAVOBryRWoDF4W4lpdhtlz4QHPZYsmmxtb9pA2_9gZ0vU2nQPWYLqtLrHd0Ui3w" +} diff --git a/cpa_auths/xai-u7ahgimo1x@baoxia.top.json b/cpa_auths/xai-u7ahgimo1x@baoxia.top.json new file mode 100644 index 0000000..4331e95 --- /dev/null +++ b/cpa_auths/xai-u7ahgimo1x@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjEyNDFkOTkxLWM2NTYtNDY3NS04MmEzLTZiZWE2MzZmOGUyNCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDcwMywiaWF0IjoxNzgzODEzMTAzLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMTI0MWQ5OTEtYzY1Ni00Njc1LTgyYTMtNmJlYTYzNmY4ZTI0IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYzI5Nzc2OTAtYjI4OC00OWIyLTkyOGItZGI2YjgwZGEyY2YxIiwidGVhbV9pZCI6IjhiMDZjMWU2LTI3NTItNGY5OS1hMmY5LTAzOWU1MGNkZDIzMiJ9.rYuGzy6NdTVBV3pfd98XpC1sjU8F74hR60gPv8EUGVXziYO92AlUJu4GFB00w3Qb_ddmxlCQhZlmT9Eq38s5Kw", + "refresh_token": "WrqP8C--9Aq5Nf3D9YXCEgpq0v10SzcxHOqamfU0ndKRldbZfrVBhSP9MQBocv5hrGM2AwWU6FOkqjQkPZ6XYw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:38:23Z", + "last_refresh": "2026-07-11T23:38:24Z", + "email": "u7ahgimo1x@baoxia.top", + "sub": "1241d991-c656-4675-82a3-6bea636f8e24", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjEyNDFkOTkxLWM2NTYtNDY3NS04MmEzLTZiZWE2MzZmOGUyNCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDcwMywiaWF0IjoxNzgzODEzMTAzLCJnaXZlbl9uYW1lIjoiWGF2aWVyIiwiZmFtaWx5X25hbWUiOiJDaGVuIiwiZW1haWwiOiJ1N2FoZ2ltbzF4QGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.B61nfqo43ZM1dJ8iycsKYmiC7ei1Y5ESE6M_uymtDO6K93SEAxBEBC6Ao4mY7hTUUCu8SVsay0emubMvO7Iwew" +} diff --git a/cpa_auths/xai-vi6utfhjzl@baoxia.top.json b/cpa_auths/xai-vi6utfhjzl@baoxia.top.json new file mode 100644 index 0000000..d918783 --- /dev/null +++ b/cpa_auths/xai-vi6utfhjzl@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjBjYTVlNmU0LTY1MzktNDQxNS1hNDcyLTZmMDdiZDg0MzhmMCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY0MCwiaWF0IjoxNzgzODEzMDQwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMGNhNWU2ZTQtNjUzOS00NDE1LWE0NzItNmYwN2JkODQzOGYwIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNGU4ZThjN2EtMzNiNC00YTc2LWEyYWMtNTNiNjQ0ZmFhOTI3IiwidGVhbV9pZCI6ImNiM2U0YWMxLTliZjktNDFlMC04YzA2LTUzYjkwODA2ODE4NCJ9.eRvD0z6MbaE0wLoO0HkxdENrPj73gvqIjyNNKf9N1s77nRKsvTkdp7ZBg1iq9T74kxLgnTNWJ_SHVNfdWUQ8uw", + "refresh_token": "tsZfce7gRkqMywe5ekg9jlLbnogZhEcjdKZBcPYcdr5irEK_khy0vibsPK34KtY_vAJvKPii81zrzeGXeIKVdQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:37:20Z", + "last_refresh": "2026-07-11T23:37:21Z", + "email": "vi6utfhjzl@baoxia.top", + "sub": "0ca5e6e4-6539-4415-a472-6f07bd8438f0", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjBjYTVlNmU0LTY1MzktNDQxNS1hNDcyLTZmMDdiZDg0MzhmMCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDY0MCwiaWF0IjoxNzgzODEzMDQwLCJnaXZlbl9uYW1lIjoiQWRhbSIsImZhbWlseV9uYW1lIjoiRmFuZyIsImVtYWlsIjoidmk2dXRmaGp6bEBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.v_GoNNfo9ii6WqrYJNm1Cd6eCvhpXSgk2_kn-vYdgqbapEJUYtQVQVToZhh6mWsZN2fAnRyld_ccVZ-N1HHjLw" +} diff --git a/cpa_auths/xai-wme8fqq49h@baoxia.top.json b/cpa_auths/xai-wme8fqq49h@baoxia.top.json new file mode 100644 index 0000000..1205be4 --- /dev/null +++ b/cpa_auths/xai-wme8fqq49h@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImQ3ZTgyYTk1LTYzYjQtNDg3NS05ZDU3LWVmYjNlMmUzYjMxOCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDcwNSwiaWF0IjoxNzgzODEzMTA1LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZDdlODJhOTUtNjNiNC00ODc1LTlkNTctZWZiM2UyZTNiMzE4IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNzQyNGQwMGItMDVmZi00ODcyLThlZjItM2Q2MjAxMmM0NmZmIiwidGVhbV9pZCI6IjI3NDEwZjdlLTY0MjktNDQ1OS1hZDQ0LWZkZTI3N2I1MTdjOCJ9.yueQS3SHIH8KYKmNGcUqH4dox_3o9JwIpwR0wUvcdDQT6iv_erI_DOQGEI3zWfE51iyGQWVEz1I766_wmwsWfA", + "refresh_token": "bDfHdkc-qwrdtyYWsUBiXxMmZPhUsKD68QhieI7bSiFKpI6mkzesK4rHjTsTwg4QLE4ha-a4cAwiJa6fBs560Q", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:38:25Z", + "last_refresh": "2026-07-11T23:38:27Z", + "email": "wme8fqq49h@baoxia.top", + "sub": "d7e82a95-63b4-4875-9d57-efb3e2e3b318", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImQ3ZTgyYTk1LTYzYjQtNDg3NS05ZDU3LWVmYjNlMmUzYjMxOCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDcwNSwiaWF0IjoxNzgzODEzMTA1LCJnaXZlbl9uYW1lIjoiRWxpbyIsImZhbWlseV9uYW1lIjoiU2hhbyIsImVtYWlsIjoid21lOGZxcTQ5aEBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.VLYbOdeknuEhOG-z2sX_CX3iRk-oFp0BmCqZh-BvuDVF-tPGjaWOxWtwAVvmxekcCjDvcoi1H4CFMxm3uW35WA" +} diff --git a/cpa_auths/xai-wnjhqq4yjk@zhangyunuo.net.json b/cpa_auths/xai-wnjhqq4yjk@zhangyunuo.net.json new file mode 100644 index 0000000..4aac28b --- /dev/null +++ b/cpa_auths/xai-wnjhqq4yjk@zhangyunuo.net.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjBmZDNhM2YyLTNjNTYtNDNhMy05MzM3LWQ4N2U3NmJiNmVjNyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjUyOCwiaWF0IjoxNzgzODE0OTI4LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMGZkM2EzZjItM2M1Ni00M2EzLTkzMzctZDg3ZTc2YmI2ZWM3IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYjZjMTZhOWYtNDAxNy00YmYyLWIyZmQtYjcxNzFhYWU5MDJkIiwidGVhbV9pZCI6IjM5ZWU0ZTIwLTU3MWQtNGU3ZC05YWM3LTEzOTg3OTFiYjAxMiJ9.wylXFcrFF1NojFPubGfsilg-7-yhV4VEK4HkzhEvOmh3f1t48cqkOTu9uVJvd-n3zF6shMlNG5CmC3p-QmB9yQ", + "refresh_token": "7voFDXgOMtgRLfwhJRN-_VbnVzZM-Fp_9qjtVIqBfLvrnHn6eKJZcjeWr0gLvCpMY69lZL2M7-XyPZ5FRmzfTQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T06:08:48Z", + "last_refresh": "2026-07-12T00:08:50Z", + "email": "wnjhqq4yjk@zhangyunuo.net", + "sub": "0fd3a3f2-3c56-43a3-9337-d87e76bb6ec7", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjBmZDNhM2YyLTNjNTYtNDNhMy05MzM3LWQ4N2U3NmJiNmVjNyIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNjUyOCwiaWF0IjoxNzgzODE0OTI4LCJnaXZlbl9uYW1lIjoiRmVsaXgiLCJmYW1pbHlfbmFtZSI6Ilpob3UiLCJlbWFpbCI6InduamhxcTR5amtAemhhbmd5dW51by5uZXQiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.zCi0hkMpsKHRLBOefdpFxh_O3leFH5fVONWi6sCfcu0BaxCNYjysz6PR36oYlHY6YMF_Dw37fStut3hrceNeiw" +} diff --git a/cpa_auths/xai-wsljbjjqqa@baoxia.top.json b/cpa_auths/xai-wsljbjjqqa@baoxia.top.json new file mode 100644 index 0000000..2bf7bff --- /dev/null +++ b/cpa_auths/xai-wsljbjjqqa@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImZmZmRiNDE1LTg3MTAtNDdkZi1iNjU0LWU5YTQ4MjA2MDc1YiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTc5MSwiaWF0IjoxNzgzODE0MTkxLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZmZmZGI0MTUtODcxMC00N2RmLWI2NTQtZTlhNDgyMDYwNzViIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMjFmN2UxZmUtOTU5ZS00NWJiLWE4ZTAtM2ZmM2QwYTMxNGNkIiwidGVhbV9pZCI6IjE1ZDA3NTg2LThhNzMtNGNhZC1hYjgyLWQ4MTk2MzRhM2E2NSJ9.I9_cR4tef5Yz2JHVldt3vN00pydw00Odig16kWKkve3P_5Kj-KoqHs7dEqQEnJab2ZzjnefM928W1VFpSjsiwg", + "refresh_token": "OfJphyRbjH-3ORGtgZH4HNJ4WT5Z78quy6MPtqqowBkLQxYGyH7N-ymTbiKn3VDbrUdXFjA8hq_av4aE_3G6Mg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:56:31Z", + "last_refresh": "2026-07-11T23:56:32Z", + "email": "wsljbjjqqa@baoxia.top", + "sub": "fffdb415-8710-47df-b654-e9a48206075b", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImZmZmRiNDE1LTg3MTAtNDdkZi1iNjU0LWU5YTQ4MjA2MDc1YiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTc5MSwiaWF0IjoxNzgzODE0MTkxLCJnaXZlbl9uYW1lIjoiQWxleCIsImZhbWlseV9uYW1lIjoiTHUiLCJlbWFpbCI6IndzbGpiampxcWFAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.-JJksDa4glOUzNEx1kQuLU7kEJbfSQV6D_Yq22ofYJWMPRbBmZcEGilwfFwJI8wqKFxC7eih1tb0-gDHbz3b-A" +} diff --git a/cpa_auths/xai-x3zg9qlu95@baoxia.top.json b/cpa_auths/xai-x3zg9qlu95@baoxia.top.json new file mode 100644 index 0000000..3b6be41 --- /dev/null +++ b/cpa_auths/xai-x3zg9qlu95@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjhhNjBkODUzLTBmMzgtNGYyOC1hMjEyLTVkOTAzYjU0MjJmNCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMxMywiaWF0IjoxNzgzODEyNzEzLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiOGE2MGQ4NTMtMGYzOC00ZjI4LWEyMTItNWQ5MDNiNTQyMmY0IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYTY5ZjQwNGItOGQ3Ny00YmQ1LWIyODMtYTRkYmRhNGI1NTU5IiwidGVhbV9pZCI6ImY5YTQ4OThlLTk0MmItNDZkZS05M2RjLWQ3YTkzMjQxZDQwYSJ9.AzzeYpQN8ESmuNX-o8iao38RtXR2M1m07emVZ6BM0W63i0ntgshkJYNW3sHO3KijzmPPWvRoAp0KY54vTR1hVQ", + "refresh_token": "_ErGE5vQPYEuneq46Z4WKtM6t2GVi0CrT18tn7zsXPMuzYcR9zCGPfOH5-N4wi3gResLfWSanYoB0vhXaN9qlQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:31:53Z", + "last_refresh": "2026-07-11T23:31:54Z", + "email": "x3zg9qlu95@baoxia.top", + "sub": "8a60d853-0f38-4f28-a212-5d903b5422f4", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjhhNjBkODUzLTBmMzgtNGYyOC1hMjEyLTVkOTAzYjU0MjJmNCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDMxMywiaWF0IjoxNzgzODEyNzEzLCJnaXZlbl9uYW1lIjoiWmFuZSIsImZhbWlseV9uYW1lIjoiTWFvIiwiZW1haWwiOiJ4M3pnOXFsdTk1QGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.frf1Y_iEuK9E9i6KZPwoUeJslmNfNqrMAAfmfZjyK1kciTbHjRrJiutmOggU_nvxO8vwII5NywW_BKJOsdsOKw" +} diff --git a/cpa_auths/xai-xe5dz2gsly@baoxia.top.json b/cpa_auths/xai-xe5dz2gsly@baoxia.top.json new file mode 100644 index 0000000..9f3ab39 --- /dev/null +++ b/cpa_auths/xai-xe5dz2gsly@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImM2N2NmMGFhLWQ0MDItNDUzZC1hNGI0LWZjYTlmM2U3NzBiNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTgyMCwiaWF0IjoxNzgzODE0MjIwLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiYzY3Y2YwYWEtZDQwMi00NTNkLWE0YjQtZmNhOWYzZTc3MGI2IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNDNkODNkZDAtMzMzYy00MjNiLTkzZDMtMDdlYWExOThhN2Q5IiwidGVhbV9pZCI6IjZjNDNlNDUzLWRmZDQtNDZjNS1iODkwLTAxODVlNzU0NDRjNSJ9.ZglnqcW2rdMR7DpNTchfW31PS0Gx_oW35psi5NdP0dOMMe1IjBBxLZ71-FWRo7ZS4y7pHKYK6p2hhRnlj1AyEA", + "refresh_token": "miPaUT8Elo8hdMR8OiG9jxtfymKUcYtVhHalu5kClsQwJHA6-0i3ft0GIqkPFuxciiMNw-Xs0qaL2uEMRBqsyw", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:57:00Z", + "last_refresh": "2026-07-11T23:57:01Z", + "email": "xe5dz2gsly@baoxia.top", + "sub": "c67cf0aa-d402-453d-a4b4-fca9f3e770b6", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImM2N2NmMGFhLWQ0MDItNDUzZC1hNGI0LWZjYTlmM2U3NzBiNiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTgyMCwiaWF0IjoxNzgzODE0MjIwLCJnaXZlbl9uYW1lIjoiVHJpc3RhbiIsImZhbWlseV9uYW1lIjoiV2VpIiwiZW1haWwiOiJ4ZTVkejJnc2x5QGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.mxQJjdBYrQpwZZsifVoeiFicYyLj8R5h8doeJy-0KA90dGyLw-HNyosz1tAb8bRih9HzpFgNnlCHyxgsC_vIXg" +} diff --git a/cpa_auths/xai-xep62luxj1@baoxia.top.json b/cpa_auths/xai-xep62luxj1@baoxia.top.json new file mode 100644 index 0000000..be34d23 --- /dev/null +++ b/cpa_auths/xai-xep62luxj1@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImY5ZjY1ZjA2LWYzNDgtNDE2Ni05YmRhLTc2NDUyZjY0NTc4MSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTg1NiwiaWF0IjoxNzgzODE0MjU2LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZjlmNjVmMDYtZjM0OC00MTY2LTliZGEtNzY0NTJmNjQ1NzgxIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiYWFjMTBiMTgtZjFkYy00OTQwLWJlYzctN2NhYjk4ZmY0Y2JhIiwidGVhbV9pZCI6IjYxODRkMDU3LTFmMzQtNDVmNi04MzgzLTJiNGE1MzQxY2E3MSJ9.mgpONfeB974anMolqsCFkqznQQLxpcu7P_QOLF2RtWbSNmQb0cveWwH9uO9B58Fmkrbc2f1B-ZLucvp_C7MwrA", + "refresh_token": "FUTmHd7O1yg7y_glt6UmlTuOChr2jR4P9ko9vhCSZDGYDzv01o2ZmZNQojy9nzkqdhbJWCgNlV0eJWZ9Bou6KQ", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:57:36Z", + "last_refresh": "2026-07-11T23:57:37Z", + "email": "xep62luxj1@baoxia.top", + "sub": "f9f65f06-f348-4166-9bda-76452f645781", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImY5ZjY1ZjA2LWYzNDgtNDE2Ni05YmRhLTc2NDUyZjY0NTc4MSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTg1NiwiaWF0IjoxNzgzODE0MjU2LCJnaXZlbl9uYW1lIjoiSHVudGVyIiwiZmFtaWx5X25hbWUiOiJDYW8iLCJlbWFpbCI6InhlcDYybHV4ajFAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.9th-QEe29G8Hfi6gy6CYPAy1t7SPPeaTPm-IcOtN_8zDd3Ot_HovkyselHduNxttVYWnDVF8KnhWmKB-PBZ0-Q" +} diff --git a/cpa_auths/xai-xpjt7028xd@baoxia.top.json b/cpa_auths/xai-xpjt7028xd@baoxia.top.json new file mode 100644 index 0000000..2d290dc --- /dev/null +++ b/cpa_auths/xai-xpjt7028xd@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjdmNDQ2NWNkLWU4NGMtNGVhYS05MTkxLWFkN2Y4Yjk1YzNmNSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDA2MSwiaWF0IjoxNzgzODEyNDYxLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiN2Y0NDY1Y2QtZTg0Yy00ZWFhLTkxOTEtYWQ3ZjhiOTVjM2Y1IiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNjVkYWU3NTctMjMwYi00YjdhLTg1YjEtNjYwZjc3NWI4MjM3IiwidGVhbV9pZCI6IjYyOWVjZjBlLWVkZjMtNGM2ZC05ZTVkLWUwYTJjNmEyZDE5YSJ9.y-D3pZN5-jTaJ1HWrRK-dHZPQDkRcLJFYHjbHd-PoVLqW3j1Z8hdO28rfVz1wyongxLOIyHFDmpykx0vMjDkCw", + "refresh_token": "P_s4MLPhr0nNt2rEhBCF-iaWHHOOQGXBRpJVhMTrjAk9lhxN3yMvKoAVNL_CnbUq9jz8jfQK95SxmWrF1YwrhA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:27:41Z", + "last_refresh": "2026-07-11T23:27:41Z", + "email": "xpjt7028xd@baoxia.top", + "sub": "7f4465cd-e84c-4eaa-9191-ad7f8b95c3f5", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjdmNDQ2NWNkLWU4NGMtNGVhYS05MTkxLWFkN2Y4Yjk1YzNmNSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDA2MSwiaWF0IjoxNzgzODEyNDYxLCJnaXZlbl9uYW1lIjoiS2FpIiwiZmFtaWx5X25hbWUiOiJGYW4iLCJlbWFpbCI6InhwanQ3MDI4eGRAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.hQEq7u5G4FnW2OcOTnhNw_rWZxYMjjvHiaKQ_jzfpfsWn9bOKWi61Shh1fDTspEIKUNpyehcGw6QlT0uFEajAw" +} diff --git a/cpa_auths/xai-yhm3o9cg9j@baoxia.top.json b/cpa_auths/xai-yhm3o9cg9j@baoxia.top.json new file mode 100644 index 0000000..a09c2c5 --- /dev/null +++ b/cpa_auths/xai-yhm3o9cg9j@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjMwNWEyYzgxLWVhMTQtNDMxOC1iYWJmLTc3ODdjMmI5NmVmMCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDEwNywiaWF0IjoxNzgzODEyNTA3LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiMzA1YTJjODEtZWExNC00MzE4LWJhYmYtNzc4N2MyYjk2ZWYwIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiZjZlYjA4NjEtNTNkMi00MWU2LThkYTAtZWU5OTZhM2I0M2Y5IiwidGVhbV9pZCI6IjQ5MGU2MmJiLWJiODgtNGJhOC1iOTI0LTJhYjQ0OGQzODhjZiJ9.UPnRwQe9-cwUQv8kja_VBg5pQKX0koBmMhokBk653hGlks_qkVQARDioMYDkmSj-VxDwhkF8xe8qQKyzqJpf4w", + "refresh_token": "Cf2GGrVGOse8AzFk8YDeZrKv5oKL6XdDBqlQreEeuq33WCbhrqHXRyUVOKOq7-pCqu9_gqDSrpFODuutHMOPFA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:28:27Z", + "last_refresh": "2026-07-11T23:28:28Z", + "email": "yhm3o9cg9j@baoxia.top", + "sub": "305a2c81-ea14-4318-babf-7787c2b96ef0", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6IjMwNWEyYzgxLWVhMTQtNDMxOC1iYWJmLTc3ODdjMmI5NmVmMCIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDEwNywiaWF0IjoxNzgzODEyNTA3LCJnaXZlbl9uYW1lIjoiT3dlbiIsImZhbWlseV9uYW1lIjoiTGluIiwiZW1haWwiOiJ5aG0zbzljZzlqQGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.rEHuA1iyRN2ngBtNha1OJTc6cwkFaz0Y3q70jQ0CN07IgB6vAK-KboFvqrgHqBZyalghdgoZF4MgadlOzUw3-A" +} diff --git a/cpa_auths/xai-ymdri8j8y6@baoxia.top.json b/cpa_auths/xai-ymdri8j8y6@baoxia.top.json new file mode 100644 index 0000000..7514a73 --- /dev/null +++ b/cpa_auths/xai-ymdri8j8y6@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImY5M2QxYzI2LTQ0MTktNDNkNS04MGNiLTZmYzE3ZDM0MDNiMiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI1MywiaWF0IjoxNzgzODEyNjUzLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZjkzZDFjMjYtNDQxOS00M2Q1LTgwY2ItNmZjMTdkMzQwM2IyIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMDE3MDMwZDktMmJkNi00ZWIzLTg4ZGEtMTA5ODQ0OWVlM2JhIiwidGVhbV9pZCI6ImU5MjMxNGRkLWFmODItNGRkMy1hMDkzLWY4YzUwNmM1MzBmYyJ9.rYomIEZQ1DoVnB5P2bwdp7aQur9Qo0Qf6-eIhKd0sjBf4HsfgFpm0FRPbF7C5TcGvX2f52u_hief__wfGFWJPQ", + "refresh_token": "cxzRmqG6DBNnpQIc1aRfdW1XwKaJfo3CWLEZATuTUo79g-_7cafJRwQdxQ-7gAM6Sr2HlXA40c5khrWR3yfSkA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:30:53Z", + "last_refresh": "2026-07-11T23:30:54Z", + "email": "ymdri8j8y6@baoxia.top", + "sub": "f93d1c26-4419-43d5-80cb-6fc17d3403b2", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImY5M2QxYzI2LTQ0MTktNDNkNS04MGNiLTZmYzE3ZDM0MDNiMiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDI1MywiaWF0IjoxNzgzODEyNjUzLCJnaXZlbl9uYW1lIjoiQWxleCIsImZhbWlseV9uYW1lIjoiWGllIiwiZW1haWwiOiJ5bWRyaThqOHk2QGJhb3hpYS50b3AiLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZX0.t1wn3V-8b2hcDofzKoGvGXlf1XSMpEgDqym-rExdRq9fNsb39JbqxLTijHw_Grs5WfoGso5cCUIKez8gsqIZIg" +} diff --git a/cpa_auths/xai-ypg51d45r0@baoxia.top.json b/cpa_auths/xai-ypg51d45r0@baoxia.top.json new file mode 100644 index 0000000..75575f7 --- /dev/null +++ b/cpa_auths/xai-ypg51d45r0@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImRlMjZlNDVlLTFlNjEtNDIyZC04YzdhLTRjODQwMjdlODFjZiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTkyNiwiaWF0IjoxNzgzODE0MzI2LCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiZGUyNmU0NWUtMWU2MS00MjJkLThjN2EtNGM4NDAyN2U4MWNmIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiNDM2NzFiODMtMTA1OC00MDBhLTg1ODYtMmY4YWJkODZmYzhiIiwidGVhbV9pZCI6IjRiNzU4MjBiLTQ4MDUtNDA2Ny1iMGRlLWNjNjJjZTQ1NWQzYSJ9.USRZDAawrn4yMPEqZqboieVlwmM8whxjCVRfpOmtnAxA0zlvbM45RFE_8ehHMVbtrnUgKXRWvb61otmrIfGobw", + "refresh_token": "aRqiqdDetWhalRQ9so4NNnbZ9zaSYVKXd25K6kosw1KB-Mm_BZwM-AvRWFM_Z1M5vD-wQFgoC7YOgc8DE-ycZg", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:58:46Z", + "last_refresh": "2026-07-11T23:58:47Z", + "email": "ypg51d45r0@baoxia.top", + "sub": "de26e45e-1e61-422d-8c7a-4c84027e81cf", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6ImRlMjZlNDVlLTFlNjEtNDIyZC04YzdhLTRjODQwMjdlODFjZiIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNTkyNiwiaWF0IjoxNzgzODE0MzI2LCJnaXZlbl9uYW1lIjoiQWRhbSIsImZhbWlseV9uYW1lIjoiQ2hlbiIsImVtYWlsIjoieXBnNTFkNDVyMEBiYW94aWEudG9wIiwiZW1haWxfdmVyaWZpZWQiOnRydWV9.-3s-KDrCq1GQxPcO5qgiERuOWXkXsp_fSQsDgjHgcTBGksO4qOQE3pBK5m2eN-9BRAbegF87vofU6I1V6pO1qQ" +} diff --git a/cpa_auths/xai-zdkbp65awf@baoxia.top.json b/cpa_auths/xai-zdkbp65awf@baoxia.top.json new file mode 100644 index 0000000..d525bfb --- /dev/null +++ b/cpa_auths/xai-zdkbp65awf@baoxia.top.json @@ -0,0 +1,16 @@ +{ + "type": "xai", + "auth_kind": "oauth", + "access_token": "eyJ0eXAiOiJhdCtqd3QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6Ijk5MTA4MWEwLThmMzUtNDFhNC1hYTMxLTIyNjIwOTcwMmVhMSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDA2MSwiaWF0IjoxNzgzODEyNDYxLCJzY29wZSI6Im9wZW5pZCBwcm9maWxlIGVtYWlsIG9mZmxpbmVfYWNjZXNzIGdyb2stY2xpOmFjY2VzcyBhcGk6YWNjZXNzIiwicHJpbmNpcGFsX3R5cGUiOiJVc2VyIiwicHJpbmNpcGFsX2lkIjoiOTkxMDgxYTAtOGYzNS00MWE0LWFhMzEtMjI2MjA5NzAyZWExIiwiY2xpZW50X2lkIjoiYjFhMDA0OTItMDczYS00N2VhLTgxNmYtNGMzMjkyNjRhODI4IiwianRpIjoiMWY1N2I5NWMtMWU0ZS00N2UwLTg0ZmUtODQwYmUyMWMzZmU5IiwidGVhbV9pZCI6ImFiZTZmNmE5LTk0MmMtNDU5Yi1hNWJjLTNiNGY2ZTlmMTk4NSJ9.KSchVhH7KDj9wjUcoujjo_RQTnsppDa4iEq0In-aazfBSmkIqdne6a4V61VjevEKnfEyhPteDKJyriYJaCOrkg", + "refresh_token": "EXu8b5E9Ao20O2oOm92KUhkiKKNHSJUl2rwOZ6BKJa3oDe02QFHRASsVoKayl1hpluzKHmFSWgAJfEkSGe9IpA", + "token_type": "Bearer", + "expires_in": 21600, + "expired": "2026-07-12T05:27:41Z", + "last_refresh": "2026-07-11T23:27:42Z", + "email": "zdkbp65awf@baoxia.top", + "sub": "991081a0-8f35-41a4-aa31-226209702ea1", + "base_url": "https://cli-chat-proxy.grok.com/v1", + "token_endpoint": "https://auth.x.ai/oauth2/token", + "redirect_uri": "http://127.0.0.1:56121/callback", + "id_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJFUzI1NiIsImtpZCI6Im9hdXRoMi1wcm9kdWN0aW9uLTIwMjYtMDItMTkifQ.eyJpc3MiOiJodHRwczovL2F1dGgueC5haSIsInN1YiI6Ijk5MTA4MWEwLThmMzUtNDFhNC1hYTMxLTIyNjIwOTcwMmVhMSIsImF1ZCI6ImIxYTAwNDkyLTA3M2EtNDdlYS04MTZmLTRjMzI5MjY0YTgyOCIsImV4cCI6MTc4MzgzNDA2MSwiaWF0IjoxNzgzODEyNDYxLCJnaXZlbl9uYW1lIjoiTHVjYXMiLCJmYW1pbHlfbmFtZSI6IkZhbmciLCJlbWFpbCI6Inpka2JwNjVhd2ZAYmFveGlhLnRvcCIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfQ.ZoyO1N57I_G45c43MRLOe_bTepvPNFXvg3TE7Ku70pRPP8pkk0_Utx10CUtUntGZ4gnn0ZSTaXbKLqM_M57BCw" +} diff --git a/cpa_export.py b/cpa_export.py new file mode 100644 index 0000000..feb70c6 --- /dev/null +++ b/cpa_export.py @@ -0,0 +1,161 @@ +"""注册成功钩子:铸造 Grok Build 设备码 OIDC → 写出 CPA (CLIProxyAPI) 的 +xai-.json → 推送到远端 CLIProxyAPI 导入。 + +- 本地写盘目录:config['cpa_auth_dir'](默认 ./cpa_auths) +- 远端推送:POST config['cpa_remote_base'] + /v0/management/auth-files?name=... + 认证 X-Management-Key: config['cpa_remote_secret'] + +免费 Grok 4.5 用 base_url=cli-chat-proxy;CLIProxyAPI 请求 grok 时自带 +x-grok-client-version 头,免费号不会 426。 +""" + +from __future__ import annotations + +import os +import time +from pathlib import Path +from typing import Any, Callable + +_REG_DIR = Path(__file__).resolve().parent +_DEFAULT_OUT = _REG_DIR / "cpa_auths" + + +def _resolve_out_dir(cfg: dict) -> Path: + raw = str(cfg.get("cpa_auth_dir") or _DEFAULT_OUT).strip() + p = Path(raw).expanduser() + if not p.is_absolute(): + p = (_REG_DIR / p).resolve() + return p + + +def _record_failure(out_dir: Path, email: str, reason: str) -> None: + try: + out_dir.mkdir(parents=True, exist_ok=True) + with open(out_dir / "cpa_auth_failed.txt", "a", encoding="utf-8") as f: + f.write(f"{email}----{reason}----{int(time.time())}\n") + except Exception: + pass + + +# ── 主入口 ── + +def export_cpa_for_account( + email: str, + password: str, + *, + page: Any | None = None, + config: dict | None = None, + log_callback: Callable[[str], None] | None = None, +) -> dict: + """在注册浏览器里铸造 OIDC → 写本地 xai-.json → 推送远端 CLIProxyAPI。 + + 复用注册成功后仍开着、且已登录 grok 的浏览器铸造,不另开浏览器。 + 返回 {ok, email, path, pushed, push_status?, error?}。 + """ + cfg = config or {} + log = log_callback or (lambda m: print(m, flush=True)) + + if not cfg.get("cpa_export_enabled", True): + log("[cpa] 已关闭导出,跳过") + return {"ok": False, "skipped": True, "reason": "disabled"} + email = (email or "").strip() + if not email or not password: + return {"ok": False, "error": "缺少 email/password", "email": email} + if page is None: + log("[!] 无可复用的注册浏览器,跳过铸造") + return {"ok": False, "error": "no register browser page", "email": email} + + from oidc_mint import mint_with_browser, resolve_proxy, set_runtime_proxy + import cpa + + out_dir = _resolve_out_dir(cfg) + + # 代理优先级:mint_proxy > proxy > 环境 + proxy = (cfg.get("mint_proxy") or cfg.get("proxy") or "").strip() + if not proxy: + proxy = ( + os.environ.get("https_proxy") or os.environ.get("HTTPS_PROXY") + or os.environ.get("http_proxy") or "" + ).strip() + resolved = resolve_proxy(proxy or None) + set_runtime_proxy(resolved or None) + + timeout = float(cfg.get("mint_timeout_sec", 300) or 300) + base_url = cfg.get("cpa_base_url") or cpa.CLI_BASE_URL + + # 复用注册浏览器铸造:它已登录 grok,开设备码页直接确认,不另开浏览器 + try: + tokens = mint_with_browser( + email=email, + password=password, + page=page, + proxy=resolved or None, + browser_timeout_sec=timeout, + force_standalone=False, + cookies=None, + poll_log=lambda m: log(f"[Debug] {m}"), + ) + except Exception as exc: # noqa: BLE001 + log(f"[!] 铸造失败: {exc}") + _record_failure(out_dir, email, str(exc)) + if cfg.get("mint_required", False): + raise + return {"ok": False, "error": str(exc), "email": email} + + try: + payload = cpa.build_cpa_xai_auth( + email=email, + access_token=tokens["access_token"], + refresh_token=tokens["refresh_token"], + id_token=tokens.get("id_token"), + expires_in=tokens.get("expires_in"), + base_url=base_url, + ) + path = cpa.write_cpa_xai_auth(out_dir, payload) + filename = Path(path).name + except Exception as exc: # noqa: BLE001 + log(f"[!] 写本地文件失败: {exc}") + _record_failure(out_dir, email, f"write: {exc}") + if cfg.get("mint_required", False): + raise + return {"ok": False, "error": str(exc), "email": email} + + log(f"[Debug] 已写本地: {path}") + result: dict[str, Any] = {"ok": True, "email": email, "path": str(path), "pushed": False} + + # 推送远端 CLIProxyAPI + if cfg.get("cpa_push_enabled", False): + remote_base = str(cfg.get("cpa_remote_base") or "").strip() + secret = str(cfg.get("cpa_remote_secret") or "").strip() + if not remote_base or not secret: + log("[!] 推送已开启但未配置 cpa_remote_base/cpa_remote_secret,跳过推送") + else: + push_proxy = str(cfg.get("cpa_push_proxy") or "").strip() or None + verify_tls = bool(cfg.get("cpa_remote_verify_tls", True)) + try: + ok, status, text = cpa.push_auth_file( + remote_base=remote_base, + secret=secret, + filename=filename, + payload=payload, + proxy=push_proxy, + verify_tls=verify_tls, + ) + result["push_status"] = status + if ok: + result["pushed"] = True + log(f"[Debug] 已推送远端: {remote_base} (HTTP {status})") + else: + result["push_error"] = text[:300] + log(f"[!] [cpa] 推送远端失败 HTTP {status}: {text[:200]}") + if cfg.get("cpa_push_required", False): + result["ok"] = False + result["error"] = f"push HTTP {status}: {text[:200]}" + except Exception as exc: # noqa: BLE001 + log(f"[!] [cpa] 推送远端异常: {exc}") + result["push_error"] = str(exc) + if cfg.get("cpa_push_required", False): + result["ok"] = False + result["error"] = f"push: {exc}" + + return result diff --git a/grok_register_ttk.py b/grok_register_ttk.py new file mode 100644 index 0000000..cf68709 --- /dev/null +++ b/grok_register_ttk.py @@ -0,0 +1,2954 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +""" +Grok 注册机 - TTK GUI 版本 +整合 DrissionPage_example.py, openai_register.py, batch_open_nsfw.py +""" + +import threading +import datetime +import time +import os +import sys +import gc +import secrets +import struct +import random +import re +import string +import json + +from DrissionPage import Chromium, ChromiumOptions +from DrissionPage.errors import PageDisconnectedError +from curl_cffi import requests +import psutil + + +CONFIG_FILE = os.path.join(os.path.dirname(os.path.abspath(__file__)), "config.json") +MEMORY_CLEANUP_INTERVAL = 5 + +DEFAULT_CONFIG = { + "duckmail_api_key": "", + "cloudflare_api_base": "", + "cloudflare_api_key": "", + "cloudflare_auth_mode": "none", + "cloudflare_path_domains": "/api/domains", + "cloudflare_path_accounts": "/api/new_address", + "cloudflare_path_token": "/api/token", + "cloudflare_path_messages": "/api/mails", + "proxy": "http://127.0.0.1:7890", + "enable_nsfw": True, + "register_count": 1, + "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36", + # ===== CPA (CLIProxyAPI) 导出 / 免费 Grok 4.5(OIDC,非 Web SSO)===== + # 注册成功后走设备码 OIDC 铸造 token,写出 CLIProxyAPI 的 xai-.json,并可 + # 推送到远端 CLIProxyAPI 导入。免费号用 cli-chat-proxy,CLIProxyAPI 请求 grok 时 + # 自带 x-grok-client-version 头,不会 426。SSO cookie 不能替代 OIDC。 + "cpa_export_enabled": True, # 注册成功后是否铸造 OIDC 并写 CPA 认证文件 + "cpa_auth_dir": "./cpa_auths", # 本地写盘目录(xai-.json) + "cpa_base_url": "https://cli-chat-proxy.grok.com/v1", # 写进 auth 的 base_url;付费用 https://api.x.ai/v1 + # 远端推送到 CLIProxyAPI(POST /v0/management/auth-files) + "cpa_push_enabled": False, # 是否推送到远端 CLIProxyAPI + "cpa_remote_base": "", # 远端 CLIProxyAPI 地址,如 http://127.0.0.1:8317 + "cpa_remote_secret": "", # 远端管理密钥(CLIProxyAPI remote-management.secret-key) + "cpa_remote_verify_tls": True, # https 远端是否校验证书 + "cpa_push_proxy": "", # 推送用代理;空=直连(不走 mint 代理) + "cpa_push_required": False, # True=推送失败则整次注册算失败 + # OIDC 设备码铸造(独立 Chromium) + "mint_proxy": "", # 铸造专用代理;空=复用 proxy + "mint_timeout_sec": 300, # 单账号铸造超时(秒) + "mint_required": False, # True=铸造失败则整次注册算失败 + # 以下优化默认关闭 = 与最初脚本一致;实测三者都不影响 Turnstile 通过,可按需开启。 + # (注:Blink 层禁图会导致验证过不去,已弃用;省图片带宽改由 block_media_fonts 承担) + "block_media_fonts": False, # 网络层拦截图片/字体/媒体省带宽(省带宽主力,不影响验证) + "hide_window": False, # 把浏览器窗口移到屏幕外隐藏 + "stealth_patch": False, # 内联 turnstilePatch 全局注入 + # ===== CF Email Routing Worker 取码(非 temp-email)===== + # 域名在 Email Routing catch-all → Worker KV → GET /code + "cf_worker_domains": "", # 走 Worker 的域名,逗号分隔,如 zhangyunuo.net + "gmail_worker_enabled": False, + "gmail_worker_url": "", + "gmail_worker_api_key": "", + "gmail_worker_timeout_sec": 20, + "gmail_worker_poll_interval": 0.4, + "gmail_imap_fallback": False, # Worker 未命中是否回退 Gmail IMAP + "gmail_imap_user": "", + "gmail_imap_password": "", + "gmail_imap_host": "imap.gmail.com", + "gmail_imap_port": 993, +} + +config = DEFAULT_CONFIG.copy() +_cf_domain_index = 0 +_cf_domain_lock = threading.Lock() + + +class RegistrationCancelled(Exception): + pass + + +class AccountRetryNeeded(Exception): + pass + + +def load_config(): + global config + if os.path.exists(CONFIG_FILE): + try: + with open(CONFIG_FILE, "r", encoding="utf-8") as f: + loaded = json.load(f) + config = {**DEFAULT_CONFIG, **loaded} + except Exception: + config = DEFAULT_CONFIG.copy() + return config + + +def save_config(): + try: + with open(CONFIG_FILE, "w", encoding="utf-8") as f: + json.dump(config, f, indent=4, ensure_ascii=False) + except Exception as e: + print(f"保存配置失败: {e}") + + +def ensure_stable_python_runtime(): + if sys.version_info < (3, 14) or os.environ.get("DPE_REEXEC_DONE") == "1": + return + + local_app_data = os.environ.get("LOCALAPPDATA", "") + candidates = [ + os.path.join(local_app_data, "Programs", "Python", "Python312", "python.exe"), + os.path.join(local_app_data, "Programs", "Python", "Python313", "python.exe"), + ] + + current_python = os.path.normcase(os.path.abspath(sys.executable)) + for candidate in candidates: + if not os.path.isfile(candidate): + continue + if os.path.normcase(os.path.abspath(candidate)) == current_python: + return + + print( + f"[*] 检测到 Python {sys.version.split()[0]},自动切换到更稳定的解释器: {candidate}" + ) + env = os.environ.copy() + env["DPE_REEXEC_DONE"] = "1" + os.execve(candidate, [candidate, os.path.abspath(__file__), *sys.argv[1:]], env) + + +def warn_runtime_compatibility(): + if sys.version_info >= (3, 14): + print( + "[提示] 当前 Python 为 3.14+;若出现 Mail.tm TLS 异常,建议改用 Python 3.12 或 3.13。" + ) + + +ensure_stable_python_runtime() +warn_runtime_compatibility() + +load_config() + +EXTENSION_PATH = os.path.abspath( + os.path.join(os.path.dirname(__file__), "turnstilePatch") +) + + +DUCKMAIL_API_BASE = "https://api.duckmail.sbs" + + +def get_proxies(): + proxy = config.get("proxy", "") + if proxy: + return {"http": proxy, "https": proxy} + return {} + + +def get_duckmail_api_key(): + return config.get("duckmail_api_key", "") + + +def get_cloudflare_api_base(): + return str(config.get("cloudflare_api_base", "") or "").rstrip("/") + + +def get_cloudflare_api_key(): + return config.get("cloudflare_api_key", "") + + +def get_cloudflare_auth_mode(): + return str(config.get("cloudflare_auth_mode", "none") or "none").lower() + + +def get_cloudflare_path(key, default_path): + raw = str(config.get(key, default_path) or default_path).strip() + if not raw.startswith("/"): + raw = "/" + raw + return raw + + +def cloudflare_build_headers(content_type=False): + headers = {"Content-Type": "application/json"} if content_type else {} + key = get_cloudflare_api_key() + mode = get_cloudflare_auth_mode() + if key: + if mode == "x-api-key": + headers["X-API-Key"] = key + elif mode == "x-admin-auth": + headers["x-admin-auth"] = key + elif mode != "none": + headers["Authorization"] = f"Bearer {key}" + return headers + + +def cloudflare_apply_auth_params(params=None): + merged = dict(params or {}) + key = get_cloudflare_api_key() + mode = get_cloudflare_auth_mode() + if key and mode == "query-key": + merged["key"] = key + return merged + + +def cloudflare_default_domains(): + """解析 config.defaultDomains(逗号分隔)为域名列表。""" + return [x.strip() for x in str(config.get("defaultDomains", "") or "").split(",") if x.strip()] + + +def cloudflare_next_default_domain(): + """按配置轮换选择 Cloudflare 临时邮箱域名。""" + global _cf_domain_index + domains = cloudflare_default_domains() + if not domains: + return "" + with _cf_domain_lock: + domain = domains[_cf_domain_index % len(domains)] + _cf_domain_index += 1 + return domain + + +def cloudflare_is_admin_create_path(path): + """判断当前创建邮箱路径是否为 cloudflare_temp_email 管理员创建接口。""" + return str(path or "").rstrip("/").lower() == "/admin/new_address" + + +def _pick_list_payload(data): + if isinstance(data, list): + return data + if isinstance(data, dict): + if isinstance(data.get("results"), list): + return data.get("results") + if isinstance(data.get("hydra:member"), list): + return data.get("hydra:member") + if isinstance(data.get("data"), list): + return data.get("data") + if isinstance(data.get("messages"), list): + return data.get("messages") + if isinstance(data.get("data"), dict): + nested = data.get("data") + if isinstance(nested.get("messages"), list): + return nested.get("messages") + return [] + + +def cloudflare_create_temp_address(api_base, preferred_domain=None): + """适配 cloudflare_temp_email 新建地址接口并兼容 admin 创建模式。 + + 多域名时按 defaultDomains 顺序尝试;某个域名 Invalid domain 时自动换下一个。 + preferred_domain: 强制优先该域名(用于双通道轮换,避免改全局 config)。 + 会自动跳过 cf_worker_domains(那些域名不走 temp-email)。 + """ + path = get_cloudflare_path("cloudflare_path_accounts", "/api/new_address") + url = f"{api_base}{path}" + worker_skip = cf_worker_domain_set() + domains = cloudflare_default_domains() + domains = [d for d in domains if d and d.lower() not in worker_skip] + if preferred_domain: + pref = preferred_domain.strip() + if pref and pref.lower() not in worker_skip: + domains = [pref] + [d for d in domains if d.lower() != pref.lower()] + if not domains: + domains = [""] + is_admin_create = cloudflare_is_admin_create_path(path) + last_err = None + if preferred_domain: + # 外层已轮换选域,这里不再推进全局下标 + ordered = domains + else: + # 从轮换下标开始,保证多域名时负载分散,且失败可回退 + start = 0 + with _cf_domain_lock: + start = _cf_domain_index % max(len(domains), 1) + _cf_domain_index += 1 + ordered = domains[start:] + domains[:start] + for domain in ordered: + if is_admin_create: + payload = {"name": generate_username(10), "enablePrefix": True} + if domain: + payload["domain"] = domain + headers = cloudflare_build_headers(content_type=True) + else: + payload = {} + if domain: + payload["domain"] = domain + headers = {"Content-Type": "application/json"} + try: + resp = http_post(url, json=payload, headers=headers) + body_text = resp.text or "" + if resp.status_code >= 400: + last_err = f"HTTP {resp.status_code}: {body_text[:200]}" + # 域名未绑定到 temp-email 时常见错误,换下一个域名 + low = body_text.lower() + if "invalid domain" in low or "domain" in low and "invalid" in low: + continue + resp.raise_for_status() + try: + data = resp.json() + except Exception: + raise Exception(f"Cloudflare {path} 返回非JSON: {body_text[:300]}") + address = data.get("address") + jwt = data.get("jwt") + if not address or not jwt: + last_err = f"缺少 address/jwt: {data}" + continue + return address, jwt + except Exception as exc: + last_err = str(exc) + low = last_err.lower() + if "invalid domain" in low: + continue + # 非域名类错误不继续盲试 + if domain == ordered[-1]: + break + if "domain" in low: + continue + raise + raise Exception( + f"Cloudflare 创建邮箱失败(已尝试域名 {', '.join([d or '(默认)' for d in ordered])}): {last_err}" + ) + + +def get_user_agent(): + return config.get( + "user_agent", + "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/138.0.0.0 Safari/537.36", + ) + + +def export_cpa_after_register(email, password, session=None, sso="", log_callback=None): + """注册成功后铸造 Grok Build OIDC,写出 CPA (CLIProxyAPI) 的 xai-.json, + 并按配置推送到远端 CLIProxyAPI 导入。 + + 走独立 Chromium 完成设备码确认,再轮询 token;本地写到 config['cpa_auth_dir'], + 远端推送到 config['cpa_remote_base'] 的 /v0/management/auth-files。 + SSO cookie 只用于尽量跳过二次登录,不能替代 OIDC。 + """ + log = log_callback or cli_log + if not config.get("cpa_export_enabled", True): + log("[cpa] 已关闭导出,跳过") + return {"ok": False, "skipped": True, "reason": "disabled"} + + try: + import cpa_export + except Exception as exc: + log(f"[cpa] 导入 cpa_export 失败: {exc}") + if config.get("mint_required", False): + raise + return {"ok": False, "error": f"import: {exc}"} + + # 铸造用独立浏览器,只借注册页导出 cookie 以尽量跳过二次登录 + page = getattr(session, "page", None) if session is not None else None + try: + result = cpa_export.export_cpa_for_account( + email, + password, + page=page, + config=config, + log_callback=log, + ) + except Exception as exc: + log(f"[cpa] 导出异常: {exc}") + if config.get("mint_required", False): + raise + return {"ok": False, "error": str(exc)} + + if result.get("ok"): + tail = " 并已推送远端" if result.get("pushed") else "" + log(f"[+] CPA 认证已写出: {result.get('path')}{tail}") + elif result.get("skipped"): + log(f"[cpa] 跳过: {result.get('reason')}") + else: + log(f"[!] CPA 导出未成功: {result.get('error') or result}") + return result + + +def cleanup_mint_browsers(): + """关闭铸造 worker 复用的独立 Chromium(线程退出时调用)。""" + try: + from oidc_mint import shutdown_mint_browsers + shutdown_mint_browsers() + except Exception: + pass + + +def _kill_proc_tree(pid, timeout=3): + """强杀指定进程及其所有子进程(浏览器 quit 不干净时兜底)。""" + if not pid: + return + try: + parent = psutil.Process(pid) + except Exception: + return + procs = [] + try: + procs = parent.children(recursive=True) + except Exception: + pass + procs.append(parent) + for p in procs: + try: + p.kill() + except Exception: + pass + try: + psutil.wait_procs(procs, timeout=timeout) + except Exception: + pass + + +def _kill_chrome_session(pid=None, port=None): + """精准杀掉某个浏览器会话:优先按调试端口定位真正的 chrome 主进程,再连启动器 pid 一起杀进程树。""" + targets = set() + if port: + marker = f"--remote-debugging-port={port}" + for p in psutil.process_iter(["name", "cmdline"]): + try: + if (p.info.get("name") or "").lower() == "chrome.exe" and marker in " ".join(p.info.get("cmdline") or []): + targets.add(p.pid) + except Exception: + continue + if pid: + targets.add(pid) + for tp in targets: + _kill_proc_tree(tp) + + +def cleanup_stray_chrome(log_callback=None, rounds=4): + """退出兜底:杀掉带调试端口的孤儿 chrome 进程树 + GoogleUpdate 家族(多轮,清到杀不动为止)。 + + 只杀命令行含 --remote-debugging-port 的 chrome(本程序拉起的),不碰你手动打开的 Chrome。 + """ + log = log_callback or cli_log + updater = {"googleupdate.exe", "googlecrashhandler.exe", + "googlecrashhandler64.exe", "elevation_service.exe"} + total_chrome = 0 + total_upd = 0 + for _ in range(max(1, rounds)): + killed = 0 + for p in psutil.process_iter(["name", "cmdline"]): + try: + name = (p.info.get("name") or "").lower() + if name in updater: + p.kill() + total_upd += 1 + killed += 1 + continue + if name == "chrome.exe": + cmd = " ".join(p.info.get("cmdline") or []) + if "--remote-debugging-port" in cmd: + for c in p.children(recursive=True): + try: + c.kill() + except Exception: + pass + p.kill() + total_chrome += 1 + killed += 1 + except Exception: + continue + if killed == 0: + break + time.sleep(0.5) + if total_chrome or total_upd: + log(f"[*] 清理残留:chrome {total_chrome} 组,GoogleUpdate {total_upd} 个") + + +def create_browser_options(): + options = ChromiumOptions() + options.auto_port() + options.set_timeouts(base=1) + # 关键:全新临时用户目录下,Chrome 138 会走「首次启动」流程,DrissionPage 取不到 + # 标签页而在 Chromium() 启动处卡死。--no-first-run 跳过首启,--no-default-browser-check + # 屏蔽「设为默认浏览器」提示;二者都不影响 Turnstile 渲染。 + options.set_argument("--no-first-run") + options.set_argument("--no-default-browser-check") + # 禁用后台网络(含更新检查),减少 Chrome 拉起 GoogleUpdate.exe 残留 + options.set_argument("--disable-background-networking") + options.set_argument("--disable-component-update") + # 禁用后台标签/窗口节流,避免多窗口时后台浏览器被降频、响应变慢 + options.set_argument("--disable-background-timer-throttling") + options.set_argument("--disable-backgrounding-occluded-windows") + options.set_argument("--disable-renderer-backgrounding") + # 隐藏窗口(可选,默认关):仅移出屏幕、不缩小尺寸 + if config.get("hide_window", False): + options.set_argument("--window-position=-32000,-32000") + # 加载 turnstilePatch 扩展(伪造自动化鼠标事件指纹,帮过 Turnstile) + if os.path.exists(EXTENSION_PATH): + options.add_extension(EXTENSION_PATH) + return options + + +def _build_request_kwargs(**kwargs): + request_kwargs = dict(kwargs) + proxies = request_kwargs.pop("proxies", None) + if proxies is None: + proxies = get_proxies() + if proxies: + request_kwargs["proxies"] = proxies + request_kwargs.setdefault("timeout", 15) + return request_kwargs + + +def http_get(url, **kwargs): + try: + return requests.get(url, **_build_request_kwargs(**kwargs)) + except Exception as exc: + err = str(exc) + # 代理不可用时自动回退为直连,避免整个流程直接失败 + if "127.0.0.1 port 7890" in err or "Could not connect to server" in err: + retry_kwargs = dict(kwargs) + retry_kwargs["proxies"] = {} + return requests.get(url, **_build_request_kwargs(**retry_kwargs)) + raise + + +def http_post(url, **kwargs): + try: + return requests.post(url, **_build_request_kwargs(**kwargs)) + except Exception as exc: + err = str(exc) + if "127.0.0.1 port 7890" in err or "Could not connect to server" in err: + retry_kwargs = dict(kwargs) + retry_kwargs["proxies"] = {} + return requests.post(url, **_build_request_kwargs(**retry_kwargs)) + raise + + +def raise_if_cancelled(cancel_callback=None): + if cancel_callback and cancel_callback(): + raise RegistrationCancelled("鐢ㄦ埛鍋滄娉ㄥ唽") + + +def sleep_with_cancel(seconds, cancel_callback=None): + deadline = time.time() + max(seconds, 0) + while True: + raise_if_cancelled(cancel_callback) + remaining = deadline - time.time() + if remaining <= 0: + return + time.sleep(min(0.2, remaining)) + + +def get_domains(api_key=None): + headers = {} + key = api_key or get_duckmail_api_key() + if key: + headers["Authorization"] = f"Bearer {key}" + resp = http_get(f"{DUCKMAIL_API_BASE}/domains", headers=headers) + resp.raise_for_status() + return resp.json().get("hydra:member", []) + + +def create_account(address, password, api_key=None, expires_in=0): + headers = {"Content-Type": "application/json"} + key = api_key or get_duckmail_api_key() + if key: + headers["Authorization"] = f"Bearer {key}" + data = {"address": address, "password": password, "expiresIn": expires_in} + resp = http_post(f"{DUCKMAIL_API_BASE}/accounts", json=data, headers=headers) + resp.raise_for_status() + return resp.json() + + +def get_token(address, password): + data = {"address": address, "password": password} + resp = http_post(f"{DUCKMAIL_API_BASE}/token", json=data) + resp.raise_for_status() + return resp.json().get("token") + + +def get_messages(token): + headers = {"Authorization": f"Bearer {token}"} + resp = http_get(f"{DUCKMAIL_API_BASE}/messages", headers=headers) + resp.raise_for_status() + return resp.json().get("hydra:member", []) + + +def get_message_detail(token, message_id): + headers = {"Authorization": f"Bearer {token}"} + resp = http_get(f"{DUCKMAIL_API_BASE}/messages/{message_id}", headers=headers) + resp.raise_for_status() + return resp.json() + + +def cloudflare_get_domains(api_base, api_key=None): + headers = cloudflare_build_headers(content_type=False) + if api_key and "Authorization" in headers: + headers["Authorization"] = f"Bearer {api_key}" + if api_key and "X-API-Key" in headers: + headers["X-API-Key"] = api_key + path = get_cloudflare_path("cloudflare_path_domains", "/domains") + params = cloudflare_apply_auth_params() + resp = http_get(f"{api_base}{path}", headers=headers, params=params) + resp.raise_for_status() + return _pick_list_payload(resp.json()) + + +def cloudflare_create_account(api_base, address, password, api_key=None, expires_in=0): + headers = cloudflare_build_headers(content_type=True) + if api_key and "Authorization" in headers: + headers["Authorization"] = f"Bearer {api_key}" + if api_key and "X-API-Key" in headers: + headers["X-API-Key"] = api_key + payload = {"address": address, "password": password, "expiresIn": expires_in} + path = get_cloudflare_path("cloudflare_path_accounts", "/accounts") + params = cloudflare_apply_auth_params() + resp = http_post(f"{api_base}{path}", json=payload, headers=headers, params=params) + resp.raise_for_status() + return resp.json() + + +def cloudflare_get_token(api_base, address, password, api_key=None): + headers = cloudflare_build_headers(content_type=True) + if api_key and "Authorization" in headers: + headers["Authorization"] = f"Bearer {api_key}" + if api_key and "X-API-Key" in headers: + headers["X-API-Key"] = api_key + path = get_cloudflare_path("cloudflare_path_token", "/token") + resp = http_post( + f"{api_base}{path}", + json={"address": address, "password": password}, + headers=headers, + params=cloudflare_apply_auth_params(), + ) + resp.raise_for_status() + data = resp.json() + if isinstance(data, dict): + if data.get("token"): + return data.get("token") + if isinstance(data.get("data"), dict) and data["data"].get("token"): + return data["data"].get("token") + return None + + +def cloudflare_get_messages(api_base, token): + headers = {"Authorization": f"Bearer {token}"} + path = get_cloudflare_path("cloudflare_path_messages", "/messages") + params = {"limit": 20, "offset": 0} + params = cloudflare_apply_auth_params(params) + resp = http_get(f"{api_base}{path}", headers=headers, params=params) + resp.raise_for_status() + try: + data = resp.json() + except Exception: + raise Exception(f"Cloudflare messages 返回非JSON: {resp.text[:300]}") + return _pick_list_payload(data) + + +def cloudflare_get_message_detail(api_base, token, message_id): + headers = {"Authorization": f"Bearer {token}"} + candidates = [ + f"{api_base}/api/mail/{message_id}", + f"{api_base}{get_cloudflare_path('cloudflare_path_messages', '/messages')}/{message_id}", + ] + last_err = None + for url in candidates: + try: + resp = http_get( + url, + headers=headers, + params=cloudflare_apply_auth_params(), + ) + resp.raise_for_status() + data = resp.json() + if isinstance(data, dict) and isinstance(data.get("data"), dict): + return data["data"] + return data + except Exception as exc: + last_err = exc + continue + raise Exception(f"Cloudflare 获取邮件详情失败: {last_err}") + + +YYDS_API_BASE = "https://maliapi.215.im/v1" + + +def get_yyds_api_key(): + return config.get("yyds_api_key", "") + + +def get_yyds_jwt(): + return config.get("yyds_jwt", "") + + +def yyds_get_domains(api_key=None, jwt=None): + key = api_key or get_yyds_api_key() + token = jwt or get_yyds_jwt() + headers = {} + if token: + headers["Authorization"] = f"Bearer {token}" + elif key: + headers["X-API-Key"] = key + resp = http_get(f"{YYDS_API_BASE}/domains", headers=headers) + resp.raise_for_status() + data = resp.json() + return data.get("data", []) if data.get("success") else [] + + +def yyds_create_account(address=None, domain=None, api_key=None, jwt=None): + key = api_key or get_yyds_api_key() + token = jwt or get_yyds_jwt() + headers = {"Content-Type": "application/json"} + if token: + headers["Authorization"] = f"Bearer {token}" + elif key: + headers["X-API-Key"] = key + payload = {} + if address: + payload["address"] = address + if domain: + payload["domain"] = domain + elif key or token: + payload["autoDomainStrategy"] = "prefer_owned" + resp = http_post(f"{YYDS_API_BASE}/accounts", json=payload, headers=headers) + resp.raise_for_status() + data = resp.json() + if data.get("success"): + return data.get("data", {}) + raise Exception(f"YYDS 鍒涘缓閭澶辫触: {data}") + + +def yyds_get_token(address, api_key=None, jwt=None): + key = api_key or get_yyds_api_key() + token = jwt or get_yyds_jwt() + headers = {"Content-Type": "application/json"} + if token: + headers["Authorization"] = f"Bearer {token}" + elif key: + headers["X-API-Key"] = key + resp = http_post( + f"{YYDS_API_BASE}/token", json={"address": address}, headers=headers + ) + resp.raise_for_status() + data = resp.json() + if data.get("success"): + return data.get("data", {}).get("token") + raise Exception(f"YYDS 鑾峰彇token澶辫触: {data}") + + +def yyds_get_messages(address, token=None, api_key=None, jwt=None): + key = api_key or get_yyds_api_key() + temp_token = token or jwt or get_yyds_jwt() + headers = {} + if temp_token: + headers["Authorization"] = f"Bearer {temp_token}" + elif key: + headers["X-API-Key"] = key + resp = http_get( + f"{YYDS_API_BASE}/messages", + params={"address": address}, + headers=headers, + ) + resp.raise_for_status() + data = resp.json() + if data.get("success"): + return data.get("data", {}).get("messages", []) + return [] + + +def yyds_get_message_detail(message_id, token=None, api_key=None, jwt=None): + key = api_key or get_yyds_api_key() + temp_token = token or jwt or get_yyds_jwt() + headers = {} + if temp_token: + headers["Authorization"] = f"Bearer {temp_token}" + elif key: + headers["X-API-Key"] = key + resp = http_get(f"{YYDS_API_BASE}/messages/{message_id}", headers=headers) + resp.raise_for_status() + data = resp.json() + if data.get("success"): + return data.get("data", {}) + raise Exception(f"YYDS 鑾峰彇閭欢璇︽儏澶辫触: {data}") + + +def yyds_generate_username(length=10): + chars = string.ascii_lowercase + string.digits + return "".join(secrets.choice(chars) for _ in range(length)) + + +def yyds_pick_domain(api_key=None, jwt=None): + domains = yyds_get_domains(api_key=api_key, jwt=jwt) + if not domains: + raise Exception("YYDS 娌℃湁杩斿洖浠讳綍鍙敤鍩熷悕") + private = [d for d in domains if d.get("isVerified") and not d.get("isPublic")] + if private: + return private[0]["domain"] + public = [d for d in domains if d.get("isVerified") and d.get("isPublic")] + if public: + return public[0]["domain"] + verified = [d for d in domains if d.get("isVerified")] + if verified: + return verified[0]["domain"] + raise Exception("YYDS 鏃犲凡楠岃瘉鍩熷悕鍙敤") + + +def yyds_get_email_and_token(api_key=None, jwt=None): + key = api_key or get_yyds_api_key() + token = jwt or get_yyds_jwt() + if not token and not key: + raise Exception("YYDS API Key 或 JWT 未配置") + domain = yyds_pick_domain(api_key=key, jwt=token) + username = yyds_generate_username(10) + result = yyds_create_account( + address=username, domain=domain, api_key=key, jwt=token + ) + address = result.get("address") or f"{username}@{domain}" + temp_token = result.get("token") + if not temp_token: + temp_token = yyds_get_token(address, api_key=key, jwt=token) + if not temp_token: + raise Exception("鑾峰彇 YYDS token 澶辫触") + print(f"[*] 宸插垱寤?YYDS 閭: {address}") + return address, temp_token + + +def yyds_get_oai_code( + token, + address, + timeout=180, + poll_interval=3, + log_callback=None, + jwt=None, + cancel_callback=None, +): + deadline = time.time() + timeout + seen_ids = set() + while time.time() < deadline: + raise_if_cancelled(cancel_callback) + try: + messages = yyds_get_messages(address, token=token, jwt=jwt) + except Exception as exc: + if log_callback: + log_callback(f"[Debug] YYDS 鎷夊彇閭欢鍒楄〃澶辫触: {exc}") + sleep_with_cancel(poll_interval, cancel_callback) + continue + for msg in messages: + msg_id = msg.get("id") + if not msg_id or msg_id in seen_ids: + continue + seen_ids.add(msg_id) + to_addrs = [t.get("address", "").lower() for t in (msg.get("to") or [])] + if address.lower() not in to_addrs: + continue + try: + detail = yyds_get_message_detail(msg_id, token=token, jwt=jwt) + except Exception as exc: + if log_callback: + log_callback(f"[Debug] YYDS 鑾峰彇閭欢璇︽儏澶辫触: {exc}") + continue + parts = [] + text_body = detail.get("text") or "" + if text_body: + parts.append(text_body) + html_list = detail.get("html") or [] + for h in html_list: + parts.append(re.sub(r"<[^>]+>", " ", h)) + combined = "\n".join(parts) + subject = detail.get("subject", "") + if log_callback: + log_callback(f"[Debug] YYDS 鏀跺埌閭欢: {subject}") + code = extract_verification_code(combined, subject) + if code: + if log_callback: + log_callback(f"[Debug] YYDS 浠庨偖浠朵腑鎻愬彇鍒伴獙璇佺爜: {code}") + return code + sleep_with_cancel(poll_interval, cancel_callback) + raise Exception(f"YYDS 在 {timeout}s 内未收到验证码邮件") + + +def generate_username(length=10): + chars = string.ascii_lowercase + string.digits + return "".join(secrets.choice(chars) for _ in range(length)) + + +def pick_domain(api_key=None): + domains = get_domains(api_key=api_key) + if not domains: + raise Exception("DuckMail 娌℃湁杩斿洖浠讳綍鍙敤鍩熷悕") + private = [d for d in domains if d.get("ownerId")] + verified_private = [d for d in private if d.get("isVerified")] + if verified_private: + return verified_private[0]["domain"] + public = [d for d in domains if d.get("isVerified")] + if public: + return public[0]["domain"] + raise Exception("DuckMail 鏃犲凡楠岃瘉鍩熷悕鍙敤") + + +def get_email_provider(): + return str(config.get("email_provider", "duckmail") or "duckmail").strip().lower() + + +def _config_bool(value, default=False): + if value is None: + return default + if isinstance(value, bool): + return value + if isinstance(value, (int, float)): + return bool(value) + if isinstance(value, str): + v = value.strip().lower() + if v in ("1", "true", "yes", "y", "on"): + return True + if v in ("0", "false", "no", "n", "off"): + return False + return default + + +def _parse_domain_list(raw): + return [x.strip().lower() for x in re.split(r"[,,\s]+", str(raw or "")) if x.strip()] + + +def cf_worker_domain_set(): + """走 CF Email Routing Worker 取码的域名集合(非 temp-email)。""" + return set(_parse_domain_list(config.get("cf_worker_domains") or config.get("gmail_worker_domains") or "")) + + +def next_register_domain(): + """从 defaultDomains 轮换取下一个注册邮箱域名。""" + global _cf_domain_index + domains = _parse_domain_list(config.get("defaultDomains") or "") + if not domains: + return "" + with _cf_domain_lock: + domain = domains[_cf_domain_index % len(domains)] + _cf_domain_index += 1 + return domain + + +def is_cf_worker_token(dev_token): + tok = str(dev_token or "").strip().lower() + return tok in ("cf_worker", "gmail_catch_all", "cf_email_worker") or tok.startswith("cf_worker:") + + +def _gmail_worker_enabled(): + if not _config_bool(config.get("gmail_worker_enabled", False), default=False): + return False + url = str(config.get("gmail_worker_url", "") or os.environ.get("GMAIL_WORKER_URL", "") or "").strip() + key = str(config.get("gmail_worker_api_key", "") or os.environ.get("GMAIL_WORKER_API_KEY", "") or "").strip() + return bool(url and key) + + +def _gmail_worker_base_url(): + return str(config.get("gmail_worker_url", "") or os.environ.get("GMAIL_WORKER_URL", "") or "").strip().rstrip("/") + + +def _gmail_worker_api_key(): + return str(config.get("gmail_worker_api_key", "") or os.environ.get("GMAIL_WORKER_API_KEY", "") or "").strip() + + +def gmail_worker_fetch_code( + email, + *, + timeout=25.0, + poll_interval=None, + log_callback=None, + cancel_callback=None, + consume=True, +): + """轮询 CF Email Worker GET /code?to=... 取验证码(非 temp-email)。""" + base = _gmail_worker_base_url() + key = _gmail_worker_api_key() + if not base or not key: + return None + if poll_interval is None: + try: + poll_interval = float(config.get("gmail_worker_poll_interval", 0.4) or 0.4) + except Exception: + poll_interval = 0.4 + poll_interval = max(0.15, min(float(poll_interval), 3.0)) + try: + timeout = float(timeout) + except Exception: + timeout = 25.0 + deadline = time.time() + max(1.0, timeout) + target = (email or "").strip().lower() + if not target: + return None + t0 = time.time() + polls = 0 + last_err = "" + url = f"{base}/code" + while time.time() < deadline: + raise_if_cancelled(cancel_callback) + polls += 1 + try: + # Worker 直连,不走注册代理 + resp = http_get( + url, + params={ + "to": target, + "key": key, + "consume": "1" if consume else "0", + }, + headers={"x-api-key": key}, + timeout=8, + proxies={}, + ) + if resp.status_code == 200: + try: + data = resp.json() + except Exception: + data = {} + if not isinstance(data, dict): + data = {} + code = str(data.get("code") or "").strip() + if code: + if log_callback: + log_callback( + f"[*] CF Worker 取到验证码: {code} " + f"(elapsed={time.time() - t0:.1f}s polls={polls})" + ) + return code + elif resp.status_code == 404: + last_err = "not found" + elif resp.status_code in (401, 403): + last_err = f"auth {resp.status_code}" + if log_callback and polls <= 2: + log_callback(f"[Debug] CF Worker 鉴权失败 HTTP {resp.status_code}") + if polls >= 3: + return None + else: + last_err = f"HTTP {resp.status_code}" + if log_callback and polls <= 3: + log_callback( + f"[Debug] CF Worker 响应 {resp.status_code}: {(resp.text or '')[:120]}" + ) + except Exception as exc: + last_err = str(exc) + if log_callback and polls <= 3: + log_callback(f"[Debug] CF Worker 请求失败: {exc}") + sleep_with_cancel(poll_interval, cancel_callback) + if log_callback: + log_callback( + f"[*] CF Worker {timeout:.0f}s 内未取到验证码 ({last_err or 'timeout'})" + ) + return None + + +def cf_worker_get_email_and_token(domain=None): + """CF catch-all 域名:本地生成别名,不调用 temp-email 创建接口。""" + domains = _parse_domain_list(config.get("defaultDomains") or "") + worker_domains = cf_worker_domain_set() + if domain: + use_domain = domain.strip().lower() + elif worker_domains: + # 优先 worker 域名列表与 defaultDomains 交集 + candidates = [d for d in domains if d in worker_domains] or list(worker_domains) + use_domain = candidates[0] + else: + if not domains: + raise Exception("CF Worker 模式需要 defaultDomains,如 zhangyunuo.net") + use_domain = domains[0] + username = generate_username(10) + address = f"{username}@{use_domain}" + return address, "cf_worker" + + +def cf_worker_get_oai_code( + email, + timeout=180, + log_callback=None, + cancel_callback=None, + resend_callback=None, +): + """优先 CF Worker HTTP 取码;可选 IMAP 兜底(需配置 gmail_imap_*)。""" + if not _gmail_worker_enabled(): + raise Exception( + "域名走 CF Worker 取码,但未配置 gmail_worker_enabled/url/api_key" + ) + try: + worker_timeout = float(config.get("gmail_worker_timeout_sec", 20) or 20) + except Exception: + worker_timeout = 20.0 + worker_timeout = max(4.0, min(worker_timeout, float(timeout))) + if log_callback: + log_callback(f"[*] 取码:CF Email Worker(timeout={worker_timeout:.0f}s){email}") + code = gmail_worker_fetch_code( + email, + timeout=worker_timeout, + log_callback=log_callback, + cancel_callback=cancel_callback, + consume=True, + ) + if code: + return code + + # 可选:Worker 未命中时触发重发再等一轮 + if resend_callback: + try: + resend_callback() + if log_callback: + log_callback("[*] CF Worker 未命中,已触发重发验证码,再等一轮") + except Exception: + pass + code = gmail_worker_fetch_code( + email, + timeout=min(15.0, worker_timeout), + log_callback=log_callback, + cancel_callback=cancel_callback, + consume=True, + ) + if code: + return code + + raise Exception(f"CF Worker 在 {worker_timeout:.0f}s 内未收到验证码: {email}") + + +def get_email_and_token(api_key=None): + provider = get_email_provider() + if provider == "yyds": + return yyds_get_email_and_token(api_key=api_key, jwt=get_yyds_jwt()) + if provider in ("gmail", "cf_worker", "cf-email-worker"): + return cf_worker_get_email_and_token() + if provider == "cloudflare": + # 双通道:defaultDomains 里 worker 域名本地生成;其余走 temp-email + domain = next_register_domain() + worker_domains = cf_worker_domain_set() + if domain and domain in worker_domains: + if not _gmail_worker_enabled(): + raise Exception( + f"域名 {domain} 配置为 CF Worker,但 gmail_worker_* 未就绪" + ) + return cf_worker_get_email_and_token(domain=domain) + api_base = get_cloudflare_api_base() + if not api_base: + raise Exception("Cloudflare API Base 未配置") + try: + return cloudflare_create_temp_address(api_base, preferred_domain=domain or None) + except Exception as primary_exc: + # 若 temp-email 失败且 worker 可用,可回退到 worker 域名 + if worker_domains and _gmail_worker_enabled(): + fallback = next(iter(worker_domains)) + return cf_worker_get_email_and_token(domain=fallback) + key = api_key or get_cloudflare_api_key() + domains = cloudflare_get_domains(api_base, api_key=key) + if not domains: + raise Exception(f"Cloudflare 创建邮箱失败: {primary_exc}") + verified = [d for d in domains if d.get("isVerified")] + target = verified[0] if verified else domains[0] + domain = target.get("domain") + if not domain: + raise Exception("Cloudflare 域名数据格式错误,缺少 domain 字段") + username = generate_username(10) + address = f"{username}@{domain}" + password = secrets.token_urlsafe(12) + cloudflare_create_account( + api_base, address, password, api_key=key, expires_in=0 + ) + token = cloudflare_get_token(api_base, address, password, api_key=key) + if not token: + raise Exception("获取 Cloudflare 邮箱 token 失败") + return address, token + key = api_key or get_duckmail_api_key() + domain = pick_domain(api_key=key) + username = generate_username(10) + address = f"{username}@{domain}" + password = secrets.token_urlsafe(12) + create_account(address, password, api_key=key, expires_in=0) + token = get_token(address, password) + if not token: + raise Exception("获取 DuckMail token 失败") + return address, token + + +def get_oai_code( + dev_token, + email, + timeout=180, + poll_interval=3, + log_callback=None, + cancel_callback=None, + resend_callback=None, +): + provider = get_email_provider() + # 按 token / 收件域名分流:worker 域名绝不走 temp-email 拉信 + email_domain = "" + if email and "@" in email: + email_domain = email.rsplit("@", 1)[-1].strip().lower() + if ( + is_cf_worker_token(dev_token) + or provider in ("gmail", "cf_worker", "cf-email-worker") + or (email_domain and email_domain in cf_worker_domain_set()) + ): + return cf_worker_get_oai_code( + email, + timeout=timeout, + log_callback=log_callback, + cancel_callback=cancel_callback, + resend_callback=resend_callback, + ) + if provider == "yyds": + return yyds_get_oai_code( + dev_token, + email, + timeout=timeout, + poll_interval=poll_interval, + log_callback=log_callback, + jwt=get_yyds_jwt(), + cancel_callback=cancel_callback, + ) + if provider == "cloudflare": + return cloudflare_get_oai_code( + dev_token, + email, + timeout=timeout, + poll_interval=poll_interval, + log_callback=log_callback, + cancel_callback=cancel_callback, + resend_callback=resend_callback, + ) + return duckmail_get_oai_code( + dev_token, + email, + timeout=timeout, + poll_interval=poll_interval, + log_callback=log_callback, + cancel_callback=cancel_callback, + ) + + +def extract_verification_code(text, subject=""): + if subject: + match = re.search(r"^([A-Z0-9]{3}-[A-Z0-9]{3})\s+xAI", subject, re.IGNORECASE) + if match: + return match.group(1) + match = re.search(r"\b([A-Z0-9]{3}-[A-Z0-9]{3})\b", text, re.IGNORECASE) + if match: + return match.group(1) + patterns = [ + r"verification\s+code[:\s]+(\d{4,8})", + r"your\s+code[:\s]+(\d{4,8})", + r"confirm(?:ation)?\s+code[:\s]+(\d{4,8})", + ] + for pattern in patterns: + match = re.search(pattern, text, re.IGNORECASE) + if match: + return match.group(1) + return None + + +def duckmail_get_oai_code( + dev_token, + email, + timeout=180, + poll_interval=3, + log_callback=None, + cancel_callback=None, +): + deadline = time.time() + timeout + seen_ids = set() + while time.time() < deadline: + raise_if_cancelled(cancel_callback) + try: + messages = get_messages(dev_token) + except Exception as exc: + if log_callback: + log_callback(f"[Debug] 鎷夊彇閭欢鍒楄〃澶辫触: {exc}") + sleep_with_cancel(poll_interval, cancel_callback) + continue + for msg in messages: + msg_id = msg.get("id") or msg.get("msgid") + if not msg_id or msg_id in seen_ids: + continue + seen_ids.add(msg_id) + recipients = [t.get("address", "").lower() for t in (msg.get("to") or [])] + if email.lower() not in recipients: + continue + try: + detail = get_message_detail(dev_token, msg_id) + except Exception as exc: + if log_callback: + log_callback(f"[Debug] 鑾峰彇閭欢璇︽儏澶辫触: {exc}") + continue + parts = [] + text_body = detail.get("text") or "" + if text_body: + parts.append(text_body) + html_list = detail.get("html") or [] + for h in html_list: + parts.append(re.sub(r"<[^>]+>", " ", h)) + combined = "\n".join(parts) + subject = detail.get("subject", "") + if log_callback: + log_callback(f"[Debug] 鏀跺埌閭欢: {subject}") + code = extract_verification_code(combined, subject) + if code: + if log_callback: + log_callback(f"[Debug] 浠庨偖浠朵腑鎻愬彇鍒伴獙璇佺爜: {code}") + return code + sleep_with_cancel(poll_interval, cancel_callback) + raise Exception(f"在 {timeout}s 内未收到验证码邮件") + + +def cloudflare_get_oai_code( + dev_token, + email, + timeout=180, + poll_interval=3, + log_callback=None, + cancel_callback=None, + resend_callback=None, +): + api_base = get_cloudflare_api_base() + if not api_base: + raise Exception("Cloudflare API Base 未配置") + deadline = time.time() + timeout + # 同一封邮件正文可能延迟可读,允许多次重试解析,避免偶发漏码 + seen_attempts = {} + next_resend_at = time.time() + 35 + while time.time() < deadline: + raise_if_cancelled(cancel_callback) + if resend_callback and time.time() >= next_resend_at: + try: + resend_callback() + if log_callback: + log_callback("[Debug] 已触发重新发送验证码") + except Exception as exc: + if log_callback: + log_callback(f"[Debug] 触发重发验证码失败: {exc}") + next_resend_at = time.time() + 35 + try: + messages = cloudflare_get_messages(api_base, dev_token) + except Exception as exc: + if log_callback: + log_callback(f"[Debug] Cloudflare 拉取邮件列表失败: {exc}") + sleep_with_cancel(poll_interval, cancel_callback) + continue + if log_callback: + log_callback(f"[Debug] Cloudflare 本轮邮件数量: {len(messages)}") + + for msg in messages: + msg_id = msg.get("id") or msg.get("msgid") + if not msg_id: + continue + attempt = int(seen_attempts.get(msg_id, 0)) + if attempt >= 5: + continue + seen_attempts[msg_id] = attempt + 1 + recipients = [t.get("address", "").lower() for t in (msg.get("to") or [])] + msg_addr = str(msg.get("address", "")).lower() + # 优先匹配目标邮箱;若结构不一致也允许继续解析,避免接口字段漂移导致漏码 + address_matched = True + if recipients: + address_matched = email.lower() in recipients + elif msg_addr: + address_matched = msg_addr == email.lower() + if not address_matched and log_callback: + log_callback(f"[Debug] 跳过疑似非目标邮件 id={msg_id} address={msg_addr} to={recipients}") + continue + parts = [] + # 先直接从列表项取内容,避免 detail 接口差异导致漏码 + for field in ("text", "raw", "content", "intro", "body", "snippet"): + value = msg.get(field) + if isinstance(value, str) and value.strip(): + parts.append(value) + html_list = msg.get("html") or [] + if isinstance(html_list, str): + html_list = [html_list] + for h in html_list: + parts.append(re.sub(r"<[^>]+>", " ", h)) + subject = str(msg.get("subject", "") or "") + combined = "\n".join(parts) + # 再尝试 detail 接口补全内容 + try: + detail = cloudflare_get_message_detail(api_base, dev_token, msg_id) + for field in ("text", "raw", "content", "intro", "body", "snippet"): + value = detail.get(field) + if isinstance(value, str) and value.strip(): + combined += "\n" + value + html_list2 = detail.get("html") or [] + if isinstance(html_list2, str): + html_list2 = [html_list2] + for h in html_list2: + combined += "\n" + re.sub(r"<[^>]+>", " ", h) + if not subject: + subject = str(detail.get("subject", "") or "") + except Exception as exc: + if log_callback: + log_callback(f"[Debug] Cloudflare detail接口失败,改用列表内容解析: {exc}") + if log_callback: + log_callback(f"[Debug] Cloudflare 收到邮件: {subject}") + code = extract_verification_code(combined, subject) + if code: + if log_callback: + log_callback(f"[Debug] Cloudflare 从邮件中提取到验证码: {code}") + return code + elif log_callback: + log_callback(f"[Debug] 邮件已解析但未提取到验证码 id={msg_id} attempt={seen_attempts[msg_id]}") + sleep_with_cancel(poll_interval, cancel_callback) + raise Exception(f"Cloudflare 在 {timeout}s 内未收到验证码邮件") + + +def generate_random_birthdate(): + import datetime as dt + + today = dt.date.today() + age = random.randint(20, 40) + birth_year = today.year - age + birth_month = random.randint(1, 12) + birth_day = random.randint(1, 28) + return f"{birth_year}-{birth_month:02d}-{birth_day:02d}T16:00:00.000Z" + + +def response_preview(res, limit=200): + try: + text = str(res.text or "") + except Exception: + text = "" + text = re.sub(r"\s+", " ", text).strip() + return text[:limit] + + +def is_cloudflare_block_response(res): + try: + headers = {str(k).lower(): str(v).lower() for k, v in dict(res.headers).items()} + text = str(res.text or "").lower() + server = headers.get("server", "") + content_type = headers.get("content-type", "") + return ( + res.status_code in (403, 429, 503) + and ( + "cloudflare" in server + or "cloudflare" in text + or "cf-error" in text + or "__cf_chl" in text + or "text/html" in content_type + ) + ) + except Exception: + return False + + +def set_birth_date(session, log_callback=None): + url = "https://grok.com/rest/auth/set-birth-date" + new_headers = { + "content-type": "application/json", + "origin": "https://grok.com", + "referer": "https://grok.com/", + } + payload = {"birthDate": generate_random_birthdate()} + try: + res = session.post(url, json=payload, headers=new_headers, timeout=15) + if log_callback: + log_callback( + f"[Debug] set_birth_date status: {res.status_code}, body: {response_preview(res)}" + ) + if 200 <= res.status_code < 300: + return True, "ok" + if is_cloudflare_block_response(res): + return ( + False, + "set_birth_date 被 grok.com 的 Cloudflare 防护拦截,HTTP " + f"{res.status_code}", + ) + return False, f"set_birth_date HTTP {res.status_code}: {response_preview(res)}" + except Exception as e: + if log_callback: + log_callback(f"[set_birth_date] 异常: {e}") + return False, f"set_birth_date 异常: {e}" + + +def set_tos_accepted(session, log_callback=None): + url = "https://accounts.x.ai/auth_mgmt.AuthManagement/SetTosAcceptedVersion" + payload = struct.pack("B", (2 << 3) | 0) + struct.pack("B", 1) + data = b"\x00" + struct.pack(">I", len(payload)) + payload + new_headers = { + "content-type": "application/grpc-web+proto", + "x-grpc-web": "1", + "x-user-agent": "connect-es/2.1.1", + "origin": "https://accounts.x.ai", + "referer": "https://accounts.x.ai/accept-tos", + } + try: + res = session.post(url, data=data, headers=new_headers, timeout=15) + if log_callback: + log_callback(f"[Debug] set_tos_accepted status: {res.status_code}") + if 200 <= res.status_code < 300: + return True, "ok" + if is_cloudflare_block_response(res): + return ( + False, + "set_tos_accepted 被 accounts.x.ai 的 Cloudflare 防护拦截,HTTP " + f"{res.status_code}", + ) + return False, f"set_tos_accepted HTTP {res.status_code}: {response_preview(res)}" + except Exception as e: + if log_callback: + log_callback(f"[set_tos_accepted] 异常: {e}") + return False, f"set_tos_accepted 异常: {e}" + + +def encode_grpc_nsfw_settings(): + field1_content = bytes([0x10, 0x01]) + field1 = bytes([0x0A, len(field1_content)]) + field1_content + nsfw_string = b"always_show_nsfw_content" + field2_inner = bytes([0x0A, len(nsfw_string)]) + nsfw_string + field2 = bytes([0x12, len(field2_inner)]) + field2_inner + payload = field1 + field2 + return b"\x00" + struct.pack(">I", len(payload)) + payload + + +def update_nsfw_settings(session, log_callback=None): + url = "https://grok.com/auth_mgmt.AuthManagement/UpdateUserFeatureControls" + data = encode_grpc_nsfw_settings() + new_headers = { + "content-type": "application/grpc-web+proto", + "x-grpc-web": "1", + "origin": "https://grok.com", + "referer": "https://grok.com/", + } + try: + res = session.post(url, data=data, headers=new_headers, timeout=15) + if log_callback: + log_callback( + f"[Debug] update_nsfw status: {res.status_code}, body: {response_preview(res)}" + ) + if 200 <= res.status_code < 300: + return True, "ok" + if is_cloudflare_block_response(res): + return ( + False, + "update_nsfw_settings 被 grok.com 的 Cloudflare 防护拦截,HTTP " + f"{res.status_code}", + ) + return False, f"update_nsfw_settings HTTP {res.status_code}: {response_preview(res)}" + except Exception as e: + if log_callback: + log_callback(f"[update_nsfw] 异常: {e}") + return False, f"update_nsfw_settings 异常: {e}" + + +def enable_nsfw_for_token(token, cf_clearance="", log_callback=None): + proxies = get_proxies() + user_agent = get_user_agent() + try: + with requests.Session(impersonate="chrome120", proxies=proxies) as session: + cookie_parts = [f"sso={token}", f"sso-rw={token}"] + if cf_clearance: + cookie_parts.append(f"cf_clearance={cf_clearance}") + session.headers.update( + { + "user-agent": user_agent, + "cookie": "; ".join(cookie_parts), + } + ) + ok, message = set_tos_accepted(session, log_callback) + if not ok: + return False, message + ok, message = set_birth_date(session, log_callback) + if not ok: + return False, message + ok, message = update_nsfw_settings(session, log_callback) + if not ok: + return False, message + return True, "成功开启 NSFW" + except Exception as e: + return False, f"异常: {str(e)}" + + +SIGNUP_URL = "https://accounts.x.ai/sign-up?redirect=grok-com" + + +class BrowserSession: + """每个并发 worker 独立持有一个浏览器实例,取代原来的全局 browser/page。""" + + # 屏蔽的静态资源(省带宽);刻意不含 Turnstile 依赖的脚本/域名 + BLOCKED_URLS = [ + "*.png", "*.jpg", "*.jpeg", "*.gif", "*.webp", "*.svg", "*.ico", "*.bmp", + "*.woff", "*.woff2", "*.ttf", "*.otf", "*.eot", + "*.mp4", "*.webm", "*.m4v", "*.mp3", "*.ogg", "*.wav", + ] + + # 内联 turnstilePatch 扩展的核心补丁:在每个页面/子 frame 的最早期伪造 + # MouseEvent 的 screenX/screenY(随机屏幕基准 + clientX/Y),堵住 Cloudflare + # 检测自动化鼠标事件的通道。用 add_init_js 全局注入,无需外部 turnstilePatch 目录。 + STEALTH_INIT_JS = r""" +(function () { + try { + function _rnd(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } + var _sx = _rnd(800, 1200); + var _sy = _rnd(400, 600); + Object.defineProperty(MouseEvent.prototype, 'screenX', { + configurable: true, + get: function () { return _sx + this.clientX; } + }); + Object.defineProperty(MouseEvent.prototype, 'screenY', { + configurable: true, + get: function () { return _sy + this.clientY; } + }); + } catch (e) {} +})(); +""" + + def __init__(self, log_callback=None): + self.browser = None + self.page = None + self.log_callback = log_callback + + def _log(self, message): + if self.log_callback: + self.log_callback(message) + + def _apply_bandwidth_rules(self): + # 页面级拦截字体/媒体等静态资源省带宽(可选,默认关;可能影响验证渲染) + if self.page is None or not config.get("block_media_fonts", False): + return + try: + self.page.set.blocked_urls(self.BLOCKED_URLS) + except Exception: + pass + + def _apply_stealth_patch(self): + # 内联 turnstilePatch 补丁(可选,默认关;会改主文档指纹,可能弄巧成拙) + if self.page is None or not config.get("stealth_patch", False): + return + try: + self.page.add_init_js(self.STEALTH_INIT_JS) + except Exception: + pass + + def start(self): + last_exc = None + for attempt in range(1, 5): + try: + self.browser = Chromium(create_browser_options()) + try: + self._pid = self.browser.process_id + except Exception: + self._pid = None + try: + self._port = str(self.browser.address).rsplit(":", 1)[-1].strip() + except Exception: + self._port = None + tabs = self.browser.get_tabs() + self.page = tabs[-1] if tabs else self.browser.new_tab() + # 仅当开启了页面级钩子时才预热(确保 CDP 就绪); + # 默认全关时不预热,start 行为与最初脚本完全一致 + if config.get("block_media_fonts", False) or config.get( + "stealth_patch", False + ): + try: + self.page.get("about:blank") + except Exception: + pass + self._apply_bandwidth_rules() + self._apply_stealth_patch() + if attempt > 1: + self._log(f"[Debug] 浏览器第 {attempt} 次启动成功") + return self.browser, self.page + except Exception as exc: + last_exc = exc + self._log(f"[Debug] 浏览器启动失败(第{attempt}/4次): {exc}") + try: + if self.browser is not None: + self.browser.quit(del_data=True) + except Exception: + pass + self.browser = None + self.page = None + time.sleep(min(1.5 * attempt, 4)) + raise Exception(f"浏览器启动失败,已重试4次: {last_exc}") + + def stop(self): + pid = getattr(self, "_pid", None) + port = getattr(self, "_port", None) + if self.browser is not None: + try: + self.browser.quit(del_data=True) + except Exception: + pass + # quit 关不干净时兜底:按调试端口定位真正的 chrome 主进程并强杀整棵树 + _kill_chrome_session(pid, port) + self.browser = None + self.page = None + self._pid = None + self._port = None + + def restart(self): + self.stop() + gc.collect() + return self.start() + + def refresh_page(self): + if self.browser is None: + self.restart() + return self.page + try: + tabs = self.browser.get_tabs() + self.page = tabs[-1] if tabs else self.browser.new_tab() + self._apply_bandwidth_rules() + except Exception: + self.restart() + return self.page + + +def click_email_signup_button(session, timeout=10, log_callback=None, cancel_callback=None): + page = session.page + deadline = time.time() + timeout + while time.time() < deadline: + raise_if_cancelled(cancel_callback) + if log_callback: + log_callback("[Debug] 尝试查找“使用邮箱注册”按钮...") + + clicked = page.run_js(r""" +function isVisible(node) { + if (!node) return false; + const style = window.getComputedStyle(node); + if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false; + const rect = node.getBoundingClientRect(); + return rect.width > 0 && rect.height > 0; +} +function nodeText(node) { + return [ + node.innerText, + node.textContent, + node.getAttribute('aria-label'), + node.getAttribute('title'), + node.getAttribute('href'), + ].filter(Boolean).join(' ').replace(/\s+/g, ' ').trim(); +} +function scoreEntry(node) { + const compact = nodeText(node).replace(/\s+/g, ''); + const lower = compact.toLowerCase(); + if (compact.includes('使用邮箱注册')) return 100; + if (lower.includes('signupwithemail')) return 95; + if (lower.includes('continuewithemail')) return 90; + if (lower.includes('email') && (lower.includes('sign') || lower.includes('continue') || lower.includes('use') || lower.includes('with'))) return 80; + if (lower === 'email' || lower.includes('邮箱')) return 70; + return 0; +} +const candidates = Array.from(document.querySelectorAll('button, a, [role="button"]')) + .filter((node) => isVisible(node) && !node.disabled && node.getAttribute('aria-disabled') !== 'true') + .map((node) => ({ node, score: scoreEntry(node), text: nodeText(node) })) + .filter((item) => item.score > 0) + .sort((a, b) => b.score - a.score); +const target = candidates[0]?.node || null; +if (!target) { + return false; +} +target.click(); +return candidates[0].text || true; + """) + + if clicked: + if log_callback: + detail = f": {clicked}" if isinstance(clicked, str) else "" + log_callback(f"[Debug] 已点击「使用邮箱注册」按钮{detail}") + sleep_with_cancel(2, cancel_callback) + return True + + if log_callback: + current_url = page.url if page else "none" + log_callback(f"[Debug] 当前URL: {current_url}") + + sleep_with_cancel(1, cancel_callback) + + if log_callback: + page_html = page.html[:500] if page else "no page" + log_callback(f"[Debug] 页面内容片段: {page_html}") + + raise Exception("未找到「使用邮箱注册」按钮") + + +def open_signup_page(session, log_callback=None, cancel_callback=None): + raise_if_cancelled(cancel_callback) + if session.browser is None: + session.start() + if log_callback: + log_callback("[Debug] 浏览器已启动") + try: + page = session.browser.get_tab(0) + page.get(SIGNUP_URL) + except Exception as e: + if log_callback: + log_callback(f"[Debug] 打开URL异常: {e}") + try: + page = session.browser.new_tab(SIGNUP_URL) + except Exception as e2: + if log_callback: + log_callback(f"[Debug] 创建新标签页异常: {e2}") + session.restart() + page = session.browser.new_tab(SIGNUP_URL) + session.page = page + session._apply_bandwidth_rules() + page.wait.doc_loaded() + sleep_with_cancel(2, cancel_callback) + if log_callback: + log_callback(f"[Debug] 当前URL: {page.url}") + click_email_signup_button( + session, log_callback=log_callback, cancel_callback=cancel_callback + ) + + +def has_profile_form(session, log_callback=None): + session.refresh_page() + page = session.page + try: + return bool( + page.run_js( + """ +const givenInput = document.querySelector('input[data-testid="givenName"], input[name="givenName"], input[autocomplete="given-name"]'); +const familyInput = document.querySelector('input[data-testid="familyName"], input[name="familyName"], input[autocomplete="family-name"]'); +const passwordInput = document.querySelector('input[data-testid="password"], input[name="password"], input[type="password"]'); +return !!(givenInput && familyInput && passwordInput); + """ + ) + ) + except Exception: + return False + + +def fill_email_and_submit(session, timeout=45, log_callback=None, cancel_callback=None): + page = session.page + raise_if_cancelled(cancel_callback) + email, dev_token = get_email_and_token() + if not email or not dev_token: + raise Exception("获取邮箱失败") + if log_callback: + log_callback(f"[Debug] 已创建邮箱: {email}") + deadline = time.time() + timeout + last_diag_time = 0 + last_reclick_time = 0 + last_snapshot = None + while time.time() < deadline: + raise_if_cancelled(cancel_callback) + filled = page.run_js( + """ +const email = arguments[0]; +function isVisible(node) { + if (!node) return false; + const style = window.getComputedStyle(node); + if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false; + const rect = node.getBoundingClientRect(); + return rect.width > 0 && rect.height > 0; +} +function textOf(node) { + return [ + node.innerText, + node.textContent, + node.getAttribute('aria-label'), + node.getAttribute('title'), + node.getAttribute('placeholder'), + node.getAttribute('data-testid'), + node.getAttribute('name'), + node.getAttribute('id'), + node.getAttribute('autocomplete'), + ].filter(Boolean).join(' ').replace(/\s+/g, ' ').trim(); +} +function describeInput(node) { + return [ + `type=${node.getAttribute('type') || ''}`, + `name=${node.getAttribute('name') || ''}`, + `id=${node.getAttribute('id') || ''}`, + `placeholder=${node.getAttribute('placeholder') || ''}`, + `aria=${node.getAttribute('aria-label') || ''}`, + `testid=${node.getAttribute('data-testid') || ''}`, + ].join(' ').replace(/\s+/g, ' ').trim().slice(0, 160); +} +function describeAction(node) { + return textOf(node).slice(0, 120); +} +function emailCandidates() { + const direct = Array.from(document.querySelectorAll('input[data-testid="email"], input[name="email"], input[type="email"], input[autocomplete="email"], input[placeholder*="mail" i], input[aria-label*="mail" i]')); + const all = Array.from(document.querySelectorAll('input, textarea')); + for (const node of all) { + const type = (node.getAttribute('type') || '').toLowerCase(); + if (['hidden', 'submit', 'button', 'checkbox', 'radio', 'file', 'search'].includes(type)) continue; + const meta = textOf(node).toLowerCase(); + if (meta.includes('email') || meta.includes('e-mail') || meta.includes('mail') || meta.includes('邮箱') || meta.includes('电子邮件')) { + direct.push(node); + } + } + return Array.from(new Set(direct)); +} +const visibleInputs = Array.from(document.querySelectorAll('input, textarea')) + .filter((node) => isVisible(node) && !node.disabled && !node.readOnly) + .map(describeInput) + .slice(0, 8); +const visibleActions = Array.from(document.querySelectorAll('button, a, [role="button"]')) + .filter((node) => isVisible(node) && !node.disabled && node.getAttribute('aria-disabled') !== 'true') + .map(describeAction) + .filter(Boolean) + .slice(0, 10); +const input = emailCandidates().find((node) => isVisible(node) && !node.disabled && !node.readOnly) || null; +if (!input) { + return { + state: 'not-ready', + url: location.href, + title: document.title, + inputs: visibleInputs, + buttons: visibleActions, + }; +} +input.focus(); input.click(); +const valueProto = input instanceof HTMLTextAreaElement ? HTMLTextAreaElement.prototype : HTMLInputElement.prototype; +const valueSetter = Object.getOwnPropertyDescriptor(valueProto, 'value')?.set; +const tracker = input._valueTracker; +if (tracker) tracker.setValue(''); +if (valueSetter) valueSetter.call(input, email); else input.value = email; +input.dispatchEvent(new InputEvent('beforeinput', { bubbles: true, data: email, inputType: 'insertText' })); +input.dispatchEvent(new InputEvent('input', { bubbles: true, data: email, inputType: 'insertText' })); +input.dispatchEvent(new Event('change', { bubbles: true })); +const inputType = (input.getAttribute('type') || '').toLowerCase(); +const isValid = inputType !== 'email' || input.checkValidity(); +if ((input.value || '').trim() !== email || !isValid) { + return { + state: 'fill-failed', + value: input.value || '', + valid: isValid, + input: describeInput(input), + url: location.href, + }; +} +input.blur(); +return { + state: 'filled', + input: describeInput(input), + url: location.href, +}; + """, + email, + ) + state = filled.get("state") if isinstance(filled, dict) else filled + if isinstance(filled, dict): + last_snapshot = filled + if state == "not-ready": + now = time.time() + if now - last_reclick_time >= 3: + reclicked = page.run_js(r""" +function isVisible(node) { + if (!node) return false; + const style = window.getComputedStyle(node); + if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false; + const rect = node.getBoundingClientRect(); + return rect.width > 0 && rect.height > 0; +} +function nodeText(node) { + return [ + node.innerText, + node.textContent, + node.getAttribute('aria-label'), + node.getAttribute('title'), + node.getAttribute('href'), + ].filter(Boolean).join(' ').replace(/\s+/g, ' ').trim(); +} +function scoreEntry(node) { + const compact = nodeText(node).replace(/\s+/g, ''); + const lower = compact.toLowerCase(); + if (compact.includes('使用邮箱注册')) return 100; + if (lower.includes('signupwithemail')) return 95; + if (lower.includes('continuewithemail')) return 90; + if (lower.includes('email') && (lower.includes('sign') || lower.includes('continue') || lower.includes('use') || lower.includes('with'))) return 80; + if (lower === 'email' || lower.includes('邮箱')) return 70; + return 0; +} +const candidates = Array.from(document.querySelectorAll('button, a, [role="button"]')) + .filter((node) => isVisible(node) && !node.disabled && node.getAttribute('aria-disabled') !== 'true') + .map((node) => ({ node, score: scoreEntry(node), text: nodeText(node) })) + .filter((item) => item.score > 0) + .sort((a, b) => b.score - a.score); +if (!candidates.length) return false; +candidates[0].node.click(); +return candidates[0].text || true; + """) + last_reclick_time = now + if reclicked and log_callback: + detail = f": {reclicked}" if isinstance(reclicked, str) else "" + log_callback(f"[Debug] 邮箱输入框未出现,已再次触发邮箱注册入口{detail}") + if log_callback and now - last_diag_time >= 5: + last_diag_time = now + inputs = " | ".join((filled or {}).get("inputs", [])[:6]) if isinstance(filled, dict) else "" + buttons = " | ".join((filled or {}).get("buttons", [])[:8]) if isinstance(filled, dict) else "" + url = (filled or {}).get("url", page.url if page else "") if isinstance(filled, dict) else (page.url if page else "") + log_callback(f"[Debug] 等待邮箱输入框: url={url}; inputs={inputs or 'none'}; buttons={buttons or 'none'}") + sleep_with_cancel(0.5, cancel_callback) + continue + if state != "filled": + if log_callback: + log_callback(f"[Debug] 邮箱输入框已出现,但写入失败: {filled}") + sleep_with_cancel(0.5, cancel_callback) + continue + sleep_with_cancel(0.8, cancel_callback) + clicked = page.run_js( + r""" +function isVisible(node) { + if (!node) return false; + const style = window.getComputedStyle(node); + if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false; + const rect = node.getBoundingClientRect(); + return rect.width > 0 && rect.height > 0; +} +function textOf(node) { + return [ + node.innerText, + node.textContent, + node.getAttribute('aria-label'), + node.getAttribute('title'), + node.getAttribute('placeholder'), + node.getAttribute('data-testid'), + node.getAttribute('name'), + node.getAttribute('id'), + node.getAttribute('autocomplete'), + ].filter(Boolean).join(' ').replace(/\s+/g, ' ').trim(); +} +function emailCandidates() { + const direct = Array.from(document.querySelectorAll('input[data-testid="email"], input[name="email"], input[type="email"], input[autocomplete="email"], input[placeholder*="mail" i], input[aria-label*="mail" i]')); + const all = Array.from(document.querySelectorAll('input, textarea')); + for (const node of all) { + const type = (node.getAttribute('type') || '').toLowerCase(); + if (['hidden', 'submit', 'button', 'checkbox', 'radio', 'file', 'search'].includes(type)) continue; + const meta = textOf(node).toLowerCase(); + if (meta.includes('email') || meta.includes('e-mail') || meta.includes('mail') || meta.includes('邮箱') || meta.includes('电子邮件')) { + direct.push(node); + } + } + return Array.from(new Set(direct)); +} +const input = emailCandidates().find((node) => isVisible(node) && !node.disabled && !node.readOnly) || null; +if (!input || !(input.value || '').trim()) return false; +const inputType = (input.getAttribute('type') || '').toLowerCase(); +if (inputType === 'email' && !input.checkValidity()) return false; +const buttons = Array.from(document.querySelectorAll('button[type="submit"], button, [role="button"], input[type="submit"]')) + .filter((node) => isVisible(node) && !node.disabled && node.getAttribute('aria-disabled') !== 'true'); +const submitButton = buttons.find((node) => { + const text = textOf(node).replace(/\s+/g, ''); + const lower = text.toLowerCase(); + return ( + text === '注册' || + text.includes('注册') || + text.includes('继续') || + text.includes('下一步') || + text.includes('确认') || + lower.includes('signup') || + lower.includes('sign up') || + lower.includes('continue') || + lower.includes('next') || + lower.includes('createaccount') || + lower.includes('submit') + ); +}); +if (submitButton) { + submitButton.click(); + return textOf(submitButton) || true; +} +const form = input.closest('form'); +if (form) { + if (form.requestSubmit) form.requestSubmit(); + else form.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true })); + return 'form-submit'; +} +input.focus(); +input.dispatchEvent(new KeyboardEvent('keydown', { key: 'Enter', code: 'Enter', bubbles: true, cancelable: true })); +input.dispatchEvent(new KeyboardEvent('keyup', { key: 'Enter', code: 'Enter', bubbles: true, cancelable: true })); +return 'enter'; + """ + ) + if clicked: + if log_callback: + detail = f" ({clicked})" if isinstance(clicked, str) else "" + log_callback(f"[Debug] 已填写邮箱并提交: {email}{detail}") + return email, dev_token + sleep_with_cancel(0.5, cancel_callback) + if last_snapshot: + inputs = " | ".join(last_snapshot.get("inputs", [])[:6]) + buttons = " | ".join(last_snapshot.get("buttons", [])[:8]) + url = last_snapshot.get("url", page.url if page else "") + raise Exception( + f"未找到邮箱输入框或注册按钮,最后页面: url={url}; inputs={inputs or 'none'}; buttons={buttons or 'none'}" + ) + raise Exception("未找到邮箱输入框或注册按钮") + + +def fill_code_and_submit(session, email, dev_token, timeout=180, log_callback=None, cancel_callback=None): + page = session.page + + def _resend_code(): + page.run_js( + r""" +const nodes = Array.from(document.querySelectorAll('button, a, [role="button"]')); +const target = nodes.find((node) => { + const t = (node.innerText || node.textContent || '').replace(/\s+/g, '').toLowerCase(); + return t.includes('重新发送') || t.includes('resend') || t.includes('再次发送'); +}); +if (target && !target.disabled) { target.click(); return true; } +return false; + """ + ) + + code = get_oai_code( + dev_token, + email, + log_callback=log_callback, + cancel_callback=cancel_callback, + resend_callback=_resend_code, + ) + if not code: + raise Exception("获取验证码失败") + clean_code = str(code).replace("-", "").strip() + deadline = time.time() + timeout + + while time.time() < deadline: + raise_if_cancelled(cancel_callback) + filled = page.run_js( + """ +const code = String(arguments[0] || '').trim(); +if (!code) return 'empty-code'; + +function isVisible(node) { + if (!node) return false; + const style = window.getComputedStyle(node); + if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false; + const rect = node.getBoundingClientRect(); + return rect.width > 0 && rect.height > 0; +} + +function setInputValue(input, value) { + const nativeSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set; + const tracker = input._valueTracker; + if (tracker) tracker.setValue(''); + if (nativeSetter) nativeSetter.call(input, value); + else input.value = value; + input.dispatchEvent(new InputEvent('beforeinput', { bubbles: true, data: value, inputType: 'insertText' })); + input.dispatchEvent(new InputEvent('input', { bubbles: true, data: value, inputType: 'insertText' })); + input.dispatchEvent(new Event('change', { bubbles: true })); +} + +const aggregate = Array.from(document.querySelectorAll( + 'input[data-input-otp=\"true\"], input[name=\"code\"], input[autocomplete=\"one-time-code\"], input[inputmode=\"numeric\"], input[inputmode=\"text\"]' +)).find((node) => isVisible(node) && !node.disabled && !node.readOnly && Number(node.maxLength || 6) > 1); + +if (aggregate) { + aggregate.focus(); + aggregate.click(); + setInputValue(aggregate, code); + return String(aggregate.value || '').replace(/\\s+/g, '') ? 'filled-aggregate' : 'aggregate-failed'; +} + +const otpBoxes = Array.from(document.querySelectorAll('input')).filter((node) => { + if (!isVisible(node) || node.disabled || node.readOnly) return false; + const maxLength = Number(node.maxLength || 0); + const ac = String(node.autocomplete || '').toLowerCase(); + return maxLength === 1 || ac === 'one-time-code'; +}); + +if (otpBoxes.length >= code.length) { + for (let i = 0; i < code.length; i += 1) { + const ch = code[i] || ''; + const box = otpBoxes[i]; + box.focus(); + box.click(); + setInputValue(box, ch); + box.dispatchEvent(new KeyboardEvent('keydown', { bubbles: true, key: ch })); + box.dispatchEvent(new KeyboardEvent('keyup', { bubbles: true, key: ch })); + } + const merged = otpBoxes.slice(0, code.length).map((x) => String(x.value || '').trim()).join(''); + return merged.length ? 'filled-boxes' : 'boxes-failed'; +} + +return 'not-ready'; + """, + clean_code, + ) + + if filled == "not-ready": + sleep_with_cancel(0.5, cancel_callback) + continue + if "failed" in str(filled): + if log_callback: + log_callback(f"[Debug] 验证码填写失败: {filled}") + sleep_with_cancel(0.5, cancel_callback) + continue + + clicked = page.run_js( + r""" +function isVisible(node) { + if (!node) return false; + const style = window.getComputedStyle(node); + if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false; + const rect = node.getBoundingClientRect(); + return rect.width > 0 && rect.height > 0; +} + +const buttons = Array.from(document.querySelectorAll('button[type=\"submit\"], button')).filter((node) => { + return isVisible(node) && !node.disabled && node.getAttribute('aria-disabled') !== 'true'; +}); + +const btn = buttons.find((node) => { + const t = (node.innerText || node.textContent || '').replace(/\\s+/g, '').toLowerCase(); + return ( + t.includes('确认邮箱') || + t.includes('继续') || + t.includes('下一步') || + t.includes('confirm') || + t.includes('continue') || + t.includes('next') + ); +}); + +if (!btn) return 'no-button'; +btn.focus(); +btn.click(); +return 'clicked'; + """ + ) + + if clicked == "clicked" or clicked == "no-button": + if log_callback: + log_callback(f"[Debug] 已填写验证码并提交: {code}") + sleep_with_cancel(1.5, cancel_callback) + return code + + sleep_with_cancel(0.5, cancel_callback) + + raise Exception("验证码已获取,但自动填写/提交失败") + + +def getTurnstileToken(session, log_callback=None, cancel_callback=None): + page = session.page + if page is None: + raise Exception("页面未就绪,无法执行 Turnstile") + + try: + page.run_js( + "try { if (window.turnstile && typeof turnstile.reset === 'function') turnstile.reset(); } catch(e) {}" + ) + except Exception: + pass + + for _ in range(0, 20): + raise_if_cancelled(cancel_callback) + try: + token = page.run_js( + """ +try { + const byInput = String((document.querySelector('input[name="cf-turnstile-response"]') || {}).value || '').trim(); + if (byInput) return byInput; + if (window.turnstile && typeof turnstile.getResponse === 'function') { + return String(turnstile.getResponse() || '').trim(); + } + return ''; +} catch(e) { return ''; } + """ + ) + token = str(token or "").strip() + if len(token) >= 80: + if log_callback: + log_callback(f"[Debug] Turnstile 已通过,token长度={len(token)}") + return token + + challenge_input = page.ele("@name=cf-turnstile-response") + if challenge_input: + wrapper = challenge_input.parent() + iframe = None + try: + iframe = wrapper.shadow_root.ele("tag:iframe") + except Exception: + iframe = None + if iframe: + try: + iframe.run_js( + """ +window.dtp = 1; +function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } +let sx = getRandomInt(800, 1200); +let sy = getRandomInt(400, 700); +Object.defineProperty(MouseEvent.prototype, 'screenX', { value: sx }); +Object.defineProperty(MouseEvent.prototype, 'screenY', { value: sy }); + """ + ) + except Exception: + pass + try: + body_sr = iframe.ele("tag:body").shadow_root + btn = body_sr.ele("tag:input") + if btn: + btn.click() + except Exception: + pass + else: + # 兜底:尝试触发页面上可见的 Turnstile 容器 + page.run_js( + """ +const nodes = Array.from(document.querySelectorAll('div,span,iframe')).filter((n) => { + const txt = (n.className || '') + ' ' + (n.id || '') + ' ' + (n.getAttribute?.('src') || ''); + return String(txt).toLowerCase().includes('turnstile'); +}); +if (nodes.length && typeof nodes[0].click === 'function') nodes[0].click(); + """ + ) + except Exception: + pass + sleep_with_cancel(1, cancel_callback) + + raise Exception("Turnstile 获取 token 失败") + + +def build_profile(): + given_name_pool = [ + "Neo", "Ethan", "Liam", "Noah", "Lucas", "Mason", "Ryan", "Leo", + "Owen", "Aiden", "Elio", "Aron", "Ivan", "Nolan", "Evan", "Kai", + "Caleb", "Adam", "Ezra", "Miles", "Logan", "Carter", "Hunter", "Jason", + "Brian", "Dylan", "Alex", "Colin", "Blake", "Gavin", "Henry", "Julian", + "Kevin", "Louis", "Marcus", "Nathan", "Oscar", "Peter", "Quinn", "Robin", + "Simon", "Tristan", "Victor", "Wesley", "Xavier", "Yuri", "Zane", "Felix", + "Aaron", "Damian", + ] + family_name_pool = [ + "Lin", "Wang", "Zhao", "Liu", "Chen", "Zhang", "Xu", "Sun", + "Guo", "He", "Yang", "Wu", "Zhou", "Tang", "Qin", "Shi", + "Fang", "Peng", "Cao", "Deng", "Fan", "Fu", "Gao", "Han", + "Hu", "Jiang", "Kong", "Lu", "Ma", "Nie", "Pan", "Qiao", + "Ren", "Shao", "Tian", "Xie", "Yan", "Yao", "Yu", "Zeng", + "Bai", "Duan", "Hou", "Jin", "Kang", "Luo", "Mao", "Song", + "Wei", "Xiong", + ] + given_name = random.choice(given_name_pool) + family_name = random.choice(family_name_pool) + password = "N" + secrets.token_hex(4) + "!a7#" + secrets.token_urlsafe(6) + return given_name, family_name, password + + +def fill_profile_and_submit(session, timeout=120, log_callback=None, cancel_callback=None): + page = session.page + given_name, family_name, password = build_profile() + deadline = time.time() + timeout + form_filled_once = False + wait_cf_since = None + last_cf_retry_at = 0.0 + + while time.time() < deadline: + raise_if_cancelled(cancel_callback) + if not form_filled_once: + filled = page.run_js( + """ +const givenName = arguments[0]; +const familyName = arguments[1]; +const password = arguments[2]; + +function isVisible(node) { + if (!node) return false; + const style = window.getComputedStyle(node); + if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false; + const rect = node.getBoundingClientRect(); + return rect.width > 0 && rect.height > 0; +} + +function pickInput(selector) { + return Array.from(document.querySelectorAll(selector)).find((node) => { + return isVisible(node) && !node.disabled && !node.readOnly; + }) || null; +} + +function setInputValue(input, value) { + if (!input) return false; + input.focus(); + input.click(); + const nativeSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set; + const tracker = input._valueTracker; + if (tracker) tracker.setValue(''); + if (nativeSetter) nativeSetter.call(input, value); + else input.value = value; + input.dispatchEvent(new InputEvent('beforeinput', { bubbles: true, data: value, inputType: 'insertText' })); + input.dispatchEvent(new InputEvent('input', { bubbles: true, data: value, inputType: 'insertText' })); + input.dispatchEvent(new Event('change', { bubbles: true })); + input.blur(); + return String(input.value || '').trim() === String(value || '').trim(); +} + +const givenInput = pickInput('input[data-testid="givenName"], input[name="givenName"], input[autocomplete="given-name"], input[aria-label*="名"]'); +const familyInput = pickInput('input[data-testid="familyName"], input[name="familyName"], input[autocomplete="family-name"], input[aria-label*="姓"]'); +const passwordInput = pickInput('input[data-testid="password"], input[name="password"], input[type="password"], input[autocomplete="new-password"]'); + +if (!givenInput || !familyInput || !passwordInput) return 'not-ready'; + +const ok1 = setInputValue(givenInput, givenName); +const ok2 = setInputValue(familyInput, familyName); +const ok3 = setInputValue(passwordInput, password); + +if (!ok1 || !ok2 || !ok3) return 'fill-failed'; + +const buttons = Array.from(document.querySelectorAll('button[type="submit"], button, [role="button"], input[type="submit"]')).filter((node) => { + return isVisible(node) && !node.disabled && node.getAttribute('aria-disabled') !== 'true'; +}); +const submitBtn = buttons.find((node) => { + const t = (node.innerText || node.textContent || '').replace(/\\s+/g, '').toLowerCase(); + return t.includes('完成注册') || t.includes('创建账户') || t.includes('signup') || t.includes('createaccount'); +}); + +// 必须等待 Cloudflare 校验通过后再提交 +const cfInput = document.querySelector('input[name="cf-turnstile-response"]'); +const cfPresent = !!cfInput + || !!document.querySelector('iframe[src*="turnstile"], div.cf-turnstile, [data-sitekey], script[src*="turnstile"]'); +if (cfPresent) { + const token = String((cfInput && cfInput.value) || '').trim(); + const solvedByToken = token.length >= 80; + if (!solvedByToken) return 'wait-cloudflare:' + token.length; +} + +if (submitBtn) { + return 'ready-to-submit'; +} +return 'filled-no-submit'; + """, + given_name, + family_name, + password, + ) + + if isinstance(filled, str) and filled.startswith("wait-cloudflare"): + form_filled_once = True + if log_callback: + token_len = filled.split(":", 1)[1] if ":" in filled else "0" + log_callback(f"[Debug] 资料已填写,等待 Cloudflare 人机验证通过... 当前token长度={token_len}") + if token_len == "0": + pause_seconds = random.uniform(1, 3) + if log_callback: + log_callback(f"[Debug] Cloudflare token 为空,暂停 {pause_seconds:.1f}s 后继续检测") + sleep_with_cancel(pause_seconds, cancel_callback) + now = time.time() + if wait_cf_since is None: + wait_cf_since = now + # 卡住后自动二次复用 Turnstile 组件 + if now - wait_cf_since >= 12 and now - last_cf_retry_at >= 8: + if log_callback: + log_callback("[Debug] Cloudflare 验证卡住,开始二次复用 Turnstile...") + try: + token = getTurnstileToken(session, log_callback=log_callback, cancel_callback=cancel_callback) + if token: + synced = page.run_js( + """ +const token = String(arguments[0] || '').trim(); +const cfInput = document.querySelector('input[name="cf-turnstile-response"]'); +if (!cfInput || !token) return false; +const nativeSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set; +if (nativeSetter) nativeSetter.call(cfInput, token); +else cfInput.value = token; +cfInput.dispatchEvent(new Event('input', { bubbles: true })); +cfInput.dispatchEvent(new Event('change', { bubbles: true })); +return String(cfInput.value || '').trim().length; + """, + token, + ) + if log_callback: + log_callback(f"[Debug] Turnstile 二次复用完成,回填长度={synced}") + except Exception as cf_exc: + if log_callback: + log_callback(f"[Debug] Turnstile 二次复用失败: {cf_exc}") + last_cf_retry_at = now + sleep_with_cancel(0.8, cancel_callback) + continue + + if filled in ("ready-to-submit", "filled-no-submit"): + form_filled_once = True + elif filled == "fill-failed" and log_callback: + log_callback("[Debug] 资料输入失败,重试中...") + sleep_with_cancel(0.5, cancel_callback) + continue + elif filled == "not-ready": + sleep_with_cancel(0.5, cancel_callback) + continue + + submit_state = page.run_js( + r""" +function isVisible(node) { + if (!node) return false; + const style = window.getComputedStyle(node); + if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false; + const rect = node.getBoundingClientRect(); + return rect.width > 0 && rect.height > 0; +} + +const cfInput = document.querySelector('input[name="cf-turnstile-response"]'); +const cfPresent = !!cfInput + || !!document.querySelector('iframe[src*="turnstile"], div.cf-turnstile, [data-sitekey], script[src*="turnstile"]'); +if (cfPresent) { + const token = String((cfInput && cfInput.value) || '').trim(); + const solvedByToken = token.length >= 80; + if (!solvedByToken) return 'wait-cloudflare:' + token.length; +} + +function buttonText(node) { + return [ + node.innerText, + node.textContent, + node.getAttribute('value'), + node.getAttribute('aria-label'), + node.getAttribute('title'), + ].filter(Boolean).join(' ').replace(/\s+/g, ' ').trim(); +} +const buttons = Array.from(document.querySelectorAll('button[type="submit"], button, [role="button"], input[type="submit"]')).filter((node) => { + return isVisible(node) && !node.disabled && node.getAttribute('aria-disabled') !== 'true'; +}); +const submitBtn = buttons.find((node) => { + const t = buttonText(node).replace(/\s+/g, '').toLowerCase(); + return t.includes('完成注册') || t.includes('创建账户') || t.includes('signup') || t.includes('createaccount'); +}); +if (!submitBtn) { + const visibleTexts = buttons.map(buttonText).filter(Boolean).slice(0, 8).join(' | '); + return 'no-submit-button:' + visibleTexts; +} +submitBtn.focus(); +submitBtn.click(); +return 'submitted'; + """ + ) + + if isinstance(submit_state, str) and submit_state.startswith("wait-cloudflare"): + if log_callback: + token_len = submit_state.split(":", 1)[1] if ":" in submit_state else "0" + log_callback(f"[Debug] 等待 Cloudflare 人机验证通过后再提交... 当前token长度={token_len}") + now = time.time() + if wait_cf_since is None: + wait_cf_since = now + if now - wait_cf_since >= 12 and now - last_cf_retry_at >= 8: + if log_callback: + log_callback("[Debug] 提交前仍卡住,自动再次复用 Turnstile...") + try: + token = getTurnstileToken(session, log_callback=log_callback, cancel_callback=cancel_callback) + if token: + synced = page.run_js( + """ +const token = String(arguments[0] || '').trim(); +const cfInput = document.querySelector('input[name="cf-turnstile-response"]'); +if (!cfInput || !token) return false; +const nativeSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set; +if (nativeSetter) nativeSetter.call(cfInput, token); +else cfInput.value = token; +cfInput.dispatchEvent(new Event('input', { bubbles: true })); +cfInput.dispatchEvent(new Event('change', { bubbles: true })); +return String(cfInput.value || '').trim().length; + """, + token, + ) + if log_callback: + log_callback(f"[Debug] Turnstile 二次复用完成,回填长度={synced}") + except Exception as cf_exc: + if log_callback: + log_callback(f"[Debug] Turnstile 二次复用失败: {cf_exc}") + last_cf_retry_at = now + sleep_with_cancel(0.8, cancel_callback) + continue + + if submit_state == "submitted": + if log_callback: + log_callback(f"[Debug] 已填写注册资料并提交: {given_name} {family_name}") + return {"given_name": given_name, "family_name": family_name, "password": password} + wait_cf_since = None + if isinstance(submit_state, str) and submit_state.startswith("no-submit-button") and log_callback: + visible_buttons = submit_state.split(":", 1)[1] if ":" in submit_state else "" + suffix = f" 可见按钮: {visible_buttons}" if visible_buttons else "" + log_callback(f"[Debug] 未找到提交按钮,继续等待页面稳定...{suffix}") + + sleep_with_cancel(0.5, cancel_callback) + + raise Exception("最终注册页资料填写失败") + + +def wait_for_sso_cookie(session, timeout=120, log_callback=None, cancel_callback=None): + page = session.page + deadline = time.time() + timeout + last_seen_names = set() + last_submit_retry = 0.0 + last_cf_retry_at = 0.0 + final_no_submit_state = "" + final_no_submit_since = None + final_no_submit_timeout = 25 + + while time.time() < deadline: + raise_if_cancelled(cancel_callback) + try: + session.refresh_page() + page = session.page + if page is None: + sleep_with_cancel(1, cancel_callback) + continue + + # 仍停留在“完成注册”页时,若 Cloudflare 已通过,周期性重试点击提交 + now = time.time() + if now - last_submit_retry >= 2.5: + retried = page.run_js( + r""" +function isVisible(node) { + if (!node) return false; + const style = window.getComputedStyle(node); + if (style.display === 'none' || style.visibility === 'hidden' || style.opacity === '0') return false; + const rect = node.getBoundingClientRect(); + return rect.width > 0 && rect.height > 0; +} +const titleHit = !!Array.from(document.querySelectorAll('h1,h2,div,span')).find((el) => { + const t = (el.textContent || '').replace(/\s+/g, ''); + const lower = t.toLowerCase(); + return t.includes('完成注册') || lower.includes('completeyoursignup') || lower.includes('completesignup'); +}); +if (!titleHit) return 'not-final-page'; + +const cfInput = document.querySelector('input[name="cf-turnstile-response"]'); +const cfPresent = !!cfInput + || !!document.querySelector('iframe[src*="turnstile"], div.cf-turnstile, [data-sitekey], script[src*="turnstile"]'); +if (cfPresent) { + const token = String((cfInput && cfInput.value) || '').trim(); + const solved = token.length >= 80; + if (!solved) return 'final-page-wait-cf:' + token.length; +} + +function buttonText(node) { + return [ + node.innerText, + node.textContent, + node.getAttribute('value'), + node.getAttribute('aria-label'), + node.getAttribute('title'), + ].filter(Boolean).join(' ').replace(/\s+/g, ' ').trim(); +} +const buttons = Array.from(document.querySelectorAll('button[type="submit"], button, [role="button"], input[type="submit"]')).filter((node) => { + return isVisible(node) && !node.disabled && node.getAttribute('aria-disabled') !== 'true'; +}); +const submitBtn = buttons.find((node) => { + const t = buttonText(node).replace(/\s+/g, '').toLowerCase(); + return t.includes('完成注册') || t.includes('创建账户') || t.includes('signup') || t.includes('createaccount'); +}); +if (!submitBtn) { + const visibleTexts = buttons.map(buttonText).filter(Boolean).slice(0, 8).join(' | '); + return 'final-page-no-submit:' + visibleTexts; +} +submitBtn.focus(); +submitBtn.click(); +return 'final-page-clicked-submit'; + """ + ) + last_submit_retry = now + if log_callback and (retried == "final-page-clicked-submit" or (isinstance(retried, str) and retried.startswith("final-page-no-submit"))): + log_callback(f"[Debug] 最终页状态: {retried}") + if isinstance(retried, str) and retried.startswith("final-page-no-submit"): + if retried != final_no_submit_state: + final_no_submit_state = retried + final_no_submit_since = now + elif final_no_submit_since and now - final_no_submit_since >= final_no_submit_timeout: + raise AccountRetryNeeded( + f"最终注册页状态 {final_no_submit_timeout}s 未变化且未找到提交按钮,重试当前账号: {retried}" + ) + else: + final_no_submit_state = "" + final_no_submit_since = None + if log_callback and isinstance(retried, str) and retried.startswith("final-page-wait-cf"): + token_len = retried.split(":", 1)[1] if ":" in retried else "0" + log_callback(f"[Debug] 最终页状态: final-page-wait-cf, token长度={token_len}") + if now - last_cf_retry_at >= 10: + if log_callback: + log_callback("[Debug] 最终页 Cloudflare 卡住,自动二次复用 Turnstile...") + try: + token = getTurnstileToken(session, log_callback=log_callback, cancel_callback=cancel_callback) + if token: + synced = page.run_js( + """ +const token = String(arguments[0] || '').trim(); +const cfInput = document.querySelector('input[name="cf-turnstile-response"]'); +if (!cfInput || !token) return false; +const nativeSetter = Object.getOwnPropertyDescriptor(window.HTMLInputElement.prototype, 'value')?.set; +if (nativeSetter) nativeSetter.call(cfInput, token); +else cfInput.value = token; +cfInput.dispatchEvent(new Event('input', { bubbles: true })); +cfInput.dispatchEvent(new Event('change', { bubbles: true })); +return String(cfInput.value || '').trim().length; + """, + token, + ) + if log_callback: + log_callback(f"[Debug] 最终页 Turnstile 二次复用完成,回填长度={synced}") + except Exception as cf_exc: + if log_callback: + log_callback(f"[Debug] 最终页 Turnstile 二次复用失败: {cf_exc}") + last_cf_retry_at = now + + cookies = page.cookies(all_domains=True, all_info=True) or [] + for item in cookies: + if isinstance(item, dict): + name = str(item.get("name", "")).strip() + value = str(item.get("value", "")).strip() + else: + name = str(getattr(item, "name", "")).strip() + value = str(getattr(item, "value", "")).strip() + + if name: + last_seen_names.add(name) + + if name == "sso" and value: + if log_callback: + log_callback("[Debug] 已获取到 sso cookie") + return value + except PageDisconnectedError: + session.refresh_page() + page = session.page + except AccountRetryNeeded: + raise + except Exception: + pass + + sleep_with_cancel(1, cancel_callback) + + raise Exception( + f"等待超时:未获取到 sso cookie。已看到 cookies: {sorted(last_seen_names)}" + ) + + +def cli_log(message): + text = str(message) + # [Debug] 细节日志一律不输出,CLI 只保留必要信息 + if "[Debug]" in text: + return + timestamp = datetime.datetime.now().strftime("%H:%M:%S") + print(f"[{timestamp}] {text}", flush=True) + + +class SharedState: + """并发 worker 间共享的状态:名额发放、计数、文件与日志写入,全部加锁。""" + + def __init__(self, count, accounts_output_file): + self.count = count + self.accounts_output_file = accounts_output_file + self.mail_cred_file = os.path.join( + os.path.dirname(__file__), "mail_credentials.txt" + ) + self._issued = 0 # 已发放的名额数(总共发放 count 个) + self.success_count = 0 + self.fail_count = 0 + self.stop_requested = False + self._lock = threading.Lock() + self._io_lock = threading.Lock() + + def claim_slot(self): + """领取一个注册名额,返回 (是否成功, 序号)。""" + with self._lock: + if self.stop_requested or self._issued >= self.count: + return False, 0 + self._issued += 1 + return True, self._issued + + def record_success(self): + with self._lock: + self.success_count += 1 + return self.success_count + + def record_fail(self): + with self._lock: + self.fail_count += 1 + return self.fail_count + + def should_stop(self): + return self.stop_requested + + def stop(self): + self.stop_requested = True + + def log(self, worker_id, message): + with self._io_lock: + cli_log(f"[W{worker_id}] {message}") + + def save_account(self, line): + with self._io_lock: + try: + with open(self.accounts_output_file, "a", encoding="utf-8") as f: + f.write(line) + except Exception as exc: + cli_log(f"[Debug] 保存账号文件失败: {exc}") + + def save_mail_credential(self, email, dev_token): + with self._io_lock: + try: + with open(self.mail_cred_file, "a", encoding="utf-8") as f: + f.write(f"{email}\t{dev_token}\n") + except Exception: + pass + + +def register_one(session, shared, worker_id, slot_no): + """完成一个账号的完整注册流程(原串行循环体的一次迭代)。""" + + def log(msg): + shared.log(worker_id, msg) + + cancel = shared.should_stop + email = "" + dev_token = "" + code = "" + mail_ok = False + max_mail_retry = 3 + for mail_try in range(1, max_mail_retry + 1): + open_signup_page(session, log_callback=log, cancel_callback=cancel) + email, dev_token = fill_email_and_submit( + session, log_callback=log, cancel_callback=cancel + ) + log(f"[*] 邮箱: {email}") + shared.save_mail_credential(email, dev_token) + try: + code = fill_code_and_submit( + session, email, dev_token, log_callback=log, cancel_callback=cancel + ) + mail_ok = True + break + except Exception as mail_exc: + msg = str(mail_exc) + if ("未收到验证码" in msg or "验证码" in msg) and mail_try < max_mail_retry: + log(f"[!] 本邮箱未取到验证码,自动更换新邮箱重试: {msg}") + session.restart() + sleep_with_cancel(1, cancel) + continue + raise + + if not mail_ok: + raise Exception("验证码阶段失败,已达到最大重试次数") + profile = fill_profile_and_submit(session, log_callback=log, cancel_callback=cancel) + sso = wait_for_sso_cookie(session, log_callback=log, cancel_callback=cancel) + if config.get("enable_nsfw", True): + enable_nsfw_for_token(sso, log_callback=log) + password = profile.get("password", "") + shared.save_account(f"{email}----{password}----{sso}\n") + export_cpa_after_register( + email, password, session=session, sso=sso, log_callback=log + ) + return email + + +def register_worker(worker_id, shared): + """单个并发 worker:自建独立浏览器,循环领取名额并注册。""" + + def log(msg): + shared.log(worker_id, msg) + + session = BrowserSession(log_callback=log) + try: + session.start() + log("[Debug] 浏览器已启动") + except Exception as exc: + log(f"[!] 浏览器启动失败,worker 退出: {exc}") + return + + max_slot_retry = 3 + try: + while not shared.should_stop(): + ok, slot_no = shared.claim_slot() + if not ok: + break + log(f"--- 开始第 {slot_no}/{shared.count} 个账号 ---") + retry_count_for_slot = 0 + while True: + try: + email = register_one(session, shared, worker_id, slot_no) + total = shared.record_success() + log(f"[+] 注册成功: {email}(累计成功 {total})") + break + except RegistrationCancelled: + raise + except AccountRetryNeeded as exc: + retry_count_for_slot += 1 + if retry_count_for_slot <= max_slot_retry: + log( + f"[!] 当前账号流程卡住,重试第 {retry_count_for_slot}/{max_slot_retry} 次: {exc}" + ) + session.restart() + sleep_with_cancel(1, shared.should_stop) + continue + total = shared.record_fail() + log(f"[-] 当前账号已达到最大重试次数,跳过: {exc}(累计失败 {total})") + break + except Exception as exc: + total = shared.record_fail() + log(f"[-] 注册失败: {exc}(累计失败 {total})") + break + if shared.should_stop(): + break + session.restart() + except RegistrationCancelled: + log("[!] 注册被停止") + except Exception as exc: + log(f"[!] worker 异常退出: {exc}") + finally: + session.stop() + cleanup_mint_browsers() + log("[Debug] worker 结束") + + +def run_registration_concurrent(count, concurrency): + accounts_output_file = os.path.join( + os.path.dirname(__file__), + f"accounts_{datetime.datetime.now().strftime('%Y%m%d_%H%M%S')}.txt", + ) + concurrency = max(1, min(concurrency, count)) + shared = SharedState(count, accounts_output_file) + cli_log(f"[*] 开始并发注册,目标 {count} 个,并发 {concurrency} 个浏览器") + cli_log(f"[*] 成功账号将实时保存到: {accounts_output_file}") + threads = [] + for worker_id in range(concurrency): + t = threading.Thread( + target=register_worker, args=(worker_id, shared), daemon=True + ) + t.start() + threads.append(t) + time.sleep(1) # 错开各 worker 启动,降低同一出口 IP 的瞬时并发压力 + try: + while any(t.is_alive() for t in threads): + for t in threads: + t.join(timeout=0.5) + except KeyboardInterrupt: + shared.stop() + cli_log("[!] 收到 Ctrl+C,正在停止所有 worker 并清理...") + for t in threads: + t.join() + cleanup_stray_chrome() + cli_log(f"[*] 任务结束。成功 {shared.success_count} | 失败 {shared.fail_count}") + + +def main(): + load_config() + count = int(config.get("register_count", 1) or 1) + cli_log("[*] 已加载配置") + cli_log( + f"[*] 当前邮箱服务商: {config.get('email_provider', 'duckmail')} | 目标注册数: {count}" + ) + if config.get("cpa_export_enabled", True): + push = "开" if config.get("cpa_push_enabled", False) else "关" + cli_log( + f"[*] CPA 导出: 开启 | 目录: {config.get('cpa_auth_dir', './cpa_auths')} " + f"| 远端推送: {push}" + + (f" -> {config.get('cpa_remote_base')}" if config.get("cpa_push_enabled") else "") + ) + else: + cli_log("[*] CPA 导出: 关闭(仅写 accounts_*.txt)") + try: + raw = input("请输入并发数量(同时开几个浏览器,直接回车=1): ").strip() + except (KeyboardInterrupt, EOFError): + cli_log("[!] 已取消") + return + try: + concurrency = int(raw) if raw else 1 + except ValueError: + cli_log("[!] 并发数量无效,使用 1") + concurrency = 1 + if concurrency < 1: + concurrency = 1 + run_registration_concurrent(count, concurrency) + + +if __name__ == "__main__": + main() diff --git a/mail_credentials.txt b/mail_credentials.txt new file mode 100644 index 0000000..41024f9 --- /dev/null +++ b/mail_credentials.txt @@ -0,0 +1,177 @@ +ldnhvgcuog@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibGRuaHZnY3VvZ0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjEzNjB9.EPc5qD1ldeMnsgozH_6Q6ZKfRQMt3FUP-iuG6JKM_5w +0ut3371zzx@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiMHV0MzM3MXp6eEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjEzNjZ9.T9vVnU_hpVPnPJqReyms75emvYJ0w3zY3PN0j5wDQk4 +24m63z630y@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiMjRtNjN6NjMweUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjEzNzB9.FTNTLjgBIrz8Vs84knhmntqzIvcn1M8AYagEcaZccWQ +maxdobzdo8@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibWF4ZG9iemRvOEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjEzNzh9.zrJEBZRLpqfkIs6syFsWj4MRTOGhap-c0uoHpEqHz8g +ovplrqmm8a@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoib3ZwbHJxbW04YUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjEzODV9._sHMMLDb8kJF_CGVZk-nf3cFpYUUHGeS1EW2rbP-3lQ +t52djkzaix@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoidDUyZGpremFpeEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MTB9.DjGHI0aa8n9JBRBFgHN3vfJ0tr-wz_QUfvsv4GQyfZU +47rqyszuxf@zhangyunuo.net cf_worker +xpjt7028xd@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieHBqdDcwMjh4ZEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MTF9.nxkQbYeRO-xNgd6NvNQUYzWA_E_ZDfMvHv0x0sn4Qxw +7h7rugu538@zhangyunuo.net cf_worker +zdkbp65awf@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiemRrYnA2NWF3ZkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MTJ9.vsWUktW7qVi5Dcy6L4wsz_jgKmOWrS1Zn3o7D39r23o +ff3hm4tn68@zhangyunuo.net cf_worker +yhm3o9cg9j@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieWhtM285Y2c5akBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MTd9.rJAoA5zKPTV4uOPwTRLoJrykmPqhCSu0LyX2_VqxHQw +z2co9oecfd@zhangyunuo.net cf_worker +r4z3zzcnt0@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicjR6M3p6Y250MEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MTl9.kWaiXa_9MA1wwMOv9wMZTLPX_9JLnXnoRRCu6oVB12g +torp0cjv4s@zhangyunuo.net cf_worker +rogjfax8al@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicm9namZheDhhbEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MjN9.Zkq6cj1yTjeEivgOGVOXbRVL1n2nMx3xftD4YxRNR6g +mru98jnol6@zhangyunuo.net cf_worker +e33fwviqrh@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZTMzZnd2aXFyaEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MjR9.8kYpB_tJQYHsHCRTfQz5Ei1pSoB1trDY6AAbOUvmgt0 +karxzmtmt3@zhangyunuo.net cf_worker +faiymol7uk@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZmFpeW1vbDd1a0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MzB9.QRPK494puuMWoUuaxlwao6o1pAkq_pCRmQ91v3av-Qo +estvdafbw0@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZXN0dmRhZmJ3MEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MzF9.43B_ghCOzj0ie13wc2lXEzsvhCav6D1jICw4yCs-VQs +bv8pw4rwnq@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYnY4cHc0cnducUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MzJ9.q98MvPOfm5jCPEl9nJOJmYjA4sildtVeor8OXh8yl2A +nb2rgintjk@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibmIycmdpbnRqa0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MzN9.4XPelAD2mvSe1MXAAg-i5FwyBdN3Z1k2pOZ5shpqipg +6wcib1d19x@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNndjaWIxZDE5eEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MzR9.Ajqap74T0Je-WM4a5WgighLO-4jyg8qAyDB-30kJMGU +ymdri8j8y6@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieW1kcmk4ajh5NkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MzV9.0AvD_6v5BqBxPswkgMtqiEkQfoMVXKSqm15kicyzlp8 +jlrtj0krf4@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiamxydGowa3JmNEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0MzZ9.z9VRFoi8gs-bgxVQQqO2pKy4Zn4hTMhZpoa9taHhnoA +azh24dkd9w@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYXpoMjRka2Q5d0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0Mzd9.j0vOvXsSLZXyd_yPylQmu9i2EtnGiQw9ij4xD3lSPwY +2bzfrxlnn9@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiMmJ6ZnJ4bG5uOUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0Mzh9.0MU4ezfYMqaIcM-DxEbYXLBL8gym_zx3rIo3mAYV0p8 +8fpn0gjacl@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOGZwbjBnamFjbEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0Mzl9.QBg7wzI_0nX-6ig7E1XrxvLxpCluDX-a27JeilVozII +mn8sf1iyye@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibW44c2YxaXl5ZUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NDF9.XIMTAcuI-UwllhO2GYEtVzJd4Si4VGsaC-D5UOit_X0 +nsajm34em7@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibnNham0zNGVtN0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NDJ9.mUT01EhGdF_dVYgOtyrnh4In1EzM4KzSMBHSkMmWCmM +frdco6skje@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZnJkY282c2tqZUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NDN9.zobjJXY_d_JCPFQIy-eb52v9QhzGguIrX1R0-ZbBQmw +fia5t2n0og@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZmlhNXQybjBvZ0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NDR9.nqIP0k_8wJuI1E21O0klfOxg67JNx9hJ9iO4hTk8CIY +5u1b4dyaml@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNXUxYjRkeWFtbEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NDV9.M_W69l7jQ5fwrGv7u4eQf8XOQ0LEH2OKEWou0F9jSl8 +x3zg9qlu95@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieDN6ZzlxbHU5NUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NDZ9.h8wzag58Ty4RZsKFZ5zdNlXCSR_hCc2droSsi8mtDlw +rb27ceq176@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicmIyN2NlcTE3NkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NDd9.mrjXNgg2a99dekG3db7Uev4owwz_9ZwKTXGQKjOxVmg +e9z947etdd@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZTl6OTQ3ZXRkZEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NDl9.eiwPbPNCeAUcv4bkvklFQuLrSZ1VEYD8CfEg6Vjzjfw +8ujfsqp8zz@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOHVqZnNxcDh6ekBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NTB9.L3VGu-jDeSUtzfAhbwNH-9HpIVnEDcc55nPzX_1Ozn8 +6ya56uc9cm@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNnlhNTZ1YzljbUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NTF9.3c53t8VOWzIIc38b6soyweQdws9Z27NlLi6NymTaHQ4 +43wbsq0jyv@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNDN3YnNxMGp5dkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NTJ9.X3Q32mkSdREUg3ITk7gpXbLsB_u1v3NrQM2P5sMdj5U +ixe1hjo645@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiaXhlMWhqbzY0NUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NTR9.MQk-u6mO2xe8_dEmpxrvMYucmO-w-UG6TS2e7JHgJOA +r62zi7flqw@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicjYyemk3Zmxxd0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NTZ9.uH2fZM0cCSFWIY5tel-4YrQQ3vJpe7_uCSPR9sTXmNc +2gh9chzsqo@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiMmdoOWNoenNxb0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NTh9.Fo2xzWQNDppoJPShgG7_x2vYgJ26mBJG6ufscGc7dH4 +nl45jetu8c@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibmw0NWpldHU4Y0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NTl9.iFcgTVWr0gg2ubs2hGEqtMa509EORUgxn1SOvlptVrM +e2dsv3te98@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZTJkc3YzdGU5OEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NjB9.E4p5KaSKuZBLFWxF976bO2b4uKuuknrh-XNOJasaeuA +f7bo80h3lm@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZjdibzgwaDNsbUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NjF9.9gWWn45EN8vPNkYL5sr1tO3VgTXhJ_drX7knYAvJiG4 +vi6utfhjzl@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoidmk2dXRmaGp6bEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NjJ9.DdkE4aT-JWriRc2PlH6MgEIT6Cer5tduZqaGKjaUxno +u7ahgimo1x@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoidTdhaGdpbW8xeEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0NjV9.6rF2rI7JFsgsnNLfECwAZ8S0mtSYXPam8MNE4-Zm5Ck +1smfftlfge@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiMXNtZmZ0bGZnZUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0Njd9.68hn-vZ7SqVGH2jbzA5V9atZcgGgBUvu6dkhkaN96jU +2bkus632ss@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiMmJrdXM2MzJzc0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE0OTB9.D1iJsPVQWepKhLZQ4KIT71V6GklyuhSfUX4hEAwy9ZU +om6aktj95t@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoib202YWt0ajk1dEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MDJ9.2i7NhBmVxIvBBNIrfZdw1wd8CruDw2b4hjLLioSdqvQ +5uyyzhwpa7@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNXV5eXpod3BhN0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MDV9.wvk-Ltwu51TLTDTr_YZkJsPJ7U0jFBxfkJQzwHCIfkw +iekcdguksg@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiaWVrY2RndWtzZ0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MTF9.c-ddDRqHCGABExwq80SUNua0hiIEdhjCFn14tE8-qaQ +ki7rmpy5rr@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoia2k3cm1weTVyckBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MTR9.0Qj3vWKH4aiZWBOVcGM17TtZfe5xPKB5W3ZpzmkEFiE +64uqnvty4h@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNjR1cW52dHk0aEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MTV9.jFXvpJtSRU-20t8P9PcId0u6HiE2fc_Ipl4v8T707L8 +m76yyidh09@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibTc2eXlpZGgwOUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MTZ9.PI2vRJTYfr35AcWFEMzAG-cox6pYDZTbr43bt19X2LM +wme8fqq49h@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoid21lOGZxcTQ5aEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MTd9.iOsOn9-CbkltTSEp1uCYT-31n7kAzGKs23J3eniJJ90 +xt7h8fdfo4@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieHQ3aDhmZGZvNEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MjB9.xsaSGUMo4LTRzkKt0_bK7lAhO3vVh2eN4LU0gwL5aH0 +qbvdik1f87@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicWJ2ZGlrMWY4N0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MjV9.6ViTUcdj7v4vhLLJL9hgSfRhJggK_KcH3Ljf85oU_zk +alti58yyxr@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYWx0aTU4eXl4ckBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MjZ9.tuYf7O7nRg2tfQhBVyg7Z5BedcMinKxBU9xceKRpHaY +47e5iz65ux@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNDdlNWl6NjV1eEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1Mjd9.Wfa_TVkmDRKgAyzC1VCbQ5sZPfUS0G-yzS5goih6bWc +ru8v66xqs0@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicnU4djY2eHFzMEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MzR9.MuV7IsJk9cSv8M9w0jWwDsB_AnAaUU51SyBOO8MmaJ4 +5u9u075j24@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNXU5dTA3NWoyNEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1MzV9.Y1UbXfIeFk3iydkMhN1nZ7WpgEv-H8P00LMjaqUAeoU +iaqi5a76lv@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiaWFxaTVhNzZsdkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1Mzd9.l0eteh0zwoCKMyDnuLga8vV3-aENGhAH4pFhkdD5rHU +zbb7rtf06m@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiemJiN3J0ZjA2bUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1Mzl9.Sf1d6DLt0mpGYZBYt2giM-P5ZslimdQBsJ12GJ2yop8 +pmj0js92e2@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicG1qMGpzOTJlMkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NDF9.-__vTgChcoawWz1U3-BDTUuBmdfZs1KWYpGCnHqQAgM +cfw9jwecej@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiY2Z3OWp3ZWNlakBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NDJ9.SF19vMBZHWnaE5wmT6-MlPQphaMwxQ7q5EIIS-CsTPE +ml653m1rb2@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibWw2NTNtMXJiMkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NDN9.a2zxv9JwqfaXdKODx91ntqMRjc67FucqTo5j2pN5-04 +klikj19mxc@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoia2xpa2oxOW14Y0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NDR9.FdQNq-LKDTE6LvZ-1zhFibe3YJypMSldyoDjmr_UWXE +wc28fzk8ng@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoid2MyOGZ6azhuZ0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NDh9.bmXnNQ-CWU84DQbK0PqV2N2xICLb_CLzd3Vpwbh8hOU +hthyr9q85y@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiaHRoeXI5cTg1eUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NTV9.BHWAemSyqM0QXYBz6B7b9xGg33Fh7l-pJI6t2Nd_qtU +nhy17oent3@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibmh5MTdvZW50M0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NTd9.xwcXXkKgbmUvRgPKbsjr7oIjTBVwtFKUHJ25x_TSTT4 +bqr2gbdjvv@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYnFyMmdiZGp2dkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NTl9.1noFzx43FXVR0-3Aly6-s_mKo3bgrOKU-B1V-UkO660 +ddgksbo2ls@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZGRna3NibzJsc0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NjF9.4Xr10btvw6kxm_fDIc5gNHS2FsIngagHykSQRQMUDPU +xjdivn2agy@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieGpkaXZuMmFneUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NjJ9.C08F61iubN5GB-yaLEJeBOAxJRighujuo3972bCOMQo +gfi6njvtwo@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZ2ZpNm5qdnR3b0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NjN9.--blNQgO7F09FzMN0yzGcXeASU0Iu0k36KgQGC76AWk +sy5x822egd@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoic3k1eDgyMmVnZEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NjR9.QKyCdO3vL-DLuD2G-gK83GcGShj91K9C59QzVvRUmhU +cho1hamp8b@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiY2hvMWhhbXA4YkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1Njd9.ImPai2ysx-MupxZHKnfRkRYYJkD_1QKWiIpECE7qDMY +onirftm0o0@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoib25pcmZ0bTBvMEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1NzR9.ANwEqUbkEO-OinY1jO18z-lIMk4QBEM1cqNzLV-sLPI +8vgju5yqnx@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOHZnanU1eXFueEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1Nzh9.CwwOzZ6UsMFe5MhYf8Nenayzt0g5slmTQknt8tNd6BI +ud320uvcxm@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoidWQzMjB1dmN4bUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1Nzl9.ujo3DSIQUPWVVLa0ywa0m3SP8Te5i3MyWkbz_wBiSvg +c6c1g7xjh1@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYzZjMWc3eGpoMUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1ODJ9.LCZaAOJvUXbz5wdRUwxN0tJ7yq0fGGZhU_s5Lo8nWo0 +7yyvx78keu@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiN3l5dng3OGtldUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1ODR9.1BUd4usQ6kNp3gOWCw_5bpMXsqUUPiM3FnlKgNxRPzg +wgrqb0zstc@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoid2dycWIwenN0Y0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1ODZ9.JCkVqnT4OmhX4S58bsGr91HWCZP7wqwim1Ox62H7N60 +zbxx4t6g26@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiemJ4eDR0NmcyNkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1OTB9.lSP-cnIyDBJ3vOz4E16lVN7eG7LPlhxFop7CcVkyJ3g +5y79xdu4sf@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNXk3OXhkdTRzZkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1OTF9.nGGv7VRR49rQKckdqOj-k3sHGRR5CDA_twXD4kibaco +js2b73lbr0@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoianMyYjczbGJyMEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1OTZ9.jFuvaUslnRVU3tAY6HMcWtd1w48HnuhOFKsvXApmQfc +czs2rujod6@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiY3pzMnJ1am9kNkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1OTd9.h1WdB8SBz6oOI5yvvJL7nI2dkx91pZu3xxb2kx-M3lE +9ick8id78p@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOWljazhpZDc4cEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE1OTl9.e6LUK8Wdf11f-wXFrUCBWSS-j0KSYIhEkN2eGh3zxXQ +hj9f0pxd82@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiaGo5ZjBweGQ4MkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MDF9.gYPcUL7R53BhnLRKcHDusVn4clSPEI9jcUVfKDgVqqg +3dbefcbaqu@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiM2RiZWZjYmFxdUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MDN9._mroVXFRGqb3vjfzWV2zo-x5IIyCRjHha-ToPq8-MAg +fajeqvknjd@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZmFqZXF2a25qZEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MDR9.ss2B553TYfO3xumu3X2djC_7sKz_3d1j39PF8kKw5XU +52gkj8w50h@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNTJna2o4dzUwaEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MDh9.KL6fr2rTpr63_5V3xrFb6pD7Mx4NMCwwO75Mawu4p14 +c2ukvkcisq@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYzJ1a3ZrY2lzcUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MTB9.UKDk2vRolEsAjobFiufY7NsQjGBhIJLNsEWd3ja3DZk +tzypshl8ok@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoidHp5cHNobDhva0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MTZ9.fnjeG72hD-5c3yzD93oxxuDsgX6OGzoDs6NRWgFdQAo +l8rp3o8mlc@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibDhycDNvOG1sY0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MTd9.pQb0AWj4Gr36ycMTpEnDGDUUgnfpUYSmKbF2cThbCOQ +ozavfle6h7@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoib3phdmZsZTZoN0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MTl9.XcuDwiZ3pdbsP9TjfEwM-VoyNNd9w4jkqK8vGguJP2g +dy4c6mxd0e@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZHk0YzZteGQwZUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MjF9.OCrPuCns-VCU9V457K3l9KT_OduJKtxbYDO2B2oEad4 +hhvvpzb0c6@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiaGh2dnB6YjBjNkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MjZ9.SP4UvwanBk5hJtcyq881jFnR7sb1gjNhE9o48ejClf0 +fepe325s0n@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZmVwZTMyNXMwbkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2Mjh9.FtBzDHeTwnMskJbygBMPRC3iWnSU8rth6EtqKV1z3P8 +ne35v91s3u@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibmUzNXY5MXMzdUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MzF9.9nWW2f2W2TSbWHX4VCoQ6u-IXVTlM0MgoVd3n5xDO_w +z4cn8gl3sw@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiejRjbjhnbDNzd0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MzJ9.1a0xhratK0eQA0C7WVhOQTueODVnHbsEefpnx8klApI +cph0o1vom2@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiY3BoMG8xdm9tMkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MzV9.ZwFJLCQQZG307Ua4W9L5nzt1LmIbJPDzlBr2fcpz4pY +3g4odg6a21@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiM2c0b2RnNmEyMUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2MzZ9.E5RoS3NrauR-anrDrybKRhSlQaIw8xPPW0nXbWRBRNU +rk6wcbuym4@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicms2d2NidXltNEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2Mzd9.G8ss9egBKbVZtshH2JupOIYN8T_b6BSV2M7dcyVotSU +u566vx8zki@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoidTU2NnZ4OHpraUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2Mzl9.kOhK6Uns7Nfshh2ECpi0RMv3PtqjT63Fdc_znhTyWSU +cnva1cvjgc@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiY252YTFjdmpnY0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2NDB9.fbf-LsQFo5c-aXFJPE0hL0cJrcWBnGGwuz30err62yQ +g7n5kzxqym@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZzduNWt6eHF5bUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2NDd9._5xDOU265pg-ooaTPb8tvmCdQhtJ9r0wvaVth-njNCg +l7cz5dnj15@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibDdjejVkbmoxNUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2NTB9.aHv0Z-g7UKoCIO-IeYIwS3Hpm37o3mcfjE0btD2g2gk +5256jzk04t@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNTI1Nmp6azA0dEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2NTF9.voVSj_n50Hbvk3ppS7W2YvnN6AYysVIrm_FhLF3qZt8 +2f3pk5hnqx@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiMmYzcGs1aG5xeEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2NTJ9.uUxXNUz09xV-VxcuLu-3SdhezqdoBlhZeeNdu7zMBdk +tdels042e3@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoidGRlbHMwNDJlM0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2NTN9.1bqy0monTTmqCd8uaOh-NFaNfSbvtKJUzdaRlwUDXCg +utxrhrgcma@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoidXR4cmhyZ2NtYUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2NTR9.kjEmV-9LgH1X6hA4JNfdCYXsNcOZ14FSZ1VFCKy-BNc +7rkepl07xx@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiN3JrZXBsMDd4eEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2Njl9.sLYmmUJM0sk3dX0lYpXLMV3MhXOGqrYgbAFqcjeNYa0 +e88whl7e8o@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZTg4d2hsN2U4b0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2NzB9.9CZIOD_ghxOszWm0ZQt5z2WCFB8p0jQtLWdc-wYtXpQ +jj9swnz4vn@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiamo5c3duejR2bkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2NzF9.TPpL6QT7igytsiyiPCGjdGtF2aBGyhmTjb0UWH6H6wY +j325nd577p@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiajMyNW5kNTc3cEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2ODF9.6iJT-1YVTggP3eCY-xzjFiG56jxhJub9VrbZbDdMeBw +qi0efvgzse@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicWkwZWZ2Z3pzZUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2ODN9.Fg5BrTZ7LGSbHk6NYeToKnwOpt9g5cAPRsaA77p5Vi0 +63bjqws32a@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNjNianF3czMyYUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2OTR9.mfbOTP8jVSY9p6ZwGxHHrd9Ll02zFD0R3HTCvgafa6M +yljw2cof4k@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieWxqdzJjb2Y0a0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE2OTd9.3Ar0188RrkgKohSLZja0Yl1DZ8zX11tN6T9Zrji38Tk +8jxx5ti6zo@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOGp4eDV0aTZ6b0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3MDV9.4jwQg454iDyLRpZBrbfRl66u_36oogeyOMyiExUzsz4 +muq9sbojoa@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibXVxOXNib2pvYUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3MDZ9.lPFELSURA3q9GftM7evhg9vfICPvEOBi8nXee3x7RcY +og74oonsm4@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoib2c3NG9vbnNtNEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3MTR9.3pA0AAFQj7mPAhfcBtWDlKMDAJqeU-mXC7QKDrtNiyw +dl5od7l2je@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZGw1b2Q3bDJqZUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3MTV9.rFFHC-Q7F2IhiIu-nkNUOLharZ41utdZMaWWAfO0HO8 +xlcgnspuii@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieGxjZ25zcHVpaUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3MjF9.RK-M8AptRqfgIaVP5jR2Y4fNGMHTR6CSZT78QEVPinA +cicbhhacyb@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiY2ljYmhoYWN5YkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3MjJ9.kLxcjMr--ntKEc8z0mchuZSvxD9q3XEHm6A0cRqpkgc +hr1s9ndx6c@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiaHIxczluZHg2Y0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3MjR9.8IUBu4hEs1lBsaHb3Zoobd1-JHlJx-2j2G5zjVh1SX4 +a94w6e1tft@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYTk0dzZlMXRmdEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3Mjd9.i8USUMLhjQyk-TceAzWMNvg_zkUagYP5-YGwk25LW-E +sj5ix8t2qp@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoic2o1aXg4dDJxcEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3Mjh9.f-2FYBebyMqb-PN6rD0HFUS50L7HEJG-1p7U8k0n4bA +k13oh7mype@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiazEzb2g3bXlwZUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3MzR9.Oj8fInzo-wCqYa1XmcfIva7TJ3O6V51rkfoUCqZISMQ +53uvnq9ot4@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNTN1dm5xOW90NEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3MzV9.NPHLSJSqAnwStQwe0OcrG7QjdRCqv3t4diWmV7Eddlo +9siz1a6w9q@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOXNpejFhNnc5cUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3Mzh9.wBj7xp1D2tweaRYDsjVtASZNgQHLuS5pZ-Gjp5f1fns +60c3bel0of@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNjBjM2JlbDBvZkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NDB9.OV6bybXn1ICtfbirH7SGENX9GyLgW4ILgQ55uo_Hjkk +fk9342dhhb@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZms5MzQyZGhoYkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NDJ9.2FqLI-siCwhJOAJduSK7dO3XFs415cHKIvbjd0lwjNY +6y1m6p9ejg@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNnkxbTZwOWVqZ0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NDN9.o2zocllMYSCIEgBRhAgdI87pDXnd-vK0zmBQkxN6VEs +9reee0ai8h@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOXJlZWUwYWk4aEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NDV9.BujVoAFrd2eyU7vlZn9DV12H3_HzgsD0z1aMdb6rJnU +k51heiyx4b@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiazUxaGVpeXg0YkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NDd9.pm37qyf64BxTiohe88Xbb1s6G6wmfcNbILaTqmxhqys +p2mduw32zz@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicDJtZHV3MzJ6ekBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NDl9.gk6xmU5l8gSHRu18w5rne5ogkzS92ByWj_mVWVEFTk4 +0j2ld2ajp9@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiMGoybGQyYWpwOUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NTF9.sLMj-HSipxT4p41UPobSKJpljdx7Z8hW0TYZKu-YVRA +wsljbjjqqa@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoid3NsamJqanFxYUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NTR9.3Qh6duEvTZDNoUig0zgs8VWRYoK5XOt3ZzC-YTB_eLE +q08qn1kpmz@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicTA4cW4xa3BtekBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NTN9.8uwytLJn79WJCFTjBFFHlyfhRL454e07tdWztAR0OcI +xe5dz2gsly@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieGU1ZHoyZ3NseUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NTh9.NZ2vKlgMMJ29Gd0x4RtmgPXW6TUM9Z54l24OMOpXdRg +975h5exlck@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOTc1aDVleGxja0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NjB9.aIqj5Yo2IwVJrMLj8maCrGiVAOy3L1cFt0p1y7XAn84 +xep62luxj1@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieGVwNjJsdXhqMUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NjF9.zbEq1DgXOvdYs_qSaaCi0MeQpkFpEOT1J1H7LNkO6zM +bywnuxdlst@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYnl3bnV4ZGxzdEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NjV9.lF3hmx9VRfC1RcWXoWunTAa6zlxbRInl4nOA8hOr-Dc +o5ghn97cez@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibzVnaG45N2NlekBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NzB9.ARC2PGUvtnQitMmc1rsHjveFbjn-TbYPPNdL5Y4ulTE +f2fiohvtqg@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZjJmaW9odnRxZ0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NzJ9.EAPPKZR6Dhx5AraFjiZfObInJYPW8A0wz0l8IUAxj_M +ypg51d45r0@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoieXBnNTFkNDVyMEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3NzZ9.iFPGh6mF5IqwxVl2GrZLRUh74WUNAvjqWT9Q0VtoMJw +omogi0azbx@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoib21vZ2kwYXpieEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3ODB9.MfqeEvmVruzJ3YRb0R5kaSbqNdlrl5m90wHD3955lT8 +kduly97uxq@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoia2R1bHk5N3V4cUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3ODN9.zoeVHjw7jBsUe8ht13EQFzgriPCx_rSaHlySnr7J77I +a72504smkj@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYTcyNTA0c21rakBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3ODh9.4vKuZgyOEuHYvvxcNIADzeE1olN0xDs2KH9Agt2deR8 +s4n7ekbaku@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiczRuN2VrYmFrdUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3OTF9.e7-_aJ1sLzJDY1e1GJu26Gzm0MEWuFpkZobPBfhEYT8 +6331ne6rbc@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNjMzMW5lNnJiY0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE3OTV9.6wE-D-k3Rl3nl0aUAT0HkULk4qro2YIEIOT_CgO9bdE +6042etmmm8@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNjA0MmV0bW1tOEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4MDZ9.vUHU2C1sW4nMjPzT8_YXgcxMIago8XHyqksmEwz0Vp0 +lihplift4a@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibGlocGxpZnQ0YUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4MDl9.wjsFWDVhX-JdJ58hDN5fFKx3qa4fMXlQ3JEPHej8nyc +1b54x8ixhg@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiMWI1NHg4aXhoZ0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4MTJ9.Sn9pGJCB8VoVzrKvau7Di0e90H83wSHWCCtBgYbkN5w +9v4ceax6zm@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOXY0Y2VheDZ6bUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4MTd9.TQfBLJdKtfggbCBY7riQdlFNN6BXWO1vgBLU5CqxU5U +6dbesrztrw@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNmRiZXNyenRyd0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4MjZ9.xeJXERiHolLE98az3bAePat9o_perbmRC1NsTXRVIBc +6kqcobepww@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNmtxY29iZXB3d0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4Mjd9.NvF44zEZOoRQ5hRFWnGe5X_8oV_hN0wSpc_5AvDumXI +eejz72mw2o@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZWVqejcybXcyb0BiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4Mjh9.glh0j4VBeNRDhJ80muJGCDQqykNt4AuxaKAb4svLVug +o95qnz8bdb@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoibzk1cW56OGJkYkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4Mzd9.tnNELpAYQcHWNCEi2eBrmZtLrlQJUEDOkYHzYV2qTZk +q2nqpgidjv@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoicTJucXBnaWRqdkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4Mzh9.0KpPMr6AVt-Bjj55soRQXPcZDevrjK1xH_t_NKwK7ps +8lnrhvxe3a@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOGxucmh2eGUzYUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4NDF9.22h6bq1nykzLAUCwOBvCbCgGXa7rJCQRWXY7L7OPfxI +t1b5dkoy8p@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoidDFiNWRrb3k4cEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4NDh9.EjSIUv6SSaU8tKQcrG9dsdKVKZmt7uexQno-vkqMDHs +3x9cnfep9r@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiM3g5Y25mZXA5ckBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4NDl9.83-V_raU06YnJejPdXcyahWs5OgbmTNISUwseXbIh0Q +bu06oq50vn@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiYnUwNm9xNTB2bkBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4NTB9.K31cOn0pjgf0ZmMadCIutepUuAKWii1TaNuv5T7-as0 +kcp3zw9281@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoia2NwM3p3OTI4MUBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4NTd9.Qxm9UNyfzPcmnzoZ2_Au3gT9tJYWr9Wgj2OW1QVM74c +fjfnkokfmh@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZmpmbmtva2ZtaEBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4NTl9.MPkv4U5YlWw8i9GQeQrbbhmCiirSyH5d3F487jbe0Lg +8x4pwvn3zr@baoxia.top eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOHg0cHd2bjN6ckBiYW94aWEudG9wIiwiYWRkcmVzc19pZCI6MjE4NjF9.qNQa8XEPIlasTQukpngV5Zdmw6bacIw-NEHw-cC0OXo +8l8swz3y43@zhangyunuo.net eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOGw4c3d6M3k0M0B6aGFuZ3l1bnVvLm5ldCIsImFkZHJlc3NfaWQiOjV9.o4HAKQWO3u22iFzBmSQSnl0r-CAgFjd8kU2yDM4CoWI +j4948gddgu@zhangyunuo.net eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiajQ5NDhnZGRndUB6aGFuZ3l1bnVvLm5ldCIsImFkZHJlc3NfaWQiOjZ9.w3jpdp12FPd9xBoYKR9QV89Y6ftVuDZ4OUQ5H6Jb1BE +wnjhqq4yjk@zhangyunuo.net eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoid25qaHFxNHlqa0B6aGFuZ3l1bnVvLm5ldCIsImFkZHJlc3NfaWQiOjd9.I5FZPwBJfqev8BhsFFOtecVrk2WbtmedtNMbiVloql4 +4fqwg1izka@zhangyunuo.net eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNGZxd2cxaXprYUB6aGFuZ3l1bnVvLm5ldCIsImFkZHJlc3NfaWQiOjh9.HtjG1fGcc5V9GhyvRNT0L7G_bBWKSx7l1iOSNZNfh3Q +zopf9zbn5n@zhangyunuo.net eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiem9wZjl6Ym41bkB6aGFuZ3l1bnVvLm5ldCIsImFkZHJlc3NfaWQiOjl9.Kv0lzn-7r6eIWNNr5lDvF4Af2YsgG4VG8pOS3BdUTu8 +9vyw4fh3s7@zhangyunuo.net eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiOXZ5dzRmaDNzN0B6aGFuZ3l1bnVvLm5ldCIsImFkZHJlc3NfaWQiOjEwfQ.rAKOyCQZjS9HluHvFCDFSTgbuH3cbJPE0P_pZNxkCQE +607jtxa2km@zhangyunuo.net eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiNjA3anR4YTJrbUB6aGFuZ3l1bnVvLm5ldCIsImFkZHJlc3NfaWQiOjExfQ.ppR8X9tIbYmEB2f7UMFQl88swyT7M6W_Nu-4V6ru2nI +fa6fm36e36@zhangyunuo.net eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhZGRyZXNzIjoiZmE2Zm0zNmUzNkB6aGFuZ3l1bnVvLm5ldCIsImFkZHJlc3NfaWQiOjEyfQ.sphd99woQ8WW68kzxYE3nqqFeesJ7rtX_mINWnChOt4 diff --git a/oidc_mint/__init__.py b/oidc_mint/__init__.py new file mode 100644 index 0000000..650159e --- /dev/null +++ b/oidc_mint/__init__.py @@ -0,0 +1,23 @@ +"""OIDC 设备码铸造包:为免费 Grok Build 账号铸造 access/refresh/id token。 + +仅保留铸造所需的三块: + - oauth_device:xAI 设备码授权 + 轮询 token + - browser_confirm:独立 Chromium 完成设备码确认 + - proxyutil:代理解析 + +输出成什么格式(CPA / 其它)由上层的 cpa_export 负责,这里不掺和。 +""" + +from .browser_confirm import mint_with_browser, shutdown_mint_browsers +from .oauth_device import CLIENT_ID, SCOPE, OAuthDeviceError +from .proxyutil import resolve_proxy, set_runtime_proxy + +__all__ = [ + "mint_with_browser", + "shutdown_mint_browsers", + "CLIENT_ID", + "SCOPE", + "OAuthDeviceError", + "resolve_proxy", + "set_runtime_proxy", +] diff --git a/oidc_mint/browser_confirm.py b/oidc_mint/browser_confirm.py new file mode 100644 index 0000000..d5ebd8e --- /dev/null +++ b/oidc_mint/browser_confirm.py @@ -0,0 +1,937 @@ +"""Approve xAI device-code in Chromium (DrissionPage). + +Paths resolve relative to the grok_reg project root (parent of oidc_mint). + +Proven flow (2026-07-10, free account): + 1. Open verification_uri_complete (user_code prefilled) + 2. Click 继续 on device page + 3. Cookie banner: 全部允许 (optional) + 4. 使用邮箱登录 → fill email → 下一步 + 5. Wait cf-turnstile-response → fill password → REAL click 登录 + 6. May land /account redirect or device page → 继续 + 7. Consent page /oauth2/device/consent → REAL click exact 允许 + (by_js click causes Invalid action / empty form action) + 8. /oauth2/device/done "设备已授权" + token poll SUCCESS + +Hard rules: + - Token poll is source of truth + - Button match is EXACT text only (允许 ≠ 全部允许) + - Consent Allow MUST be a real click, not by_js + - Prefer headed browser + register turnstilePatch +""" + +from __future__ import annotations + +import os +import re +import sys +import threading +import time +from pathlib import Path +from typing import Any, Callable +from urllib.parse import urlparse + +LogFn = Callable[[str], None] + + +def _noop_log(_: str) -> None: + return None + + +class BrowserConfirmError(RuntimeError): + pass + + +def _sleep(sec: float) -> None: + time.sleep(sec) + + +def create_standalone_page( + *, + proxy: str | None = None, + headless: bool = False, + log: LogFn | None = None, +) -> tuple[Any, Any]: + log = log or _noop_log + try: + from DrissionPage import Chromium, ChromiumOptions + except ImportError as e: + raise BrowserConfirmError( + "DrissionPage not installed; run inside grok_reg uv env or pip install DrissionPage" + ) from e + + opts = None + # Project root = parent of this package (./oidc_mint → ../) + _pkg_root = Path(__file__).resolve().parents[1] + try: + reg_file = _pkg_root / "grok_register_ttk.py" + if reg_file.is_file(): + reg_dir = str(_pkg_root) + if reg_dir not in sys.path: + sys.path.insert(0, reg_dir) + try: + from grok_register_ttk import create_browser_options # type: ignore + + opts = create_browser_options() + log("using register create_browser_options (turnstilePatch)") + except Exception as e: # noqa: BLE001 + log(f"register browser options unavailable: {e}") + opts = None + except Exception as e: # noqa: BLE001 + log(f"register options probe failed: {e}") + opts = None + + if opts is None: + opts = ChromiumOptions() + opts.auto_port() + opts.set_timeouts(base=2) + for flag in ( + "--disable-gpu", + "--no-sandbox", + "--disable-dev-shm-usage", + "--mute-audio", + "--no-first-run", + "--disable-background-networking", + "--window-size=1280,900", + ): + opts.set_argument(flag) + ext = str(_pkg_root / "turnstilePatch") + if os.path.isdir(ext): + try: + opts.add_extension(ext) + log(f"added extension {ext}") + except Exception as e: # noqa: BLE001 + log(f"extension add failed: {e}") + + if headless: + try: + opts.headless(True) + except Exception: + opts.set_argument("--headless=new") + log("headless=True (may hit Cloudflare / break real clicks)") + else: + try: + opts.headless(False) + except Exception: + pass + log(f"headed browser DISPLAY={os.environ.get('DISPLAY', '')!r}") + + for cand in ( + "/usr/bin/chromium", + "/usr/bin/chromium-browser", + "/usr/bin/google-chrome", + "/usr/bin/google-chrome-stable", + ): + if os.path.isfile(cand): + try: + opts.set_browser_path(cand) + except Exception: + pass + break + + from .proxyutil import proxy_for_chromium, proxy_log_label, resolve_proxy + + # explicit / runtime config first; env only as fallback + proxy = resolve_proxy(proxy) + chrome_proxy = proxy_for_chromium(proxy) + if chrome_proxy: + opts.set_argument(f"--proxy-server={chrome_proxy}") + log(f"browser proxy={proxy_log_label(proxy)} (chromium {chrome_proxy})") + else: + log("browser proxy=(none)") + + browser = Chromium(opts) + page = browser.latest_tab + log("standalone chromium started") + return browser, page + + +def close_standalone(browser: Any) -> None: + try: + browser.quit() + except Exception: + pass + + +# ── mint browser reuse (per-thread) ── +_mint_tls = threading.local() + + +def _mint_tls_get() -> dict[str, Any]: + d = getattr(_mint_tls, "state", None) + if d is None: + d = {"browser": None, "page": None, "served": 0, "proxy": None, "headless": None} + _mint_tls.state = d + return d + + +def clear_page_session(page: Any, browser: Any | None = None, log: LogFn | None = None) -> None: + """Blank page + wipe storage/cookies for reuse between mint jobs.""" + log = log or _noop_log + try: + if page is not None: + try: + page.get("about:blank") + except Exception: + pass + for js in ( + "try{localStorage.clear()}catch(e){}", + "try{sessionStorage.clear()}catch(e){}", + ): + try: + page.run_js(js) + except Exception: + pass + for target in (page, browser): + if target is None: + continue + try: + target.set.cookies.clear() # type: ignore[attr-defined] + log("mint session cookies cleared") + break + except Exception: + try: + # older API + cks = target.cookies() + if isinstance(cks, list): + for c in cks: + try: + target.set.cookies.remove(c) # type: ignore[attr-defined] + except Exception: + pass + except Exception: + pass + except Exception as e: + log(f"clear_page_session: {e}") + + +def normalize_cookies(cookies: Any) -> list[dict[str, Any]]: + """Normalize DrissionPage / browser cookie list to settable dicts. + + Also clones SSO-like cookies onto accounts.x.ai / auth.x.ai domains so + device-auth can skip secondary login when possible. + """ + out: list[dict[str, Any]] = [] + if not cookies: + return out + if isinstance(cookies, dict): + for k, v in cookies.items(): + if k and v is not None: + out.append({"name": str(k), "value": str(v), "domain": ".x.ai", "path": "/"}) + cookies = out + out = [] + if not isinstance(cookies, (list, tuple)): + return out + for c in cookies: + if not isinstance(c, dict): + continue + name = c.get("name") or c.get("Name") + value = c.get("value") or c.get("Value") + if not name or value is None: + continue + domain = str(c.get("domain") or c.get("Domain") or ".x.ai") + path = str(c.get("path") or c.get("Path") or "/") + item = { + "name": str(name), + "value": str(value), + "domain": domain, + "path": path, + } + for src, dst in ( + ("expiry", "expiry"), + ("expires", "expiry"), + ("secure", "secure"), + ("httpOnly", "httpOnly"), + ("sameSite", "sameSite"), + ): + if src in c and c[src] is not None: + item[dst] = c[src] + out.append(item) + + # Expand SSO cookies to xAI account hosts (register browser is often on grok.com) + sso_names = {"sso", "sso-rw", "cf_clearance", "sso_jwt", "__cf_bm"} + extras: list[dict[str, Any]] = [] + seen = {(i["name"], i["domain"], i["path"]) for i in out} + for item in list(out): + n = item["name"] + if n not in sso_names and not n.startswith("sso"): + continue + for dom in (".x.ai", "accounts.x.ai", ".accounts.x.ai", "auth.x.ai", ".auth.x.ai"): + key = (n, dom, item["path"]) + if key in seen: + continue + clone = dict(item) + clone["domain"] = dom + extras.append(clone) + seen.add(key) + out.extend(extras) + return out + + +def inject_cookies(page: Any, cookies: Any, log: LogFn | None = None) -> int: + """Inject cookies into page/browser. Returns count attempted.""" + log = log or _noop_log + items = normalize_cookies(cookies) + if not items or page is None: + return 0 + for url in ( + "https://accounts.x.ai/", + "https://auth.x.ai/", + "https://grok.com/", + ): + try: + page.get(url) + _sleep(0.4) + except Exception: + continue + + n = 0 + for target_name, target in (("page", page), ("browser", getattr(page, "browser", None))): + if target is None: + continue + try: + target.set.cookies(items) # type: ignore[attr-defined] + n = len(items) + log(f"injected cookies bulk via {target_name}={n}") + break + except Exception as e: + log(f"bulk set via {target_name} failed: {e}") + + if n == 0: + for item in items: + ok = False + for target in (page, getattr(page, "browser", None)): + if target is None: + continue + try: + target.set.cookies(item) # type: ignore[attr-defined] + ok = True + break + except Exception: + continue + if ok: + n += 1 + log(f"injected cookies one-by-one={n}/{len(items)}") + + # JS document.cookie for non-httpOnly SSO cookies (best effort) + try: + js_items = [ + c + for c in items + if (not c.get("httpOnly")) and c.get("name") in {"sso", "sso-rw", "cf_clearance"} + ] + if js_items: + page.get("https://accounts.x.ai/") + for c in js_items: + name = str(c["name"]) + val = str(c["value"]) + # avoid quote breakage + if "'" in name or "'" in val: + continue + page.run_js( + "document.cookie='" + + name + + "=" + + val + + "; path=/; domain=.x.ai; Secure; SameSite=None'" + ) + log(f"js cookie fallback applied={len(js_items)}") + except Exception as e: + log(f"js cookie fallback: {e}") + + return n + + +def acquire_mint_browser( + + *, + proxy: str | None = None, + headless: bool = False, + reuse: bool = True, + recycle_every: int = 15, + log: LogFn | None = None, +) -> tuple[Any, Any, bool]: + """Return (browser, page, owned). owned=True means caller must close if not reusing. + + When reuse=True, browser is kept in thread-local and cleared between jobs. + """ + log = log or _noop_log + st = _mint_tls_get() + if reuse and st.get("browser") is not None: + # recycle if proxy/headless changed or served enough + need_recycle = ( + st.get("proxy") != (proxy or None) + or st.get("headless") != headless + or (recycle_every > 0 and int(st.get("served") or 0) >= recycle_every) + ) + if not need_recycle: + page = st.get("page") + browser = st.get("browser") + clear_page_session(page, browser, log=log) + log(f"mint browser reused served={st.get('served')}") + return browser, page, False + log("mint browser recycle (proxy/headless/served threshold)") + try: + close_standalone(st.get("browser")) + except Exception: + pass + st["browser"] = None + st["page"] = None + st["served"] = 0 + + browser, page = create_standalone_page(proxy=proxy, headless=headless, log=log) + if reuse: + st["browser"] = browser + st["page"] = page + st["proxy"] = proxy or None + st["headless"] = headless + st["served"] = 0 + return browser, page, False + return browser, page, True + + +def release_mint_browser( + *, + owned: bool, + success: bool = True, + force_quit: bool = False, + log: LogFn | None = None, +) -> None: + log = log or _noop_log + st = _mint_tls_get() + if force_quit or owned: + browser = st.get("browser") if not owned else None + # if owned, caller passes via closing create path — handle both + if owned: + # owned browser not in tls + return + if browser is not None: + close_standalone(browser) + st["browser"] = None + st["page"] = None + st["served"] = 0 + log("mint browser quit") + return + if success: + st["served"] = int(st.get("served") or 0) + 1 + else: + # fail: drop browser to avoid dirty state + if st.get("browser") is not None: + close_standalone(st.get("browser")) + st["browser"] = None + st["page"] = None + st["served"] = 0 + log("mint browser dropped after failure") + + +def shutdown_mint_browsers() -> None: + st = getattr(_mint_tls, "state", None) + if not st: + return + if st.get("browser") is not None: + close_standalone(st.get("browser")) + st["browser"] = None + st["page"] = None + st["served"] = 0 + + +def _page_url(page: Any) -> str: + try: + return page.url or "" + except Exception: + return "" + + +def _visible_text(page: Any) -> str: + try: + t = page.run_js( + "return (document.body && (document.body.innerText || document.body.textContent)) || '';" + ) + if isinstance(t, str) and t.strip(): + return t + except Exception: + pass + try: + raw = getattr(page, "raw_text", None) + if callable(raw): + t = raw() + if isinstance(t, str) and t.strip(): + return t + if isinstance(raw, str) and raw.strip(): + return raw + except Exception: + pass + return "" + + +def _norm(s: str) -> str: + return re.sub(r"\s+", " ", (s or "").strip()) + + +def _find_button_exact(page: Any, label: str) -> Any | None: + try: + for el in page.eles("tag:button") or []: + try: + if _norm(el.text or "") == label: + return el + except Exception: + continue + except Exception: + pass + try: + return page.ele(f"xpath://button[normalize-space(.)='{label}']", timeout=0.3) + except Exception: + return None + + +def _click_exact( + page: Any, + labels: list[str], + log: LogFn, + *, + real: bool = False, +) -> str | None: + """Click button by EXACT visible text. real=True uses physical click (needed for consent).""" + for label in labels: + el = _find_button_exact(page, label) + if not el: + continue + try: + if real: + try: + el.scroll.to_see() + except Exception: + pass + el.click() + log(f"clicked REAL exact {label!r}") + else: + el.click(by_js=True) + log(f"clicked JS exact {label!r}") + return label + except Exception as e: + log(f"click {label!r} failed: {e}") + if real: + try: + el.click(by_js=True) + log(f"clicked JS fallback exact {label!r}") + return label + except Exception as e2: + log(f"js fallback {label!r} failed: {e2}") + return None + + +def _wait_turnstile(page: Any, log: LogFn, timeout: float = 45.0) -> bool: + """Wait/click Cloudflare Turnstile on the mint browser page.""" + deadline = time.time() + timeout + clicked = False + while time.time() < deadline: + try: + el = page.ele("css:input[name='cf-turnstile-response']", timeout=0.3) + if el is not None: + v = (el.attr("value") or "").strip() + if len(v) > 20: + log(f"turnstile ready len={len(v)}") + return True + except Exception: + pass + + # Mimic register-machine: shadow-root checkbox click + try: + challenge_input = page.ele("@name=cf-turnstile-response", timeout=0.2) + if challenge_input is not None: + wrapper = challenge_input.parent() + iframe = None + try: + iframe = wrapper.shadow_root.ele("tag:iframe") + except Exception: + iframe = None + if iframe is not None: + try: + iframe.run_js( + """ +window.dtp = 1; +function getRandomInt(min, max) { return Math.floor(Math.random() * (max - min + 1)) + min; } +let sx = getRandomInt(800, 1200); +let sy = getRandomInt(400, 700); +Object.defineProperty(MouseEvent.prototype, 'screenX', { value: sx }); +Object.defineProperty(MouseEvent.prototype, 'screenY', { value: sy }); + """ + ) + except Exception: + pass + try: + body_sr = iframe.ele("tag:body").shadow_root + btn = body_sr.ele("tag:input") + if btn is not None: + btn.click() + if not clicked: + log("clicked turnstile shadow checkbox") + clicked = True + except Exception: + pass + except Exception: + pass + + if not clicked: + try: + page.run_js( + """ +const nodes = Array.from(document.querySelectorAll('div,span,iframe')).filter((n) => { + const txt = (n.className || '') + ' ' + (n.id || '') + ' ' + (n.getAttribute?.('src') || ''); + return String(txt).toLowerCase().includes('turnstile'); +}); +if (nodes.length && typeof nodes[0].click === 'function') nodes[0].click(); + """ + ) + clicked = True + log("clicked turnstile container via JS") + except Exception: + pass + _sleep(0.9) + log("turnstile not ready") + return False + + +def _fill(page, selector, value, log, label=""): + """找到 selector 输入框,清空并填入 value;成功返回 True。""" + try: + el = page.ele(selector, timeout=3) + except Exception: + el = None + if not el: + return False + try: + try: + el.clear() + except Exception: + pass + el.input(value) + if label: + log(f"filled {label}") + return True + except Exception as exc: + log(f"fill {label} failed: {exc}") + return False + + +def approve_device_code( + page: Any, + *, + verification_uri_complete: str, + email: str, + password: str, + user_code: str = "", + timeout_sec: float = 240.0, + stop_event: threading.Event | None = None, + log: LogFn | None = None, +) -> None: + log = log or _noop_log + if page is None: + raise BrowserConfirmError("page is None") + email = (email or "").strip() + password = password or "" + if not email or not password: + raise BrowserConfirmError("email/password required") + + if not user_code and "user_code=" in (verification_uri_complete or ""): + try: + user_code = verification_uri_complete.split("user_code=", 1)[1].split("&", 1)[0] + except Exception: + user_code = "" + + log(f"open device url: {verification_uri_complete}") + try: + page.get(verification_uri_complete, timeout=60) + except TypeError: + page.get(verification_uri_complete) + _sleep(2.0) + + deadline = time.time() + timeout_sec + phase = "device" + login_attempts = 0 + last_url = "" + + while time.time() < deadline: + if stop_event is not None and stop_event.is_set(): + log("stop_event set — leave browser loop") + return + + url = _page_url(page) + text = _visible_text(page) + if url != last_url: + log(f"url: {url[:180]}") + last_url = url + snip = _norm(text)[:160] + if snip: + log(f"visible: {snip}") + + # Done page + if "device/done" in url or "设备已授权" in text or "device authorized" in text.lower(): + log("device done page — waiting for token poll") + _sleep(1.5) + continue + + if "Invalid action" in text: + log("Invalid action — reopen device uri") + page.get(verification_uri_complete) + _sleep(2.0) + phase = "device" + continue + + # Consent page — REAL click exact 允许 + if "/consent" in url or "授权 Grok Build" in text or "Authorize Grok Build" in text: + phase = "consent" + # Prefer real click; React needs it to set form action=allow + if _click_exact(page, ["允许", "Allow", "Authorize", "Approve"], log, real=True): + _sleep(2.5) + continue + # last resort: set action and submit + try: + page.run_js( + """ + const f=document.querySelector('form'); + if(!f) return; + let a=f.querySelector('input[name=action]'); + if(!a){a=document.createElement('input');a.type='hidden';a.name='action';f.appendChild(a);} + a.value='allow'; + const btn=[...f.querySelectorAll('button')].find(b=>((b.innerText||'').trim())==='允许'||(b.innerText||'').trim()==='Allow'); + if(btn) btn.click(); else f.submit(); + """ + ) + log("consent form submit via JS fallback") + _sleep(2.5) + except Exception as e: + log(f"consent fallback failed: {e}") + continue + + # Device code entry + if page.ele("css:input[name='user_code']", timeout=0.3) and "consent" not in url: + phase = "device" + if user_code: + try: + uc = page.ele("css:input[name='user_code']") + cur = (uc.value or "") if uc else "" + if user_code.replace("-", "") not in cur.replace("-", ""): + uc.clear() + uc.input(user_code) + log("filled user_code") + except Exception: + pass + if _click_exact(page, ["继续", "Continue"], log, real=False): + _sleep(2.0) + continue + try: + el = page.ele("css:button[type='submit']", timeout=0.5) + if el: + el.click(by_js=True) + log("clicked device submit") + _sleep(2.0) + continue + except Exception: + pass + + # Account redirect + if "正在重定向" in text or ("/account" in url and "sign-in" not in url): + if _click_exact(page, ["继续", "Continue"], log, real=False): + _sleep(2.0) + continue + + # Cookie banner (exact labels only) + if "全部允许" in text or "隐私偏好" in text: + _click_exact(page, ["全部允许", "全部拒绝"], log, real=False) + _sleep(0.5) + + # Sign-in chooser + if "使用邮箱登录" in text or "Continue with email" in text: + if _click_exact(page, ["使用邮箱登录", "Continue with email", "Sign in with email"], log, real=False): + _sleep(1.5) + phase = "email" + continue + + # Email only step + if page.ele("css:input[type='email']", timeout=0.3) and not page.ele( + "css:input[type='password']", timeout=0.2 + ): + phase = "email" + _fill(page, "css:input[type='email']", email, log, "email") + if _click_exact(page, ["下一步", "Next", "Continue", "继续"], log, real=False): + _sleep(1.8) + continue + + # Password login + if page.ele("css:input[type='password']", timeout=0.3): + phase = "password" + if login_attempts >= 5: + _sleep(1.0) + continue + login_attempts += 1 + log(f"login attempt {login_attempts}") + _fill(page, "css:input[type='email']", email, log, "email") + _wait_turnstile(page, log, 25) + _fill(page, "css:input[type='password']", password, log, "password") + _wait_turnstile(page, log, 12) + # REAL click login helps form submit + if not _click_exact(page, ["登录", "Sign in", "Log in"], log, real=True): + try: + el = page.ele("css:button[type='submit']", timeout=0.5) or page.ele( + "css:button[data-testid='sign-in-submit']", timeout=0.5 + ) + if el: + el.click() + log("clicked login submit real") + except Exception as e: + log(f"login submit fail: {e}") + # wait navigation + for _ in range(24): + if stop_event is not None and stop_event.is_set(): + return + _sleep(0.5) + if not page.ele("css:input[type='password']", timeout=0.2): + break + if "sign-in" not in _page_url(page): + break + continue + + _sleep(1.0) + + if stop_event is not None and stop_event.is_set(): + log("browser finished via stop_event") + return + log(f"browser loop ended phase={phase} login_attempts={login_attempts}") + + +def mint_with_browser( + *, + email: str, + password: str, + page: Any | None = None, + proxy: str | None = None, + headless: bool = False, + browser_timeout_sec: float = 240.0, + poll_log: LogFn | None = None, + cancel: Callable[[], bool] | None = None, + force_standalone: bool = True, + cookies: Any | None = None, + reuse_browser: bool = True, + recycle_every: int = 15, +) -> dict[str, Any]: + """Request device code, approve in browser, poll tokens. + + force_standalone=True (default): do not reuse the *register* tab. + Mint workers may still reuse their *own* Chromium via reuse_browser. + cookies: optional register-browser cookie list to skip re-login. + """ + from .oauth_device import OAuthDeviceError, poll_device_token, request_device_code + from .proxyutil import proxy_log_label, resolve_proxy, set_runtime_proxy + + log = poll_log or _noop_log + own_browser = None + owned = False + work_page = None if force_standalone else page + resolved = resolve_proxy(proxy) + set_runtime_proxy(resolved or None) + success = False + try: + last_err: BaseException | None = None + sess = None + for attempt in range(1, 4): + try: + sess = request_device_code(proxy=resolved or None) + last_err = None + break + except BaseException as e: # noqa: BLE001 + last_err = e + log(f"request_device_code attempt {attempt}/3 failed: {e}") + _sleep(1.5 * attempt) + if sess is None: + raise last_err or RuntimeError("request_device_code failed") + log( + f"device user_code={sess.user_code} expires_in={sess.expires_in} " + f"proxy={proxy_log_label(resolved) or '(none)'}" + ) + + if work_page is None: + own_browser, work_page, owned = acquire_mint_browser( + proxy=resolved or None, + headless=headless, + reuse=reuse_browser, + recycle_every=recycle_every, + log=log, + ) + if owned: + # non-reuse path: track for finally close + pass + + # Cookie inject before opening device URL (skip secondary login when possible) + if cookies: + n = inject_cookies(work_page, cookies, log=log) + log(f"cookie inject count={n}") + try: + work_page.get("https://accounts.x.ai/") + _sleep(1.0) + url = _page_url(work_page) + text = _visible_text(work_page) + snip = _norm(text)[:120] + log(f"post-inject session url={url[:120]} visible={snip}") + except Exception as e: + log(f"post-inject check: {e}") + + stop_event = threading.Event() + token_box: dict[str, Any] = {} + err_box: dict[str, BaseException] = {} + + def _poll() -> None: + try: + time.sleep(2) + tr = poll_device_token( + sess.device_code, + interval=max(sess.interval, 5), + expires_in=min(sess.expires_in, int(browser_timeout_sec) + 60), + log=log, + cancel=cancel, + proxy=resolved or None, + ) + token_box["token"] = tr + stop_event.set() + log("token poll SUCCESS — stop_event set") + except BaseException as e: # noqa: BLE001 + err_box["err"] = e + stop_event.set() + + t = threading.Thread(target=_poll, name="oauth-poll", daemon=True) + t.start() + try: + approve_device_code( + work_page, + verification_uri_complete=sess.verification_uri_complete, + email=email, + password=password, + user_code=sess.user_code, + timeout_sec=browser_timeout_sec, + stop_event=stop_event, + log=log, + ) + except BrowserConfirmError as e: + log(f"browser confirm warning: {e}") + + t.join(timeout=max(browser_timeout_sec, 60) + 30) + if "token" in token_box: + tr = token_box["token"] + success = True + return { + "access_token": tr.access_token, + "refresh_token": tr.refresh_token, + "id_token": tr.id_token, + "token_type": tr.token_type, + "expires_in": tr.expires_in, + "user_code": sess.user_code, + } + if "err" in err_box: + raise err_box["err"] + raise OAuthDeviceError("token poll thread ended without result") + finally: + if own_browser is not None: + if owned: + close_standalone(own_browser) + else: + release_mint_browser(owned=False, success=success, log=log) diff --git a/oidc_mint/oauth_device.py b/oidc_mint/oauth_device.py new file mode 100644 index 0000000..4cc695d --- /dev/null +++ b/oidc_mint/oauth_device.py @@ -0,0 +1,201 @@ +"""xAI OAuth device-code grant (Grok CLI). + +Endpoints from https://auth.x.ai/.well-known/openid-configuration +""" + +from __future__ import annotations + +import json +import time +import urllib.error +import urllib.parse +import urllib.request +from dataclasses import dataclass +from typing import Any, Callable + +from .proxyutil import resolve_proxy + +# xAI OAuth client id (matches CLIProxyAPI default) +CLIENT_ID = "b1a00492-073a-47ea-816f-4c329264a828" +ISSUER = "https://auth.x.ai" +DEVICE_CODE_URL = "https://auth.x.ai/oauth2/device/code" +TOKEN_URL = "https://auth.x.ai/oauth2/token" +SCOPE = "openid profile email offline_access grok-cli:access api:access" + +LogFn = Callable[[str], None] + + +def _noop_log(_: str) -> None: + return None + + +def _proxy_handler(proxy: str | None = None) -> urllib.request.ProxyHandler | None: + p = resolve_proxy(proxy) + if not p: + return None + return urllib.request.ProxyHandler({"http": p, "https": p}) + + +def _opener(proxy: str | None = None) -> urllib.request.OpenerDirector: + handlers: list[Any] = [] + ph = _proxy_handler(proxy) + if ph is not None: + handlers.append(ph) + return urllib.request.build_opener(*handlers) if handlers else urllib.request.build_opener() + + +def _post_form( + url: str, + form: dict[str, str], + timeout: float = 30.0, + *, + proxy: str | None = None, +) -> tuple[int, dict[str, Any] | str]: + data = urllib.parse.urlencode(form).encode("utf-8") + req = urllib.request.Request( + url, + data=data, + method="POST", + headers={ + "Content-Type": "application/x-www-form-urlencoded", + "Accept": "application/json", + "User-Agent": "grok-reg-oidc-minter/1.0", + }, + ) + opener = _opener(proxy) + try: + with opener.open(req, timeout=timeout) as resp: + body = resp.read().decode("utf-8", errors="replace") + status = getattr(resp, "status", 200) or 200 + try: + return int(status), json.loads(body) + except json.JSONDecodeError: + return int(status), body + except urllib.error.HTTPError as e: + body = e.read().decode("utf-8", errors="replace") + try: + return int(e.code), json.loads(body) + except json.JSONDecodeError: + return int(e.code), body + + +@dataclass +class DeviceCodeSession: + device_code: str + user_code: str + verification_uri: str + verification_uri_complete: str + expires_in: int + interval: int + raw: dict[str, Any] + + +@dataclass +class TokenResult: + access_token: str + refresh_token: str + id_token: str | None + token_type: str + expires_in: int + raw: dict[str, Any] + + +class OAuthDeviceError(RuntimeError): + pass + + +def request_device_code( + *, + client_id: str = CLIENT_ID, + scope: str = SCOPE, + timeout: float = 30.0, + proxy: str | None = None, +) -> DeviceCodeSession: + status, body = _post_form( + DEVICE_CODE_URL, + {"client_id": client_id, "scope": scope}, + timeout=timeout, + proxy=proxy, + ) + if status != 200 or not isinstance(body, dict): + raise OAuthDeviceError(f"device code request failed HTTP {status}: {body!r}") + device_code = str(body.get("device_code") or "").strip() + user_code = str(body.get("user_code") or "").strip() + if not device_code or not user_code: + raise OAuthDeviceError(f"device code response missing fields: {body}") + vuri = str(body.get("verification_uri") or "https://accounts.x.ai/oauth2/device").strip() + vcomplete = str( + body.get("verification_uri_complete") or f"{vuri}?user_code={user_code}" + ).strip() + expires_in = int(body.get("expires_in") or 1800) + interval = max(int(body.get("interval") or 5), 1) + return DeviceCodeSession( + device_code=device_code, + user_code=user_code, + verification_uri=vuri, + verification_uri_complete=vcomplete, + expires_in=expires_in, + interval=interval, + raw=body, + ) + + +def poll_device_token( + device_code: str, + *, + client_id: str = CLIENT_ID, + interval: int = 5, + expires_in: int = 1800, + timeout: float = 30.0, + log: LogFn | None = None, + cancel: Callable[[], bool] | None = None, + proxy: str | None = None, +) -> TokenResult: + """Poll token endpoint until authorized or expired.""" + log = log or _noop_log + deadline = time.time() + max(expires_in - 5, 30) + sleep_for = max(interval, 1) + while time.time() < deadline: + if cancel and cancel(): + raise OAuthDeviceError("cancelled") + status, body = _post_form( + TOKEN_URL, + { + "grant_type": "urn:ietf:params:oauth:grant-type:device_code", + "device_code": device_code, + "client_id": client_id, + }, + timeout=timeout, + proxy=proxy, + ) + if status == 200 and isinstance(body, dict) and body.get("access_token"): + access = str(body["access_token"]).strip() + refresh = str(body.get("refresh_token") or "").strip() + if not refresh: + raise OAuthDeviceError("token response missing refresh_token") + return TokenResult( + access_token=access, + refresh_token=refresh, + id_token=(str(body["id_token"]).strip() if body.get("id_token") else None), + token_type=str(body.get("token_type") or "Bearer"), + expires_in=int(body.get("expires_in") or 21600), + raw=body, + ) + err = "" + desc = "" + if isinstance(body, dict): + err = str(body.get("error") or "") + desc = str(body.get("error_description") or "") + if err in ("authorization_pending", "slow_down"): + if err == "slow_down": + sleep_for = min(sleep_for + 5, 30) + log(f"oauth poll: {err} (sleep {sleep_for}s)") + time.sleep(sleep_for) + continue + if err in ("expired_token", "access_denied"): + raise OAuthDeviceError(f"device auth failed: {err}: {desc}") + if status == 400 and err: + raise OAuthDeviceError(f"device auth token error: {err}: {desc or body}") + log(f"oauth poll unexpected HTTP {status}: {body!r}") + time.sleep(sleep_for) + raise OAuthDeviceError("device auth timed out waiting for user approval") diff --git a/oidc_mint/proxyutil.py b/oidc_mint/proxyutil.py new file mode 100644 index 0000000..7bceebf --- /dev/null +++ b/oidc_mint/proxyutil.py @@ -0,0 +1,71 @@ +"""Resolve outbound proxy for OIDC mint HTTP + browser. + +Priority (highest first): + 1. explicit argument + 2. thread-local runtime pin (set_runtime_proxy) + 3. environment https_proxy / HTTPS_PROXY / http_proxy / HTTP_PROXY + +Thread-local pin avoids cross-talk when multiple mint workers run with +different proxies in the same process. +""" + +from __future__ import annotations + +import os +import threading +from urllib.parse import urlparse + +_thread = threading.local() + + +def set_runtime_proxy(proxy: str | None) -> None: + """Pin proxy for the *current thread*. Empty clears pin.""" + p = (proxy or "").strip() + _thread.proxy = p or None + + +def get_runtime_proxy() -> str | None: + return getattr(_thread, "proxy", None) + + +def resolve_proxy(explicit: str | None = None) -> str: + for cand in ( + (explicit or "").strip(), + (get_runtime_proxy() or "").strip(), + (os.environ.get("https_proxy") or "").strip(), + (os.environ.get("HTTPS_PROXY") or "").strip(), + (os.environ.get("http_proxy") or "").strip(), + (os.environ.get("HTTP_PROXY") or "").strip(), + ): + if cand: + return cand + return "" + + +def proxy_for_chromium(proxy: str) -> str: + """Chromium --proxy-server cannot embed user:pass; host:port only.""" + p = (proxy or "").strip() + if not p: + return "" + u = urlparse(p if "://" in p else f"http://{p}") + host = u.hostname or "" + if not host: + return "" + port = u.port or (443 if (u.scheme or "http") == "https" else 80) + scheme = u.scheme or "http" + return f"{scheme}://{host}:{port}" + + +def proxy_log_label(proxy: str) -> str: + """Redact userinfo for logs.""" + p = (proxy or "").strip() + if not p: + return "" + try: + u = urlparse(p if "://" in p else f"http://{p}") + host = u.hostname or "?" + port = u.port or "" + auth = "user:***@" if u.username else "" + return f"{u.scheme or 'http'}://{auth}{host}{(':' + str(port)) if port else ''}" + except Exception: + return "(proxy)" diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..dbe837c --- /dev/null +++ b/requirements.txt @@ -0,0 +1,18 @@ +certifi==2026.4.22 +cffi==2.0.0 +charset-normalizer==3.4.7 +cssselect==1.3.0 +curl_cffi==0.13.0 +DataRecorder==3.6.2 +DownloadKit==2.0.7 +DrissionPage==4.1.1.3 +filelock==3.19.1 +idna==3.13 +lxml==6.1.0 +psutil==7.2.2 +pycparser==2.23 +requests==2.32.5 +requests-file==3.0.1 +tldextract==5.3.0 +urllib3==2.6.3 +websocket-client==1.9.0 diff --git a/turnstilePatch/content.js b/turnstilePatch/content.js new file mode 100644 index 0000000..6af4eee --- /dev/null +++ b/turnstilePatch/content.js @@ -0,0 +1,114 @@ +// Turnstile Patch - 隐藏自动化标识,加速 Turnstile 验证 +// 在 document_start 阶段执行,确保在页面脚本之前生效 + +(function () { + "use strict"; + + // 1. 隐藏 navigator.webdriver 标识 + // Chrome 自动化模式下 navigator.webdriver = true,Turnstile 会检测此属性 + try { + Object.defineProperty(navigator, "webdriver", { + get: function () { + return false; + }, + configurable: true, + }); + } catch (e) {} + + // 2. 移除 Chrome 自动化相关的 Runtime 属性 + try { + if (window.chrome && window.chrome.runtime) { + delete window.chrome.runtime.onConnect; + delete window.chrome.runtime.onMessage; + } + } catch (e) {} + + // 3. 覆盖 permissions.query,隐藏 notifications 权限异常 + try { + var origQuery = navigator.permissions.query.bind(navigator.permissions); + navigator.permissions.query = function (params) { + if (params.name === "notifications") { + return Promise.resolve({ state: Notification.permission }); + } + return origQuery(params); + }; + } catch (e) {} + + // 4. 修补 plugin 数量,模拟正常浏览器 + try { + Object.defineProperty(navigator, "plugins", { + get: function () { + return [1, 2, 3, 4, 5]; + }, + configurable: true, + }); + } catch (e) {} + + // 5. 修补 languages 属性 + try { + Object.defineProperty(navigator, "languages", { + get: function () { + return ["en-US", "en"]; + }, + configurable: true, + }); + } catch (e) {} + + // 6. 页面加载完成后,自动监控并点击 Turnstile 复选框 + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", autoClickTurnstile); + } else { + autoClickTurnstile(); + } + + function autoClickTurnstile() { + // 定时检查 Turnstile iframe 是否出现 + var checkCount = 0; + var maxChecks = 100; // 最多检查 100 次(约 50 秒) + var timer = setInterval(function () { + checkCount++; + if (checkCount > maxChecks) { + clearInterval(timer); + return; + } + try { + // 查找 Turnstile iframe + var iframes = document.querySelectorAll( + 'iframe[src*="challenges.cloudflare.com"], iframe[src*="turnstile"]' + ); + for (var i = 0; i < iframes.length; i++) { + var iframe = iframes[i]; + try { + // 尝试访问 iframe 内部的 checkbox + var body = iframe.contentDocument || iframe.contentWindow.document; + var checkbox = body.querySelector( + 'input[type="checkbox"], .mark, #cf-chl-widget-nomu1_resp' + ); + if (checkbox && !checkbox.checked) { + checkbox.click(); + } + } catch (e) { + // 跨域限制,尝试通过 postMessage 触发 + try { + iframe.contentWindow.postMessage( + { type: "turnstile-auto-click" }, + "*" + ); + } catch (e2) {} + } + } + + // 也尝试直接操作 Turnstile API + if ( + window.turnstile && + typeof window.turnstile.getResponse === "function" + ) { + var resp = window.turnstile.getResponse(); + if (resp && resp.length > 0) { + clearInterval(timer); // 已获得 token,停止检查 + } + } + } catch (e) {} + }, 500); + } +})(); diff --git a/turnstilePatch/manifest.json b/turnstilePatch/manifest.json new file mode 100644 index 0000000..f153b00 --- /dev/null +++ b/turnstilePatch/manifest.json @@ -0,0 +1,15 @@ +{ + "manifest_version": 2, + "name": "Turnstile Patch", + "version": "1.0.0", + "description": "Patch browser automation detection for Turnstile", + "content_scripts": [ + { + "matches": [""], + "js": ["content.js"], + "run_at": "document_start", + "all_frames": true + } + ], + "permissions": ["activeTab"] +}