Initial commit
Co-authored-by: Qwen-Coder <qwen-coder@alibabacloud.com>
This commit is contained in:
38
INSTALL.md
Normal file
38
INSTALL.md
Normal file
@@ -0,0 +1,38 @@
|
||||
# 安装与使用说明
|
||||
|
||||
## 核心修复
|
||||
|
||||
问题:macOS 系统 Python 不允许直接安装第三方包。
|
||||
|
||||
解决:创建虚拟环境。
|
||||
|
||||
```bash
|
||||
python3 -m venv venv
|
||||
source venv/bin/activate
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
## 使用方法
|
||||
|
||||
```bash
|
||||
# 激活虚拟环境
|
||||
source venv/bin/activate
|
||||
|
||||
# 运行脚本
|
||||
python main.py --proxy http://127.0.0.1:7890 --once
|
||||
```
|
||||
|
||||
或直接用:
|
||||
|
||||
```bash
|
||||
./venv/bin/python main.py --proxy http://127.0.0.1:7890 --once
|
||||
```
|
||||
|
||||
## 参数
|
||||
|
||||
| 参数 | 说明 |
|
||||
|------|------|
|
||||
| `--proxy` | 代理地址 |
|
||||
| `--once` | 只运行一次 |
|
||||
| `--sleep-min` | 循环最短等待(秒) |
|
||||
| `--sleep-max` | 循环最长等待(秒) |
|
||||
4
README.md
Normal file
4
README.md
Normal file
@@ -0,0 +1,4 @@
|
||||
## 先安装 pip install -r requirements.txt
|
||||
## 运行命令 python main2.py --proxy="代理地址"
|
||||
|
||||
./venv/bin/python main.py --proxy http://127.0.0.1:7890
|
||||
660
main.py
Normal file
660
main.py
Normal file
@@ -0,0 +1,660 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
# @Time : 2026/3/1 19:48
|
||||
# @Author :
|
||||
# @Software : PyCharm
|
||||
# @Desc :
|
||||
import json
|
||||
import os
|
||||
import re
|
||||
import sys
|
||||
import time
|
||||
import uuid
|
||||
import math
|
||||
import random
|
||||
import string
|
||||
import secrets
|
||||
import hashlib
|
||||
import base64
|
||||
import threading
|
||||
import argparse
|
||||
from datetime import datetime, timezone, timedelta
|
||||
from urllib.parse import urlparse, parse_qs, urlencode, quote
|
||||
from dataclasses import dataclass
|
||||
from typing import Any, Dict, Optional
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
import urllib.error
|
||||
|
||||
from curl_cffi import requests
|
||||
|
||||
# ==========================================
|
||||
# Mail.tm 临时邮箱 API
|
||||
# ==========================================
|
||||
|
||||
MAILTM_BASE = "https://api.mail.tm"
|
||||
|
||||
|
||||
def _mailtm_headers(*, token: str = "", use_json: bool = False) -> Dict[str, str]:
|
||||
headers = {"Accept": "application/json"}
|
||||
if use_json:
|
||||
headers["Content-Type"] = "application/json"
|
||||
if token:
|
||||
headers["Authorization"] = f"Bearer {token}"
|
||||
return headers
|
||||
|
||||
|
||||
def _mailtm_domains(proxies: Any = None) -> list[str]:
|
||||
resp = requests.get(
|
||||
f"{MAILTM_BASE}/domains",
|
||||
headers=_mailtm_headers(),
|
||||
proxies=proxies,
|
||||
impersonate="chrome",
|
||||
timeout=15,
|
||||
)
|
||||
if resp.status_code != 200:
|
||||
raise RuntimeError(f"获取 Mail.tm 域名失败,状态码: {resp.status_code}")
|
||||
|
||||
data = resp.json()
|
||||
domains = []
|
||||
if isinstance(data, list):
|
||||
items = data
|
||||
elif isinstance(data, dict):
|
||||
items = data.get("hydra:member") or data.get("items") or []
|
||||
else:
|
||||
items = []
|
||||
|
||||
for item in items:
|
||||
if not isinstance(item, dict):
|
||||
continue
|
||||
domain = str(item.get("domain") or "").strip()
|
||||
is_active = item.get("isActive", True)
|
||||
is_private = item.get("isPrivate", False)
|
||||
if domain and is_active and not is_private:
|
||||
domains.append(domain)
|
||||
|
||||
return domains
|
||||
|
||||
|
||||
def get_email_and_token(proxies: Any = None) -> tuple[str, str]:
|
||||
"""创建 Mail.tm 邮箱并获取 Bearer Token"""
|
||||
try:
|
||||
domains = _mailtm_domains(proxies)
|
||||
if not domains:
|
||||
print("[Error] Mail.tm 没有可用域名")
|
||||
return "", ""
|
||||
domain = random.choice(domains)
|
||||
|
||||
for _ in range(5):
|
||||
local = f"oc{secrets.token_hex(5)}"
|
||||
email = f"{local}@{domain}"
|
||||
password = secrets.token_urlsafe(18)
|
||||
|
||||
create_resp = requests.post(
|
||||
f"{MAILTM_BASE}/accounts",
|
||||
headers=_mailtm_headers(use_json=True),
|
||||
json={"address": email, "password": password},
|
||||
proxies=proxies,
|
||||
impersonate="chrome",
|
||||
timeout=15,
|
||||
)
|
||||
|
||||
if create_resp.status_code not in (200, 201):
|
||||
continue
|
||||
|
||||
token_resp = requests.post(
|
||||
f"{MAILTM_BASE}/token",
|
||||
headers=_mailtm_headers(use_json=True),
|
||||
json={"address": email, "password": password},
|
||||
proxies=proxies,
|
||||
impersonate="chrome",
|
||||
timeout=15,
|
||||
)
|
||||
|
||||
if token_resp.status_code == 200:
|
||||
token = str(token_resp.json().get("token") or "").strip()
|
||||
if token:
|
||||
return email, token
|
||||
|
||||
print("[Error] Mail.tm 邮箱创建成功但获取 Token 失败")
|
||||
return "", ""
|
||||
except Exception as e:
|
||||
print(f"[Error] 请求 Mail.tm API 出错: {e}")
|
||||
return "", ""
|
||||
|
||||
|
||||
def get_oai_code(token: str, email: str, proxies: Any = None) -> str:
|
||||
"""使用 Mail.tm Token 轮询获取 OpenAI 验证码"""
|
||||
url_list = f"{MAILTM_BASE}/messages"
|
||||
regex = r"(?<!\d)(\d{6})(?!\d)"
|
||||
seen_ids: set[str] = set()
|
||||
|
||||
print(f"[*] 正在等待邮箱 {email} 的验证码...", end="", flush=True)
|
||||
|
||||
for _ in range(40):
|
||||
print(".", end="", flush=True)
|
||||
try:
|
||||
resp = requests.get(
|
||||
url_list,
|
||||
headers=_mailtm_headers(token=token),
|
||||
proxies=proxies,
|
||||
impersonate="chrome",
|
||||
timeout=15,
|
||||
)
|
||||
if resp.status_code != 200:
|
||||
time.sleep(3)
|
||||
continue
|
||||
|
||||
data = resp.json()
|
||||
if isinstance(data, list):
|
||||
messages = data
|
||||
elif isinstance(data, dict):
|
||||
messages = data.get("hydra:member") or data.get("messages") or []
|
||||
else:
|
||||
messages = []
|
||||
|
||||
for msg in messages:
|
||||
if not isinstance(msg, dict):
|
||||
continue
|
||||
msg_id = str(msg.get("id") or "").strip()
|
||||
if not msg_id or msg_id in seen_ids:
|
||||
continue
|
||||
seen_ids.add(msg_id)
|
||||
|
||||
read_resp = requests.get(
|
||||
f"{MAILTM_BASE}/messages/{msg_id}",
|
||||
headers=_mailtm_headers(token=token),
|
||||
proxies=proxies,
|
||||
impersonate="chrome",
|
||||
timeout=15,
|
||||
)
|
||||
if read_resp.status_code != 200:
|
||||
continue
|
||||
|
||||
mail_data = read_resp.json()
|
||||
sender = str(
|
||||
((mail_data.get("from") or {}).get("address") or "")
|
||||
).lower()
|
||||
subject = str(mail_data.get("subject") or "")
|
||||
intro = str(mail_data.get("intro") or "")
|
||||
text = str(mail_data.get("text") or "")
|
||||
html = mail_data.get("html") or ""
|
||||
if isinstance(html, list):
|
||||
html = "\n".join(str(x) for x in html)
|
||||
content = "\n".join([subject, intro, text, str(html)])
|
||||
|
||||
if "openai" not in sender and "openai" not in content.lower():
|
||||
continue
|
||||
|
||||
m = re.search(regex, content)
|
||||
if m:
|
||||
print(" 抓到啦! 验证码:", m.group(1))
|
||||
return m.group(1)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
time.sleep(3)
|
||||
|
||||
print(" 超时,未收到验证码")
|
||||
return ""
|
||||
|
||||
|
||||
# ==========================================
|
||||
# OAuth 授权与辅助函数
|
||||
# ==========================================
|
||||
|
||||
AUTH_URL = "https://auth.openai.com/oauth/authorize"
|
||||
TOKEN_URL = "https://auth.openai.com/oauth/token"
|
||||
CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann"
|
||||
|
||||
DEFAULT_REDIRECT_URI = f"http://localhost:1455/auth/callback"
|
||||
DEFAULT_SCOPE = "openid email profile offline_access"
|
||||
|
||||
|
||||
def _b64url_no_pad(raw: bytes) -> str:
|
||||
return base64.urlsafe_b64encode(raw).decode("ascii").rstrip("=")
|
||||
|
||||
|
||||
def _sha256_b64url_no_pad(s: str) -> str:
|
||||
return _b64url_no_pad(hashlib.sha256(s.encode("ascii")).digest())
|
||||
|
||||
|
||||
def _random_state(nbytes: int = 16) -> str:
|
||||
return secrets.token_urlsafe(nbytes)
|
||||
|
||||
|
||||
def _pkce_verifier() -> str:
|
||||
return secrets.token_urlsafe(64)
|
||||
|
||||
|
||||
def _parse_callback_url(callback_url: str) -> Dict[str, str]:
|
||||
candidate = callback_url.strip()
|
||||
if not candidate:
|
||||
return {"code": "", "state": "", "error": "", "error_description": ""}
|
||||
|
||||
if "://" not in candidate:
|
||||
if candidate.startswith("?"):
|
||||
candidate = f"http://localhost{candidate}"
|
||||
elif any(ch in candidate for ch in "/?#") or ":" in candidate:
|
||||
candidate = f"http://{candidate}"
|
||||
elif "=" in candidate:
|
||||
candidate = f"http://localhost/?{candidate}"
|
||||
|
||||
parsed = urllib.parse.urlparse(candidate)
|
||||
query = urllib.parse.parse_qs(parsed.query, keep_blank_values=True)
|
||||
fragment = urllib.parse.parse_qs(parsed.fragment, keep_blank_values=True)
|
||||
|
||||
for key, values in fragment.items():
|
||||
if key not in query or not query[key] or not (query[key][0] or "").strip():
|
||||
query[key] = values
|
||||
|
||||
def get1(k: str) -> str:
|
||||
v = query.get(k, [""])
|
||||
return (v[0] or "").strip()
|
||||
|
||||
code = get1("code")
|
||||
state = get1("state")
|
||||
error = get1("error")
|
||||
error_description = get1("error_description")
|
||||
|
||||
if code and not state and "#" in code:
|
||||
code, state = code.split("#", 1)
|
||||
|
||||
if not error and error_description:
|
||||
error, error_description = error_description, ""
|
||||
|
||||
return {
|
||||
"code": code,
|
||||
"state": state,
|
||||
"error": error,
|
||||
"error_description": error_description,
|
||||
}
|
||||
|
||||
|
||||
def _jwt_claims_no_verify(id_token: str) -> Dict[str, Any]:
|
||||
if not id_token or id_token.count(".") < 2:
|
||||
return {}
|
||||
payload_b64 = id_token.split(".")[1]
|
||||
pad = "=" * ((4 - (len(payload_b64) % 4)) % 4)
|
||||
try:
|
||||
payload = base64.urlsafe_b64decode((payload_b64 + pad).encode("ascii"))
|
||||
return json.loads(payload.decode("utf-8"))
|
||||
except Exception:
|
||||
return {}
|
||||
|
||||
|
||||
def _decode_jwt_segment(seg: str) -> Dict[str, Any]:
|
||||
raw = (seg or "").strip()
|
||||
if not raw:
|
||||
return {}
|
||||
pad = "=" * ((4 - (len(raw) % 4)) % 4)
|
||||
try:
|
||||
decoded = base64.urlsafe_b64decode((raw + pad).encode("ascii"))
|
||||
return json.loads(decoded.decode("utf-8"))
|
||||
except Exception:
|
||||
return {}
|
||||
|
||||
|
||||
def _to_int(v: Any) -> int:
|
||||
try:
|
||||
return int(v)
|
||||
except (TypeError, ValueError):
|
||||
return 0
|
||||
|
||||
|
||||
def _post_form(url: str, data: Dict[str, str], timeout: int = 30) -> Dict[str, Any]:
|
||||
body = urllib.parse.urlencode(data).encode("utf-8")
|
||||
req = urllib.request.Request(
|
||||
url,
|
||||
data=body,
|
||||
method="POST",
|
||||
headers={
|
||||
"Content-Type": "application/x-www-form-urlencoded",
|
||||
"Accept": "application/json",
|
||||
},
|
||||
)
|
||||
try:
|
||||
with urllib.request.urlopen(req, timeout=timeout) as resp:
|
||||
raw = resp.read()
|
||||
if resp.status != 200:
|
||||
raise RuntimeError(
|
||||
f"token exchange failed: {resp.status}: {raw.decode('utf-8', 'replace')}"
|
||||
)
|
||||
return json.loads(raw.decode("utf-8"))
|
||||
except urllib.error.HTTPError as exc:
|
||||
raw = exc.read()
|
||||
raise RuntimeError(
|
||||
f"token exchange failed: {exc.code}: {raw.decode('utf-8', 'replace')}"
|
||||
) from exc
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class OAuthStart:
|
||||
auth_url: str
|
||||
state: str
|
||||
code_verifier: str
|
||||
redirect_uri: str
|
||||
|
||||
|
||||
def generate_oauth_url(
|
||||
*, redirect_uri: str = DEFAULT_REDIRECT_URI, scope: str = DEFAULT_SCOPE
|
||||
) -> OAuthStart:
|
||||
state = _random_state()
|
||||
code_verifier = _pkce_verifier()
|
||||
code_challenge = _sha256_b64url_no_pad(code_verifier)
|
||||
|
||||
params = {
|
||||
"client_id": CLIENT_ID,
|
||||
"response_type": "code",
|
||||
"redirect_uri": redirect_uri,
|
||||
"scope": scope,
|
||||
"state": state,
|
||||
"code_challenge": code_challenge,
|
||||
"code_challenge_method": "S256",
|
||||
"prompt": "login",
|
||||
"id_token_add_organizations": "true",
|
||||
"codex_cli_simplified_flow": "true",
|
||||
}
|
||||
auth_url = f"{AUTH_URL}?{urllib.parse.urlencode(params)}"
|
||||
return OAuthStart(
|
||||
auth_url=auth_url,
|
||||
state=state,
|
||||
code_verifier=code_verifier,
|
||||
redirect_uri=redirect_uri,
|
||||
)
|
||||
|
||||
|
||||
def submit_callback_url(
|
||||
*,
|
||||
callback_url: str,
|
||||
expected_state: str,
|
||||
code_verifier: str,
|
||||
redirect_uri: str = DEFAULT_REDIRECT_URI,
|
||||
) -> str:
|
||||
cb = _parse_callback_url(callback_url)
|
||||
if cb["error"]:
|
||||
desc = cb["error_description"]
|
||||
raise RuntimeError(f"oauth error: {cb['error']}: {desc}".strip())
|
||||
|
||||
if not cb["code"]:
|
||||
raise ValueError("callback url missing ?code=")
|
||||
if not cb["state"]:
|
||||
raise ValueError("callback url missing ?state=")
|
||||
if cb["state"] != expected_state:
|
||||
raise ValueError("state mismatch")
|
||||
|
||||
token_resp = _post_form(
|
||||
TOKEN_URL,
|
||||
{
|
||||
"grant_type": "authorization_code",
|
||||
"client_id": CLIENT_ID,
|
||||
"code": cb["code"],
|
||||
"redirect_uri": redirect_uri,
|
||||
"code_verifier": code_verifier,
|
||||
},
|
||||
)
|
||||
|
||||
access_token = (token_resp.get("access_token") or "").strip()
|
||||
refresh_token = (token_resp.get("refresh_token") or "").strip()
|
||||
id_token = (token_resp.get("id_token") or "").strip()
|
||||
expires_in = _to_int(token_resp.get("expires_in"))
|
||||
|
||||
claims = _jwt_claims_no_verify(id_token)
|
||||
email = str(claims.get("email") or "").strip()
|
||||
auth_claims = claims.get("https://api.openai.com/auth") or {}
|
||||
account_id = str(auth_claims.get("chatgpt_account_id") or "").strip()
|
||||
|
||||
now = int(time.time())
|
||||
expired_rfc3339 = time.strftime(
|
||||
"%Y-%m-%dT%H:%M:%SZ", time.gmtime(now + max(expires_in, 0))
|
||||
)
|
||||
now_rfc3339 = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(now))
|
||||
|
||||
config = {
|
||||
"id_token": id_token,
|
||||
"access_token": access_token,
|
||||
"refresh_token": refresh_token,
|
||||
"account_id": account_id,
|
||||
"last_refresh": now_rfc3339,
|
||||
"email": email,
|
||||
"type": "codex",
|
||||
"expired": expired_rfc3339,
|
||||
}
|
||||
|
||||
return json.dumps(config, ensure_ascii=False, separators=(",", ":"))
|
||||
|
||||
|
||||
# ==========================================
|
||||
# 核心注册逻辑
|
||||
# ==========================================
|
||||
|
||||
|
||||
def run(proxy: Optional[str]) -> Optional[str]:
|
||||
proxies: Any = None
|
||||
if proxy:
|
||||
proxies = {"http": proxy, "https": proxy}
|
||||
|
||||
s = requests.Session(proxies=proxies, impersonate="chrome")
|
||||
|
||||
try:
|
||||
trace = s.get("https://cloudflare.com/cdn-cgi/trace", timeout=10)
|
||||
trace = trace.text
|
||||
loc_re = re.search(r"^loc=(.+)$", trace, re.MULTILINE)
|
||||
loc = loc_re.group(1) if loc_re else None
|
||||
print(f"[*] 当前 IP 所在地: {loc}")
|
||||
if loc == "CN" or loc == "HK":
|
||||
raise RuntimeError("检查代理哦w - 所在地不支持")
|
||||
except Exception as e:
|
||||
print(f"[Error] 网络连接检查失败: {e}")
|
||||
return None
|
||||
|
||||
email, dev_token = get_email_and_token(proxies)
|
||||
if not email or not dev_token:
|
||||
return None
|
||||
print(f"[*] 成功获取 Mail.tm 邮箱与授权: {email}")
|
||||
|
||||
oauth = generate_oauth_url()
|
||||
url = oauth.auth_url
|
||||
|
||||
try:
|
||||
resp = s.get(url, timeout=15)
|
||||
did = s.cookies.get("oai-did")
|
||||
print(f"[*] Device ID: {did}")
|
||||
|
||||
signup_body = f'{{"username":{{"value":"{email}","kind":"email"}},"screen_hint":"signup"}}'
|
||||
sen_req_body = f'{{"p":"","id":"{did}","flow":"authorize_continue"}}'
|
||||
|
||||
sen_resp = requests.post(
|
||||
"https://sentinel.openai.com/backend-api/sentinel/req",
|
||||
headers={
|
||||
"origin": "https://sentinel.openai.com",
|
||||
"referer": "https://sentinel.openai.com/backend-api/sentinel/frame.html?sv=20260219f9f6",
|
||||
"content-type": "text/plain;charset=UTF-8",
|
||||
},
|
||||
data=sen_req_body,
|
||||
proxies=proxies,
|
||||
impersonate="chrome",
|
||||
timeout=15,
|
||||
)
|
||||
|
||||
if sen_resp.status_code != 200:
|
||||
print(f"[Error] Sentinel 异常拦截,状态码: {sen_resp.status_code}")
|
||||
return None
|
||||
|
||||
sen_token = sen_resp.json()["token"]
|
||||
sentinel = f'{{"p": "", "t": "", "c": "{sen_token}", "id": "{did}", "flow": "authorize_continue"}}'
|
||||
|
||||
signup_resp = s.post(
|
||||
"https://auth.openai.com/api/accounts/authorize/continue",
|
||||
headers={
|
||||
"referer": "https://auth.openai.com/create-account",
|
||||
"accept": "application/json",
|
||||
"content-type": "application/json",
|
||||
"openai-sentinel-token": sentinel,
|
||||
},
|
||||
data=signup_body,
|
||||
)
|
||||
print(f"[*] 提交注册表单状态: {signup_resp.status_code}")
|
||||
|
||||
otp_resp = s.post(
|
||||
"https://auth.openai.com/api/accounts/passwordless/send-otp",
|
||||
headers={
|
||||
"referer": "https://auth.openai.com/create-account/password",
|
||||
"accept": "application/json",
|
||||
"content-type": "application/json",
|
||||
},
|
||||
)
|
||||
print(f"[*] 验证码发送状态: {otp_resp.status_code}")
|
||||
|
||||
code = get_oai_code(dev_token, email, proxies)
|
||||
if not code:
|
||||
return None
|
||||
|
||||
code_body = f'{{"code":"{code}"}}'
|
||||
code_resp = s.post(
|
||||
"https://auth.openai.com/api/accounts/email-otp/validate",
|
||||
headers={
|
||||
"referer": "https://auth.openai.com/email-verification",
|
||||
"accept": "application/json",
|
||||
"content-type": "application/json",
|
||||
},
|
||||
data=code_body,
|
||||
)
|
||||
print(f"[*] 验证码校验状态: {code_resp.status_code}")
|
||||
|
||||
create_account_body = '{"name":"Neo","birthdate":"2000-02-20"}'
|
||||
create_account_resp = s.post(
|
||||
"https://auth.openai.com/api/accounts/create_account",
|
||||
headers={
|
||||
"referer": "https://auth.openai.com/about-you",
|
||||
"accept": "application/json",
|
||||
"content-type": "application/json",
|
||||
},
|
||||
data=create_account_body,
|
||||
)
|
||||
create_account_status = create_account_resp.status_code
|
||||
print(f"[*] 账户创建状态: {create_account_status}")
|
||||
|
||||
if create_account_status != 200:
|
||||
print(create_account_resp.text)
|
||||
return None
|
||||
|
||||
auth_cookie = s.cookies.get("oai-client-auth-session")
|
||||
if not auth_cookie:
|
||||
print("[Error] 未能获取到授权 Cookie")
|
||||
return None
|
||||
|
||||
auth_json = _decode_jwt_segment(auth_cookie.split(".")[0])
|
||||
workspaces = auth_json.get("workspaces") or []
|
||||
if not workspaces:
|
||||
print("[Error] 授权 Cookie 里没有 workspace 信息")
|
||||
return None
|
||||
workspace_id = str((workspaces[0] or {}).get("id") or "").strip()
|
||||
if not workspace_id:
|
||||
print("[Error] 无法解析 workspace_id")
|
||||
return None
|
||||
|
||||
select_body = f'{{"workspace_id":"{workspace_id}"}}'
|
||||
select_resp = s.post(
|
||||
"https://auth.openai.com/api/accounts/workspace/select",
|
||||
headers={
|
||||
"referer": "https://auth.openai.com/sign-in-with-chatgpt/codex/consent",
|
||||
"content-type": "application/json",
|
||||
},
|
||||
data=select_body,
|
||||
)
|
||||
|
||||
if select_resp.status_code != 200:
|
||||
print(f"[Error] 选择 workspace 失败,状态码: {select_resp.status_code}")
|
||||
print(select_resp.text)
|
||||
return None
|
||||
|
||||
continue_url = str((select_resp.json() or {}).get("continue_url") or "").strip()
|
||||
if not continue_url:
|
||||
print("[Error] workspace/select 响应里缺少 continue_url")
|
||||
return None
|
||||
|
||||
current_url = continue_url
|
||||
for _ in range(6):
|
||||
final_resp = s.get(current_url, allow_redirects=False, timeout=15)
|
||||
location = final_resp.headers.get("Location") or ""
|
||||
|
||||
if final_resp.status_code not in [301, 302, 303, 307, 308]:
|
||||
break
|
||||
if not location:
|
||||
break
|
||||
|
||||
next_url = urllib.parse.urljoin(current_url, location)
|
||||
if "code=" in next_url and "state=" in next_url:
|
||||
return submit_callback_url(
|
||||
callback_url=next_url,
|
||||
code_verifier=oauth.code_verifier,
|
||||
redirect_uri=oauth.redirect_uri,
|
||||
expected_state=oauth.state,
|
||||
)
|
||||
current_url = next_url
|
||||
|
||||
print("[Error] 未能在重定向链中捕获到最终 Callback URL")
|
||||
return None
|
||||
|
||||
except Exception as e:
|
||||
print(f"[Error] 运行时发生错误: {e}")
|
||||
return None
|
||||
|
||||
|
||||
def main() -> None:
|
||||
parser = argparse.ArgumentParser(description="OpenAI 自动注册脚本")
|
||||
parser.add_argument(
|
||||
"--proxy", default="", help="代理地址,如 http://127.0.0.1:7890"
|
||||
)
|
||||
parser.add_argument("--once", action="store_true", help="只运行一次")
|
||||
parser.add_argument("--sleep-min", type=int, default=5, help="循环模式最短等待秒数")
|
||||
parser.add_argument(
|
||||
"--sleep-max", type=int, default=20, help="循环模式最长等待秒数"
|
||||
)
|
||||
args = parser.parse_args()
|
||||
|
||||
sleep_min = max(1, args.sleep_min)
|
||||
sleep_max = max(sleep_min, args.sleep_max)
|
||||
|
||||
count = 0
|
||||
print("[Info] Yasal's Seamless OpenAI Auto-Registrar Started for ZJH")
|
||||
|
||||
while True:
|
||||
count += 1
|
||||
print(
|
||||
f"\n[{datetime.now().strftime('%H:%M:%S')}] >>> 开始第 {count} 次注册流程 <<<"
|
||||
)
|
||||
|
||||
try:
|
||||
token_json = run(args.proxy)
|
||||
|
||||
if token_json:
|
||||
try:
|
||||
t_data = json.loads(token_json)
|
||||
fname_email = t_data.get("email", "unknown").replace("@", "_")
|
||||
except Exception:
|
||||
fname_email = "unknown"
|
||||
|
||||
file_name = f"token_{fname_email}_{int(time.time())}.json"
|
||||
|
||||
with open(file_name, "w", encoding="utf-8") as f:
|
||||
f.write(token_json)
|
||||
|
||||
print(f"[*] 成功! Token 已保存至: {file_name}")
|
||||
else:
|
||||
print("[-] 本次注册失败。")
|
||||
|
||||
except Exception as e:
|
||||
print(f"[Error] 发生未捕获异常: {e}")
|
||||
|
||||
if args.once:
|
||||
break
|
||||
|
||||
wait_time = random.randint(sleep_min, sleep_max)
|
||||
print(f"[*] 休息 {wait_time} 秒...")
|
||||
time.sleep(wait_time)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
4
requirements.txt
Normal file
4
requirements.txt
Normal file
@@ -0,0 +1,4 @@
|
||||
certifi>=2020.12.5
|
||||
cffi>=1.14.0
|
||||
curl_cffi>=0.5.0
|
||||
pycparser>=2.20
|
||||
1
token_oc3fbac10c7b_dollicons.com_1772892929.json
Normal file
1
token_oc3fbac10c7b_dollicons.com_1772892929.json
Normal file
@@ -0,0 +1 @@
|
||||
{"id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImIxZGQzZjhmLTlhYWQtNDdmZS1iMGU3LWVkYjAwOTc3N2Q2YiIsInR5cCI6IkpXVCJ9.eyJhdF9oYXNoIjoiZHo5eEtJYzlrMGUzcGUwaXozQUM1USIsImF1ZCI6WyJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIl0sImF1dGhfcHJvdmlkZXIiOiJwYXNzd29yZGxlc3MiLCJhdXRoX3RpbWUiOjE3NzI4OTI5MTYsImVtYWlsIjoib2MzZmJhYzEwYzdiQGRvbGxpY29ucy5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZXhwIjoxNzcyODk2NTI4LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9hY2NvdW50X2lkIjoiZDQxY2MyOGEtYjdiOS00MDE1LThhOTUtYzAwMDc2ZjhjN2VhIiwiY2hhdGdwdF9wbGFuX3R5cGUiOiJmcmVlIiwiY2hhdGdwdF9zdWJzY3JpcHRpb25fYWN0aXZlX3N0YXJ0IjpudWxsLCJjaGF0Z3B0X3N1YnNjcmlwdGlvbl9hY3RpdmVfdW50aWwiOm51bGwsImNoYXRncHRfc3Vic2NyaXB0aW9uX2xhc3RfY2hlY2tlZCI6IjIwMjYtMDMtMDdUMTQ6MTU6MTUuOTk4NDg5KzAwOjAwIiwiY2hhdGdwdF91c2VyX2lkIjoidXNlci1yZk9GdWdTeU81NDMyZTdDa3dkR1gydGEiLCJncm91cHMiOltdLCJvcmdhbml6YXRpb25zIjpbeyJpZCI6Im9yZy1zVkZ5R21tbXhhcjFBWnpEbWpMOWxiT08iLCJpc19kZWZhdWx0Ijp0cnVlLCJyb2xlIjoib3duZXIiLCJ0aXRsZSI6IlBlcnNvbmFsIn1dLCJ1c2VyX2lkIjoidXNlci1yZk9GdWdTeU81NDMyZTdDa3dkR1gydGEifSwiaWF0IjoxNzcyODkyOTI4LCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6ImE4OTc0MGZhLTQ4YWItNDU3YS1hZTA4LWZiYzgwZGQxYjhkOCIsInJhdCI6MTc3Mjg5Mjg4MSwic2lkIjoiYmI2Y2YzZjMtYTY2NS00NDA5LTk3YzktMjYzYjgwMmViMWQ3Iiwic3ViIjoiYXV0aDB8MTF4MmNlb2xIaEJ1MHBJYTFURHUySnIxIn0.sEwGrpWiUhkwDGLGfG7b_ggN6ux_VBfpVv7QmUFhoISoGK9_UX-ciennCkYHfDDPQHUC_Wth_7rwjdeq0fThtwsDZiBWnuNK6jBBLkbUJabNW3jCOQcyYTeQNUFuSSFVLF2B0GjNvZ46QO7h0VXybZdXvdg4f1_04eUwPkwT0r9EELN2sdWW57IYbuhwyi4Xu7eK9wFVb4b2Pjvptcl1uzdAd1sJg5KDXMi5NRmI8c9NV5Kq7p700a5svUDtFIwfCaKAJfaIrqL8u-PdxaUeu7SEqAiXVWzcF8hjsikTjyMbsNS1Jwehbogzv8cEcnzdK6lvuy2zRCjKej0Kj2SJPF22AwP4gNbI8r-7oYO4-pbvc-TST5bSVp2jh16YWp7_GB1mmZJsPcU7ZjKW1FrncDCvlFbBu5_u_BDeklBucy0EGdS_H1-EiLS6_QpwtX0jHaOGNAR2D0PngensL3rl1ItKjxeM9U6a41eQz4__mHq87ANRkCXzDbZ3Z6yu420eZkXnW-1hKik7vdJghjPgGFAvUC2_Z8YE4y0xhveKN9rdOtygUTIq6bNKBYAyuh5PcQqQZp1e2XceV1h8R1H4AR8ZJpu6o2y9WKcbTyqIxFepZ7Afhfxf6ZRy3TzwPrkiffsOlUHkSJTjitmvnOrJ5VQ81fWFhH0lEOJErFcYtHI","access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIiwiZXhwIjoxNzczNzU2OTI5LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9hY2NvdW50X2lkIjoiZDQxY2MyOGEtYjdiOS00MDE1LThhOTUtYzAwMDc2ZjhjN2VhIiwiY2hhdGdwdF9hY2NvdW50X3VzZXJfaWQiOiJ1c2VyLXJmT0Z1Z1N5TzU0MzJlN0Nrd2RHWDJ0YV9fZDQxY2MyOGEtYjdiOS00MDE1LThhOTUtYzAwMDc2ZjhjN2VhIiwiY2hhdGdwdF9jb21wdXRlX3Jlc2lkZW5jeSI6Im5vX2NvbnN0cmFpbnQiLCJjaGF0Z3B0X3BsYW5fdHlwZSI6ImZyZWUiLCJjaGF0Z3B0X3VzZXJfaWQiOiJ1c2VyLXJmT0Z1Z1N5TzU0MzJlN0Nrd2RHWDJ0YSIsInVzZXJfaWQiOiJ1c2VyLXJmT0Z1Z1N5TzU0MzJlN0Nrd2RHWDJ0YSJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJvYzNmYmFjMTBjN2JAZG9sbGljb25zLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfSwiaWF0IjoxNzcyODkyOTI4LCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6ImRmZDgwMjAzLWVmMzgtNDM1OS04YTU4LWI4MjRlYmU4OWZhYyIsIm5iZiI6MTc3Mjg5MjkyOCwicHdkX2F1dGhfdGltZSI6MTc3Mjg5MjkxNTk5OCwic2NwIjpbIm9wZW5pZCIsImVtYWlsIiwicHJvZmlsZSIsIm9mZmxpbmVfYWNjZXNzIl0sInNlc3Npb25faWQiOiJhdXRoc2Vzc19USWJQQmZhNUMxMm9obUhoQjZrOHFDc3UiLCJzbCI6dHJ1ZSwic3ViIjoiYXV0aDB8MTF4MmNlb2xIaEJ1MHBJYTFURHUySnIxIn0.PublQl0TrPL8pS4MF3i_q-gDVdJS7o3BP415hRBiDnktfVBMpz6KKh1uFvT2gWPAZbYGk4JnqICX9A_j4TRnoH_Z-bhVTrMFm67RVxtqFTmSJvGRGxGnY7HhZu3fyYytm1zYqaAGm9rYyzQk9SJUKalbygp8aGpLO8xruScTgIS4ez4M5e7iR-CLXbGirGdyt8VZWGKvN0eQM38C6SsU2b1LMvOiCLGNTKUa8qk54F23D-FnNexAjaTR8EUp4LA_5ep9N7IQOTGlWnvEPWDsPVa7TE_ldUEMrERk95BDAHsivYy_-1bGpos_PL14jSzy68gLWxorhsm9VlZUgwmpCCby3b9SHTRSbh3M0zsyz1MWObsPj85n3UbGVFLJLfdoP4HqnmMRmPRRF7MIhp6YPiTJAuxgpUTpsf16lfrhHsDzH79u8_T3W3QJZvloUpxLBKHjqWBjDzjK_u1yuxAr1uBamgDbvTK7hh3MA56VnU8S4WlLbAX0YXHwuSMY8yUC-cEZRbKwUP45jGwCmIMJ5-mrpFcal7Bxyu5NEtytTOqar3xkcK7JLVF7Y23sZMwYIWRDy_7VApHG08B375qCp1y2kC1le1IA7xXTHndJoPeF7iR5oc_h70-5dLUJxinrpXPLJIk_eBARuK4wCv19W7Q_3d4rOac0IlfyLxIbq8s","refresh_token":"rt_nkXm0_oG7VeJzUbL6GsKXf3dt_Prz8WBVty8zkq9A5E.NfJJKG2KB_rCDQr7aTRRG4nUl28TNog34F1QH4JyIm8","account_id":"d41cc28a-b7b9-4015-8a95-c00076f8c7ea","last_refresh":"2026-03-07T14:15:29Z","email":"oc3fbac10c7b@dollicons.com","type":"codex","expired":"2026-03-17T14:15:29Z"}
|
||||
1
token_oc459dcc5111_dollicons.com_1772893145.json
Normal file
1
token_oc459dcc5111_dollicons.com_1772893145.json
Normal file
@@ -0,0 +1 @@
|
||||
{"id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImIxZGQzZjhmLTlhYWQtNDdmZS1iMGU3LWVkYjAwOTc3N2Q2YiIsInR5cCI6IkpXVCJ9.eyJhdF9oYXNoIjoieHd3dThLZDlfeUthUnd6UWZjV29kQSIsImF1ZCI6WyJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIl0sImF1dGhfcHJvdmlkZXIiOiJwYXNzd29yZGxlc3MiLCJhdXRoX3RpbWUiOjE3NzI4OTMxMzQsImVtYWlsIjoib2M0NTlkY2M1MTExQGRvbGxpY29ucy5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZXhwIjoxNzcyODk2NzQ0LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9hY2NvdW50X2lkIjoiMzYxOTY3M2YtZTU1Yy00ZmI2LTk5NTctNDljYjE4MzEzN2EyIiwiY2hhdGdwdF9wbGFuX3R5cGUiOiJmcmVlIiwiY2hhdGdwdF9zdWJzY3JpcHRpb25fYWN0aXZlX3N0YXJ0IjpudWxsLCJjaGF0Z3B0X3N1YnNjcmlwdGlvbl9hY3RpdmVfdW50aWwiOm51bGwsImNoYXRncHRfc3Vic2NyaXB0aW9uX2xhc3RfY2hlY2tlZCI6IjIwMjYtMDMtMDdUMTQ6MTg6NTQuNTUzMjk4KzAwOjAwIiwiY2hhdGdwdF91c2VyX2lkIjoidXNlci1pcXVOWU5RSENhME5zQndSWW1aa1FUenciLCJncm91cHMiOltdLCJvcmdhbml6YXRpb25zIjpbeyJpZCI6Im9yZy1ERXpPSEVsaVE5VENTYzRGakE0WEpNTzQiLCJpc19kZWZhdWx0Ijp0cnVlLCJyb2xlIjoib3duZXIiLCJ0aXRsZSI6IlBlcnNvbmFsIn1dLCJ1c2VyX2lkIjoidXNlci1pcXVOWU5RSENhME5zQndSWW1aa1FUencifSwiaWF0IjoxNzcyODkzMTQ0LCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6Ijc1M2E0MDIzLTcyNDMtNGQ2Ny05NzNkLTQ2NzczOTlmNTU4YyIsInJhdCI6MTc3Mjg5MzA5Niwic2lkIjoiMTEyZGNhNzgtMWNjNS00MDVlLTg0MzctMzljOWYwNTI4YjJkIiwic3ViIjoiYXV0aDB8QVlwVzcyV1BFbXltVHdFZ1hQeXZDb3dYIn0.guHDLz2n-wmtmct45jMUfgSiCJfRVZLjsOdcK9tZj_239aBtWTo11MIvXpFY1LJCRfJNxPH-f5XJSXDSzwB_X4B_G4U2oGyo4C0el6WB0klbJKbgArcACPu-k-yQ2TkX8LDTKVNvhzuz9Ik_t8TSCYNRadT2sU1HXSOk3Wu_lNjkeL4ZCCGBdNv3nxEIjLwovRyAAri6c1kTNf9XS3ac3-1BfEn1iWzcJQ3BZIQDKJlUr7ystz-WCg6bw8HfmuVhB4KY_dCi1D1Iafua6asRjOB49noQSzVeaHjhAxQN3EX6dV3g3Kd6oAsI6NkmXnfV4TBqio0dSwEN5qbmiQEOy6edfKIfzdGwXLXtpJQHrLWP6H4E1BW2hHqocPhdj72ok4Y2S7efyHT9NrQ1zl8vbnH-kFRvQff4-PP11MqWxE7vXJlE0fhkzSh2I8mKOCVqha7GofWaUnMej-CRN7fagpAis-BcMpv8Godf-wKq_FCptwXexbf0FCNcrOBE3O82sLoZduYA_tjzTb04O_a98KDsSwm9QITa1pyzu1TXmoVpiRGNZBt0hXwNJ1qQyBte79S1tj2UKvk26g6k69nan8jydi3z5R1IO0a2v0rrRFYomNUxYECzSsIK6sNL-CEzj2dshLx--wTPO0UWyeak6y6FPv7rCALujn3pyDLYvXg","access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIiwiZXhwIjoxNzczNzU3MTQ1LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9hY2NvdW50X2lkIjoiMzYxOTY3M2YtZTU1Yy00ZmI2LTk5NTctNDljYjE4MzEzN2EyIiwiY2hhdGdwdF9hY2NvdW50X3VzZXJfaWQiOiJ1c2VyLWlxdU5ZTlFIQ2EwTnNCd1JZbVprUVR6d19fMzYxOTY3M2YtZTU1Yy00ZmI2LTk5NTctNDljYjE4MzEzN2EyIiwiY2hhdGdwdF9jb21wdXRlX3Jlc2lkZW5jeSI6Im5vX2NvbnN0cmFpbnQiLCJjaGF0Z3B0X3BsYW5fdHlwZSI6ImZyZWUiLCJjaGF0Z3B0X3VzZXJfaWQiOiJ1c2VyLWlxdU5ZTlFIQ2EwTnNCd1JZbVprUVR6dyIsInVzZXJfaWQiOiJ1c2VyLWlxdU5ZTlFIQ2EwTnNCd1JZbVprUVR6dyJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJvYzQ1OWRjYzUxMTFAZG9sbGljb25zLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfSwiaWF0IjoxNzcyODkzMTQ0LCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6ImQ1YWI3YTQyLTNjYjQtNDljZS04M2UzLTM3NTY3YTg0NzQzZiIsIm5iZiI6MTc3Mjg5MzE0NCwicHdkX2F1dGhfdGltZSI6MTc3Mjg5MzEzNDU1Mywic2NwIjpbIm9wZW5pZCIsImVtYWlsIiwicHJvZmlsZSIsIm9mZmxpbmVfYWNjZXNzIl0sInNlc3Npb25faWQiOiJhdXRoc2Vzc19pUVB2MlBNOGtmeFViUTZKamlXVjc3d3YiLCJzbCI6dHJ1ZSwic3ViIjoiYXV0aDB8QVlwVzcyV1BFbXltVHdFZ1hQeXZDb3dYIn0.siZQ2v36ydWFx9pmp7dG13I7GHVaKm3v0dyHEUuLCWWRoxyzh2rC5zC07KtlQbZ5otMsAV5AyTxk3l_4a2bRbn3xiD4IpLSqikGrZBPoGtMq3cHyaVlhdPKwsVRnOCmHqNcOsd8yGCxH5H7ifeq8YA9N9hfHMlArRCCKML0aRpRMUUt6Sudi3DrJ5gR4dkWGGMNYStf_Ra3MryWYnRIwJP1nbRNyXivlnBr6I-TWfdyPujzZbEGgimlG4KSjQD-4YmB8eU3hSxACNFdtqIdZEusqjURiJxToJ9fHL78KBrWvFkG3vTKjScRW5JZ1YlcULLvaAoFFLmDUSpFv9EtmoqGwVctDAteOJO7nf90TcMKWwmc2tYAWDAt8vPtpyCD4fQGWWYfLipKW8-op8qvK-Bjbjp3But5JS74_5TWpwnXHoCQGUS273lZG4uLemw7rHR024mE9Z18GmQ1BzTJdp5Q5z2LXfuLCSnBHBHVV6Tg-Dt2ymRGDa_Ofz7EQizaB3NC08qFJxg7I7xQw7JR4qpxdt0mc5oyso6K1xAXWhJF8zwbeLVs_1HIH9_o-TRCp-n58x2jApKIGfCQI-_eFM_rRE3CQKE1lahDcY3k-7VEzbjQjYFvI1J_nseKkK81frKKGWqjMPksXYKTUIloLgyTFMhJqVQJiTaIINu05WP8","refresh_token":"rt_dGLNVN104mxy5ildBfv0DuDqQQw2YENwmZ6ygiIJfR4.Avc01tqAOBR1wXjJCrDIennFQI6XX2YAfgnMSa5QTAM","account_id":"3619673f-e55c-4fb6-9957-49cb183137a2","last_refresh":"2026-03-07T14:19:05Z","email":"oc459dcc5111@dollicons.com","type":"codex","expired":"2026-03-17T14:19:05Z"}
|
||||
1
token_oc7f9af0f75b_dollicons.com_1772892833.json
Normal file
1
token_oc7f9af0f75b_dollicons.com_1772892833.json
Normal file
@@ -0,0 +1 @@
|
||||
{"id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImIxZGQzZjhmLTlhYWQtNDdmZS1iMGU3LWVkYjAwOTc3N2Q2YiIsInR5cCI6IkpXVCJ9.eyJhdF9oYXNoIjoiWV91dTRZNzIzRVV2bi1Ua1RxSEJTUSIsImF1ZCI6WyJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIl0sImF1dGhfcHJvdmlkZXIiOiJwYXNzd29yZGxlc3MiLCJhdXRoX3RpbWUiOjE3NzI4OTI4MjAsImVtYWlsIjoib2M3ZjlhZjBmNzViQGRvbGxpY29ucy5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZXhwIjoxNzcyODk2NDMzLCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9hY2NvdW50X2lkIjoiZTlhNTg1MDctYzUwZS00M2JjLTk2OWItZjM0NmJmMWIzYTk1IiwiY2hhdGdwdF9wbGFuX3R5cGUiOiJmcmVlIiwiY2hhdGdwdF9zdWJzY3JpcHRpb25fYWN0aXZlX3N0YXJ0IjpudWxsLCJjaGF0Z3B0X3N1YnNjcmlwdGlvbl9hY3RpdmVfdW50aWwiOm51bGwsImNoYXRncHRfc3Vic2NyaXB0aW9uX2xhc3RfY2hlY2tlZCI6IjIwMjYtMDMtMDdUMTQ6MTM6NDAuNjI3MTc3KzAwOjAwIiwiY2hhdGdwdF91c2VyX2lkIjoidXNlci0wVmg5NTBla2ZkeGJveVV1WTV2bnFnUFMiLCJncm91cHMiOltdLCJvcmdhbml6YXRpb25zIjpbeyJpZCI6Im9yZy1uOTNjM0QzM1RJNkdsTERwSzhYV0NCaWIiLCJpc19kZWZhdWx0Ijp0cnVlLCJyb2xlIjoib3duZXIiLCJ0aXRsZSI6IlBlcnNvbmFsIn1dLCJ1c2VyX2lkIjoidXNlci0wVmg5NTBla2ZkeGJveVV1WTV2bnFnUFMifSwiaWF0IjoxNzcyODkyODMzLCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6IjBhOTBmZTRiLTFkNTctNGRkYi1hMDI0LTA1NTU2Mjg2ZjRiMyIsInJhdCI6MTc3Mjg5Mjc4NSwic2lkIjoiNmZhODQ2OTMtZTkxNy00MGFhLWJjYmItNTBhNDcxNDMzYmZlIiwic3ViIjoiYXV0aDB8d1QxbjhPUUdYTWp3TUtRWUVITU5IQnVhIn0.LHqYxaCm1mq336KSOL6B985DUAaXd-dNfgXzFBxthqA8-aS8s2kPQbuzqCtzlYJQfS1kPhnkxZbf8FHlcviJS_eVM8bD5J1yrihdc5nCX5DR9HCCRmM9Salt0BKkL0E3AtUv5ezO3mX-Bl4GF3k8TnmXWlrgKrkugEo9jidhfftBVUSt_bfLMD2GSEY8yGCpAPtl3yTOabhZRifNjS8_aJXztgqkqh2Ufng7UNswi5LB7KEnDABY4oYS6xYvZ8bxDa2YYlXu_ItHQPNE-d5mTnKf3vfTPkBt73n_Dx8fZDi2iXu7SS_EaG_-xqJyOHasivliGiWbOuRKGSNFn0EEFTJnmCNYeBcxYhAqPEIk8dSGjsYnTqacXb35n8mNbcqUjILtMxcrCvKdebAE8Dhgg00LQ7NDxQehO5307IdXISqBU7Rgvd_ytUYN5h8kHfoSGucsPyR_iJ3dhFqzIBELx9hxWh5jLLHEQai5tyKR_Prdctzz90zEh3t5QO9uWyxPzZxsfOaZBUl5ElN2wxWq7y0zNSwutt9yMNFOPA7lscratHl0FAeQHbtw_hX0n3YOPSKjzyS1PPddS5K86Cn-x3lxbdhEC71v-QSalOnpk92ATsA5EmCcORo4VU3jVqnVYXMZFYi_GTKjr5SDt1DQWzdS_ARiKNosAIzBwTUMcwo","access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIiwiZXhwIjoxNzczNzU2ODM0LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9hY2NvdW50X2lkIjoiZTlhNTg1MDctYzUwZS00M2JjLTk2OWItZjM0NmJmMWIzYTk1IiwiY2hhdGdwdF9hY2NvdW50X3VzZXJfaWQiOiJ1c2VyLTBWaDk1MGVrZmR4Ym95VXVZNXZucWdQU19fZTlhNTg1MDctYzUwZS00M2JjLTk2OWItZjM0NmJmMWIzYTk1IiwiY2hhdGdwdF9jb21wdXRlX3Jlc2lkZW5jeSI6Im5vX2NvbnN0cmFpbnQiLCJjaGF0Z3B0X3BsYW5fdHlwZSI6ImZyZWUiLCJjaGF0Z3B0X3VzZXJfaWQiOiJ1c2VyLTBWaDk1MGVrZmR4Ym95VXVZNXZucWdQUyIsInVzZXJfaWQiOiJ1c2VyLTBWaDk1MGVrZmR4Ym95VXVZNXZucWdQUyJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJvYzdmOWFmMGY3NWJAZG9sbGljb25zLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfSwiaWF0IjoxNzcyODkyODMzLCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6ImY3ZWMwMjg2LWNkNzEtNDU2MC04MzI5LTRlMTI5OThmYTk0ZCIsIm5iZiI6MTc3Mjg5MjgzMywicHdkX2F1dGhfdGltZSI6MTc3Mjg5MjgyMDYyNywic2NwIjpbIm9wZW5pZCIsImVtYWlsIiwicHJvZmlsZSIsIm9mZmxpbmVfYWNjZXNzIl0sInNlc3Npb25faWQiOiJhdXRoc2Vzc19QbDVGeFhpd09iaUxEMXZ1STh3T3duZ0EiLCJzbCI6dHJ1ZSwic3ViIjoiYXV0aDB8d1QxbjhPUUdYTWp3TUtRWUVITU5IQnVhIn0.fN8H2U4HBM_Pr5AKoIIhjYvEWr5Ua3_3L1HQjCzmpzUUIul0KOO0cmWgfW6IcE8vCy2WnAXkyUiEkoUay8afEvGEj2UH1ZwpqjW-3GsPTQxVcmmzNecVtrZjuUyVTeeL-a0yz4czWx0Uak8Y1zxLfOe1JismM9o2U3pppOfq2CkCvBJ1cDmkH-v45Vrw3kNGSBWsROekareEBlQRV0N04mWpvnNmwtkgQc_AB8j3ng-cixxH2w9jrtYsUFpwwGlFEAthw0YdJELYQl3pMsml_2TGxFsjMUrCA33RTAiShoc9eij88C682Xfk1aJg2uIs8vgo3Gw5Qez86r31UGEpX8ZAmHeTFCgq49A_KawZW8VKHXjN9R9caHMQLOjAOjmsJ9NcxkP6MLjqypebpympw3BlMol79VnLyc5UkhbpLb-WDDxAdYi5twIITa0G6kr2fRAQNL099OilZgJQ7zZ2Q9Pdj9FaqUS_ogTI1I9wsAWMYSmo6wIPj5kC8ghVaxjqhf4Iau_LKW9PE2i84mYQme2B0AqLNs8p0t8NlDLzo0xvVZT9LLT9vaDzRuWje6LQmZjx_naGx17AGebvdvO4ZJ4LRUwq3h_6NQwhcSXaNie3sX39F2rGKDEcK8T29GOat9ZONyGrkEq73XH9Gsj2uOk19YsnKG1Ha4gWLiUgcTE","refresh_token":"rt_iqUrcz195Wf2bR8SoxM2VvLf3jVgWvDny6IWldIckiw.fEP6Xj3dUQzdh8CuNdVStkFtNENpNObRKIYzwenacNY","account_id":"e9a58507-c50e-43bc-969b-f346bf1b3a95","last_refresh":"2026-03-07T14:13:53Z","email":"oc7f9af0f75b@dollicons.com","type":"codex","expired":"2026-03-17T14:13:53Z"}
|
||||
1
token_ocb763fcc08e_dollicons.com_1772893048.json
Normal file
1
token_ocb763fcc08e_dollicons.com_1772893048.json
Normal file
@@ -0,0 +1 @@
|
||||
{"id_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImIxZGQzZjhmLTlhYWQtNDdmZS1iMGU3LWVkYjAwOTc3N2Q2YiIsInR5cCI6IkpXVCJ9.eyJhdF9oYXNoIjoiSl9RWjVTOHptNmQyVEZnVEY5Rm01USIsImF1ZCI6WyJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIl0sImF1dGhfcHJvdmlkZXIiOiJwYXNzd29yZGxlc3MiLCJhdXRoX3RpbWUiOjE3NzI4OTMwMzgsImVtYWlsIjoib2NiNzYzZmNjMDhlQGRvbGxpY29ucy5jb20iLCJlbWFpbF92ZXJpZmllZCI6dHJ1ZSwiZXhwIjoxNzcyODk2NjQ3LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9hY2NvdW50X2lkIjoiZWQ4Y2Q2ZDEtY2Y5NS00YmUzLTliMDMtNTdlMzVjMjFkMTkyIiwiY2hhdGdwdF9wbGFuX3R5cGUiOiJmcmVlIiwiY2hhdGdwdF9zdWJzY3JpcHRpb25fYWN0aXZlX3N0YXJ0IjpudWxsLCJjaGF0Z3B0X3N1YnNjcmlwdGlvbl9hY3RpdmVfdW50aWwiOm51bGwsImNoYXRncHRfc3Vic2NyaXB0aW9uX2xhc3RfY2hlY2tlZCI6IjIwMjYtMDMtMDdUMTQ6MTc6MTguNDQ2MTkzKzAwOjAwIiwiY2hhdGdwdF91c2VyX2lkIjoidXNlci1wdTJHbFdud2NqRFNCY21mNGhoanhONG8iLCJncm91cHMiOltdLCJvcmdhbml6YXRpb25zIjpbeyJpZCI6Im9yZy01RUx2Rkt1YVo5ekVNUkZuTDMxaDJ4OWsiLCJpc19kZWZhdWx0Ijp0cnVlLCJyb2xlIjoib3duZXIiLCJ0aXRsZSI6IlBlcnNvbmFsIn1dLCJ1c2VyX2lkIjoidXNlci1wdTJHbFdud2NqRFNCY21mNGhoanhONG8ifSwiaWF0IjoxNzcyODkzMDQ3LCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6Ijg5MDM0N2I3LTA3YmMtNDBjMy1iZjUzLTBmMDk2MDRjNTU2NyIsInJhdCI6MTc3Mjg5MzAwNiwic2lkIjoiZjJkMzQyY2QtMTUyMy00ZTBlLThlYjktYjQ4ZTQwNTM4ZWM0Iiwic3ViIjoiYXV0aDB8MWdYVmt3UnhGeVNJZ2JhYU0yUktqZlRxIn0.fQG-kICKq6YorcnHypFwW7nlRGqfPx4qdb5pneLEnU2nxhXROphszkmNmZQnnAMgYjtOykHPm2qesQbGHu6aUBJovzeqT8SRhaPskM9mxjBx3lD94-_MDXJ_RuXZd_Lvyg7g1tnaRdgE3Ms3rjusxKSvwTGoFG0E1vT0F9o8TepZUvH7g8tPZ0BHWG0M5iw1VRqlIOkxFxDYH8zX2z4ag4i9zZ11hp17MhmotzRV5r26HSm9CSCVcnbHo3cDQABmSRE0xsVKYfyixKqmDUb2sYJQ-_4RZCBndIX98oig1Bm0kRB3hnw75Us1wQ-jpnELAdlS1grwy3S5rgta_5dCF0pTgDdwhewhanj1u0koM3w9EVH6PYVqNNXrVLK4tDjkmfM6FIRHdNJU75b4Hh2qyGURY-QYaJcbeyKUII4cY6IMiVQ57x9NpbjxnvL-cfzHB0liO3cNYD267FfSfJgWJx5IdsFuEGi5EeZ5EKL7_GxNpmuOnWOmEX0EEgydFcjPV_9EhowWNSfg89vFjA0lA2T_jMKEHvhk1IEaqJBPA31kMf-QrhTLJckOyGgRHzOZoKJt8yb5C3QPkYhtiS2AbhYiB9wzRCeOXWU6e1C1NBABp7FIivcX22PtKDSl_G2szHbWwhy70O8s7M44aWB_OywXT6Z-NfAQxgNHrS6r1aM","access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6IjE5MzQ0ZTY1LWJiYzktNDRkMS1hOWQwLWY5NTdiMDc5YmQwZSIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsiaHR0cHM6Ly9hcGkub3BlbmFpLmNvbS92MSJdLCJjbGllbnRfaWQiOiJhcHBfRU1vYW1FRVo3M2YwQ2tYYVhwN2hyYW5uIiwiZXhwIjoxNzczNzU3MDQ4LCJodHRwczovL2FwaS5vcGVuYWkuY29tL2F1dGgiOnsiY2hhdGdwdF9hY2NvdW50X2lkIjoiZWQ4Y2Q2ZDEtY2Y5NS00YmUzLTliMDMtNTdlMzVjMjFkMTkyIiwiY2hhdGdwdF9hY2NvdW50X3VzZXJfaWQiOiJ1c2VyLXB1MkdsV253Y2pEU0JjbWY0aGhqeE40b19fZWQ4Y2Q2ZDEtY2Y5NS00YmUzLTliMDMtNTdlMzVjMjFkMTkyIiwiY2hhdGdwdF9jb21wdXRlX3Jlc2lkZW5jeSI6Im5vX2NvbnN0cmFpbnQiLCJjaGF0Z3B0X3BsYW5fdHlwZSI6ImZyZWUiLCJjaGF0Z3B0X3VzZXJfaWQiOiJ1c2VyLXB1MkdsV253Y2pEU0JjbWY0aGhqeE40byIsInVzZXJfaWQiOiJ1c2VyLXB1MkdsV253Y2pEU0JjbWY0aGhqeE40byJ9LCJodHRwczovL2FwaS5vcGVuYWkuY29tL3Byb2ZpbGUiOnsiZW1haWwiOiJvY2I3NjNmY2MwOGVAZG9sbGljb25zLmNvbSIsImVtYWlsX3ZlcmlmaWVkIjp0cnVlfSwiaWF0IjoxNzcyODkzMDQ3LCJpc3MiOiJodHRwczovL2F1dGgub3BlbmFpLmNvbSIsImp0aSI6Ijc2NGI2NzViLTk4MDgtNDIzOS1iMWY4LTYwZTUzMzQ0OTU0ZSIsIm5iZiI6MTc3Mjg5MzA0NywicHdkX2F1dGhfdGltZSI6MTc3Mjg5MzAzODQ0Niwic2NwIjpbIm9wZW5pZCIsImVtYWlsIiwicHJvZmlsZSIsIm9mZmxpbmVfYWNjZXNzIl0sInNlc3Npb25faWQiOiJhdXRoc2Vzc19kdWhkOUJJTnNGZTJCclVsR1JMa0VwUFIiLCJzbCI6dHJ1ZSwic3ViIjoiYXV0aDB8MWdYVmt3UnhGeVNJZ2JhYU0yUktqZlRxIn0.wYzFOxoXY82L8I1CdFx9-b5ALglHjkcG045u0NGQtoKPuIWVAFFs_M221PgOhWYl3_w9Z-Y8OQ7fZq93gTN0r3W9P5XlGvpzCZYRaTueoNU7Ck4SJL8fq2z_2C7frQZlJVY6N_XQVM915k8U3WGzFQtBAGP5-s8dEoPMsPuenAPArntZQLVNpTzUXAN8XDccnYMMYmGDaYsy5wjlO3QCHRlrRGqud6sLItTPvvFC4vxPpoy7RqCWSsOFS3Zfa2ZlOLv13Fc2_KnVBcOFXwa4p0vSDGf75piRfp2fyFHDfmWRkbWRqcjjuFhNAcdy_VolRAJzSDu4X0q3k2B7ocKkyOJkwOXCxLMSGna6UcIZrlK8XxAxt8nBDSZo-6fKYwc25j6ZfuIG4TpQgvdwR497QXOwZjd7tUFiUE603-6XA3jvBQXE1Oeg-Ls3X_uApbyxRw_Zpns9QTS5H1Gt0HXv2YAJJ_g3rh8C_THCMO9DfaWC8lkSFDuQ-ZSpABTJocxFV0gnr_u_s-7BPvxSMWiJOkKe8h_DAQ38Ek9gxOE7SetJiHUnOYItersTKaOFKuUnHn7Gr_nIrH5Y0NtrHn_D8Un2caNyp63OkiC0vlvXrdZsIJQFbybK1d6V7nf3TE4yTk66lLYe1Ki8cM_KF1Hbh4tW7YNkVoSr_ZJlOeGd_WI","refresh_token":"rt_ulAshjjegNnU3cHsxcKBGd1TPt2tqH1X4nNRnmXbR5s.QiJKaY0Qxma1rqyLwH65njkhTbVT_mN0ite1QMqFIoI","account_id":"ed8cd6d1-cf95-4be3-9b03-57e35c21d192","last_refresh":"2026-03-07T14:17:28Z","email":"ocb763fcc08e@dollicons.com","type":"codex","expired":"2026-03-17T14:17:28Z"}
|
||||
Reference in New Issue
Block a user