Files
AutoDoneTeam/docs/CHANGELOG.md
dela d146ad9ebd feat: 添加完整的 Telegram Bot 和欧洲账单生成功能
主要更新:
-  新增 Telegram Bot 交互界面
-  新增欧洲账单自动生成功能
- 📦 整理项目结构,部署文件移至 deployment/ 目录
- 📝 完善文档,新增 CHANGELOG 和 Bot 部署指南
- 🔧 统一使用 pyproject.toml 管理依赖(支持 uv)
- 🛡️  增强 .gitignore,防止敏感配置泄露

新增文件:
- tg_bot.py: Telegram Bot 主程序
- generate_billing.py: 独立账单生成工具
- modules/billing.py: 欧洲账单生成模块
- deployment/: Docker、systemd 等部署配置
- docs/: 完整的文档和更新日志

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-11 09:59:13 +08:00

6.8 KiB
Raw Permalink Blame History

修改总结:完成 Access Token 自动获取

问题原因

之前的代码在邮箱验证后直接调用 _step5_get_access_token(),但缺少了关键的 OAuth 回调步骤,导致 __Secure-next-auth.session-token cookie 没有生成,所以 /api/auth/session 接口返回空的 accessToken。

解决方案

通过抓包分析手动注册流程,发现完整流程如下:

完整流程

  1. Step 1-3: 初始化 → Sentinel → 注册账号(已有)

  2. Step 4: 邮箱 OTP 验证(已有)

  3. Step 4.5: 提交个人信息 新增

    • POST /api/accounts/create_account
    • Payload: {"name": "随机姓名", "birthdate": "1990-01-01"}
    • 返回: OAuth callback URLconsent_verifier 参数)
  4. Step 4.6: 完成 OAuth 回调流程 新增

    • GET OAuth URL → 302 to /api/accounts/consent
    • GET /api/accounts/consent → 302 to chatgpt.com/api/auth/callback/openai
    • GET chatgpt.com/api/auth/callback/openai生成 __Secure-next-auth.session-token
  5. Step 5: 获取 access token已有现在能正常工作

    • GET https://chatgpt.com/api/auth/session
    • 依赖 __Secure-next-auth.session-token cookie
    • 返回: {"accessToken": "..."}
  6. Step 6: 生成欧洲账单 URL已有

    • POST https://chatgpt.com/backend-api/payments/checkout
    • 使用 access token
    • 返回: Stripe checkout URL

代码修改

1. 新增方法 - _step4_5_submit_personal_info() (lines 688-774)

def _step4_5_submit_personal_info(self) -> Dict:
    """Step 4.5: 提交个人信息(姓名、生日)完成账号设置"""

    url = "https://auth.openai.com/api/accounts/create_account"

    # 生成随机姓名和生日
    random_name = ''.join(random.choices(string.ascii_lowercase, k=8))
    year = random.randint(1980, 2000)
    month = random.randint(1, 12)
    day = random.randint(1, 28)
    birthdate = f"{year}-{month:02d}-{day:02d}"

    payload = {
        "name": random_name,
        "birthdate": birthdate
    }

    # 发送请求并返回 OAuth URL
    resp = self.http_client.session.post(url, json=payload, ...)
    data = resp.json()

    return {
        'success': True,
        'oauth_url': data.get('continue_url'),
        'method': data.get('method', 'GET')
    }

2. 新增方法 - _step4_6_complete_oauth_flow() (lines 776-829)

def _step4_6_complete_oauth_flow(self, oauth_url: str):
    """Step 4.6: 完成 OAuth 回调流程,获取 session-token

    自动跟随重定向链:
    1. GET oauth_url → 302 to /api/accounts/consent
    2. GET /api/accounts/consent → 302 to chatgpt.com/api/auth/callback/openai
    3. GET chatgpt.com/api/auth/callback/openai → 生成 session-token
    """

    # 自动跟随所有重定向
    resp = self.http_client.session.get(
        oauth_url,
        headers=headers,
        allow_redirects=True,  # 关键:自动跟随重定向
        timeout=30
    )

    # 检查是否获取到 session-token
    session_token = None
    for cookie in self.http_client.session.cookies:
        if cookie.name == '__Secure-next-auth.session-token':
            session_token = cookie.value
            break

    if session_token:
        print(f"✅ [4.6] OAuth flow completed")
        return True
    else:
        raise Exception("OAuth flow completed but no session-token cookie was set")

3. 修改主流程 - register() (lines 897-920)

修改前:

if verify_result.get('success'):
    if DEBUG:
        print(f"\n✅ Registration completed successfully!")
    return {
        'success': True,
        'verified': True,
        'email': email,
        'data': verify_result.get('data')
    }

修改后:

if verify_result.get('success'):
    # Step 4.5: 提交个人信息
    personal_info_result = self._step4_5_submit_personal_info()

    if personal_info_result.get('success'):
        oauth_url = personal_info_result['oauth_url']

        # Step 4.6: 完成 OAuth 回调流程,获取 session-token
        self._step4_6_complete_oauth_flow(oauth_url)

        if DEBUG:
            print(f"\n✅ Registration completed successfully!")

        return {
            'success': True,
            'verified': True,
            'email': email,
            'data': verify_result.get('data')
        }

测试

运行测试脚本:

python test_full_flow.py

期望输出:

======================================================================
测试完整流程:注册 → 验证 → access token → 账单 URL
======================================================================

📋 Generated password: A5x@9Kp...

🔄 Starting registration...
✅ [1.1] Visited ChatGPT (200)
✅ [1.2] CSRF token extracted
...
✅ [4.4] Email verified successfully!
✅ [4.5] Personal info submitted
   Name: xjkwfabc
   Birthdate: 1995-07-15
✅ [4.6] OAuth flow completed
   Got session-token: eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0...

✅ Registration successful!
   Email: abc123@gnd.de5.net
   Password: A5x@9Kp...

🔄 Retrieving access token...
✅ [5] Access token retrieved
   Token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik1...

🔄 Generating EU billing checkout URL...
✅ [Billing] Checkout URL generated
   URL: https://chatgpt.com/checkout/...

======================================================================
✅ COMPLETE SUCCESS!
======================================================================
Email: abc123@gnd.de5.net
Password: A5x@9Kp...
Access Token: eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ik1...
Checkout URL: https://chatgpt.com/checkout/openai_europe/cs_test_...
======================================================================

使用 auto_register.py

原有的批量注册脚本已经支持 --eu-billing 参数:

# 注册 1 个账号(不生成账单)
python auto_register.py

# 注册 10 个账号并生成账单 URL
python auto_register.py --count 10 --eu-billing

# 指定密码并保存到自定义文件
python auto_register.py -c 5 -p mypassword --eu-billing -o my_accounts.json

输出的 JSON 格式:

[
  {
    "email": "abc123@gnd.de5.net",
    "password": "A5x@9Kp...",
    "verified": true,
    "checkout_url": "https://chatgpt.com/checkout/openai_europe/cs_test_..."
  }
]

关键技术点

  1. 自动重定向跟随: 使用 allow_redirects=True 让 requests.Session 自动处理跨域重定向
  2. Cookie 自动管理: requests.Session 会自动保存和发送所有域名的 cookies
  3. 随机个人信息: 自动生成合法的姓名和生日1980-2000年
  4. Datadog tracing headers: 模拟真实浏览器的追踪头

文件清单