| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- import json
- import requests
- import os
- import time
- # --- 配置部分 ---
- # 服务器地址 (根据你的实际情况修改)
- SERVER_URL = "http://45.137.220.138:8888"
- # API 端点
- API_ENDPOINT = f"{SERVER_URL}/api/account/add"
- # 本地账号文件路径
- ACCOUNT_FILE = "registered_accounts.json"
- def post_account(pool_name, username, password, extra_data):
- """发送单个账号数据到服务器"""
- payload = {
- "pool_name": pool_name,
- "username": username,
- "password": password,
- "extra_data": extra_data
- }
- headers = {
- "authorization": "Bearer tok_e1696f7d20f14e0f9a0b30e116aab396"
- }
- try:
- response = requests.post(API_ENDPOINT, headers=headers, json=payload, timeout=5)
- if response.status_code == 200:
- res_json = response.json()
- print(f"✅ [{pool_name}] {username} -> {res_json.get('message', 'Success')}")
- return True
- else:
- print(f"❌ [{pool_name}] {username} -> 上传失败 (HTTP {response.status_code}): {response.text}")
- return False
- except Exception as e:
- print(f"❌ [{pool_name}] {username} -> 异常: {e}")
- return False
- def process_dict_format(data):
- """处理旧格式: {'pool_name': [accounts...]}"""
- print("📋 检测到格式: 字典 (Pool -> List)")
- count = 0
- for pool_name, accounts in data.items():
- for acc in accounts:
- username = acc.get("username")
- password = acc.get("password")
- # 把 ID 放入 extra_data
- extra = {"original_id": acc.get("id"), "source": "dict_upload"}
-
- if username and pool_name:
- if post_account(pool_name, username, password, extra):
- count += 1
- return count
- def process_list_format(data):
- """处理新格式: [{'pool_name': '...', ...}, ...]"""
- print("📋 检测到格式: 列表 (Flat List)")
- count = 0
- for acc in data:
- # 1. 提取核心字段
- pool_name = acc.get("pool_name")
- username = acc.get("username")
- password = acc.get("password")
-
- # 2. 提取剩余字段作为 extra_data (country_code, phone 等)
- # 我们把除了上面三个字段以外的所有字段都塞进 extra_data
- exclude_keys = {"pool_name", "username", "password"}
- extra = {k: v for k, v in acc.items() if k not in exclude_keys}
-
- # 标记来源
- extra["source"] = "list_upload"
- if not pool_name:
- print(f"⚠️ 跳过数据: 缺少 pool_name -> {acc}")
- continue
-
- if not username:
- print(f"⚠️ 跳过数据: 缺少 username -> {acc}")
- continue
- if post_account(pool_name, username, password, extra):
- count += 1
- return count
- def main():
- if not os.path.exists(ACCOUNT_FILE):
- print(f"[错误] 找不到文件: {ACCOUNT_FILE}")
- return
- try:
- with open(ACCOUNT_FILE, 'r', encoding='utf-8') as f:
- data = json.load(f)
- except json.JSONDecodeError:
- print(f"[错误] JSON 格式无效")
- return
- success_count = 0
-
- # 智能识别结构
- if isinstance(data, dict):
- success_count = process_dict_format(data)
- elif isinstance(data, list):
- success_count = process_list_format(data)
- else:
- print("❌ 未知的 JSON 结构,必须是对象或数组")
- print("\n" + "="*30)
- print(f"📊 任务完成,成功上传: {success_count} 个")
- print("="*30)
- if __name__ == "__main__":
- main()
|