Files
AutoDoneTeam/reference/autoteam.py
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

121 lines
3.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import requests
import json
import random
from dataclasses import dataclass
from typing import Any
def generate_device_id():
return f"{random_hex(8)}-{random_hex(4)}-{random_hex(4)}-{random_hex(4)}-{random_hex(12)}"
def random_hex(length):
return ''.join(random.choices('0123456789abcdef', k=length))
@dataclass(frozen=True)
class CheckoutResult:
ok: bool
checkout_url: str | None = None
error: str | None = None
raw: Any | None = None
def create_eu_billing_with_browser_sim(access_token: str, *, timeout: int = 30) -> CheckoutResult:
"""模拟浏览器请求生成欧洲账单,返回 CheckoutResult。"""
device_id = generate_device_id()
headers = {
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:146.0) Gecko/20100101 Firefox/146.0',
'Accept': '*/*',
'Accept-Language': 'en-US,en;q=0.5',
'Accept-Encoding': 'gzip, deflate, br',
'Referer': 'https://chatgpt.com/',
'OAI-Language': 'en-US',
'OAI-Device-Id': device_id,
'OAI-Client-Version': 'prod-04eaaa443c69cfc8b46b5d52d2b61dbceba21862',
'OAI-Client-Build-Number': '4053703',
'Authorization': f'Bearer {access_token}',
'Content-Type': 'application/json',
'Origin': 'https://chatgpt.com',
'Connection': 'keep-alive',
'Sec-Fetch-Dest': 'empty',
'Sec-Fetch-Mode': 'cors',
'Sec-Fetch-Site': 'same-origin',
'Priority': 'u=4',
'TE': 'trailers'
}
payload = {
"plan_name": "chatgptteamplan",
"team_plan_data": {
"workspace_name": "Sepa",
"price_interval": "month",
"seat_quantity": 5
},
"billing_details": {
"country": "DE",
"currency": "EUR"
},
"promo_campaign": {
"promo_campaign_id": "team-1-month-free",
"is_coupon_from_query_param": False
},
"checkout_ui_mode": "redirect"
}
url = "https://chatgpt.com/backend-api/payments/checkout"
try:
response = requests.post(
url,
headers=headers,
json=payload,
timeout=timeout,
allow_redirects=False
)
try:
result = response.json()
except json.JSONDecodeError:
return CheckoutResult(
ok=False,
error=f"响应不是 JSONHTTP {response.status_code}",
raw=response.text,
)
checkout_url = result.get('url')
checkout_session_id = result.get('checkout_session_id')
processor_entity = result.get('processor_entity')
# 如果 url 为空,手动构造
if not checkout_url and checkout_session_id:
entity = processor_entity if processor_entity else "openai_llc"
checkout_url = f"https://chatgpt.com/checkout/{entity}/{checkout_session_id}"
if checkout_url:
return CheckoutResult(ok=True, checkout_url=checkout_url, raw=result)
detail = result.get('detail', result)
return CheckoutResult(ok=False, error=str(detail), raw=result)
except requests.RequestException as e:
return CheckoutResult(ok=False, error=str(e))
if __name__ == "__main__":
print("=" * 70)
print("欧洲账单生成器")
print("=" * 70)
access_token = input("\n输入 Access Token: ").strip()
if not access_token:
print("[!] Access Token 不能为空!")
exit(1)
print("\n[*] 正在生成...\n")
result = create_eu_billing_with_browser_sim(access_token)
if result.ok and result.checkout_url:
print(f"\n[✓] Checkout URL:")
print(f" {result.checkout_url}\n")
else:
print(f"\n[!] 失败: {result.error}\n")