upload_accounts.py 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. import json
  2. import requests
  3. import os
  4. import time
  5. # --- 配置部分 ---
  6. # 服务器地址 (根据你的实际情况修改)
  7. SERVER_URL = "http://45.137.220.138:8888"
  8. # API 端点
  9. API_ENDPOINT = f"{SERVER_URL}/api/account/add"
  10. # 本地账号文件路径
  11. ACCOUNT_FILE = "registered_accounts.json"
  12. def post_account(pool_name, username, password, extra_data):
  13. """发送单个账号数据到服务器"""
  14. payload = {
  15. "pool_name": pool_name,
  16. "username": username,
  17. "password": password,
  18. "extra_data": extra_data
  19. }
  20. headers = {
  21. "authorization": "Bearer tok_e1696f7d20f14e0f9a0b30e116aab396"
  22. }
  23. try:
  24. response = requests.post(API_ENDPOINT, headers=headers, json=payload, timeout=5)
  25. if response.status_code == 200:
  26. res_json = response.json()
  27. print(f"✅ [{pool_name}] {username} -> {res_json.get('message', 'Success')}")
  28. return True
  29. else:
  30. print(f"❌ [{pool_name}] {username} -> 上传失败 (HTTP {response.status_code}): {response.text}")
  31. return False
  32. except Exception as e:
  33. print(f"❌ [{pool_name}] {username} -> 异常: {e}")
  34. return False
  35. def process_dict_format(data):
  36. """处理旧格式: {'pool_name': [accounts...]}"""
  37. print("📋 检测到格式: 字典 (Pool -> List)")
  38. count = 0
  39. for pool_name, accounts in data.items():
  40. for acc in accounts:
  41. username = acc.get("username")
  42. password = acc.get("password")
  43. # 把 ID 放入 extra_data
  44. extra = {"original_id": acc.get("id"), "source": "dict_upload"}
  45. if username and pool_name:
  46. if post_account(pool_name, username, password, extra):
  47. count += 1
  48. return count
  49. def process_list_format(data):
  50. """处理新格式: [{'pool_name': '...', ...}, ...]"""
  51. print("📋 检测到格式: 列表 (Flat List)")
  52. count = 0
  53. for acc in data:
  54. # 1. 提取核心字段
  55. pool_name = acc.get("pool_name")
  56. username = acc.get("username")
  57. password = acc.get("password")
  58. # 2. 提取剩余字段作为 extra_data (country_code, phone 等)
  59. # 我们把除了上面三个字段以外的所有字段都塞进 extra_data
  60. exclude_keys = {"pool_name", "username", "password"}
  61. extra = {k: v for k, v in acc.items() if k not in exclude_keys}
  62. # 标记来源
  63. extra["source"] = "list_upload"
  64. if not pool_name:
  65. print(f"⚠️ 跳过数据: 缺少 pool_name -> {acc}")
  66. continue
  67. if not username:
  68. print(f"⚠️ 跳过数据: 缺少 username -> {acc}")
  69. continue
  70. if post_account(pool_name, username, password, extra):
  71. count += 1
  72. return count
  73. def main():
  74. if not os.path.exists(ACCOUNT_FILE):
  75. print(f"[错误] 找不到文件: {ACCOUNT_FILE}")
  76. return
  77. try:
  78. with open(ACCOUNT_FILE, 'r', encoding='utf-8') as f:
  79. data = json.load(f)
  80. except json.JSONDecodeError:
  81. print(f"[错误] JSON 格式无效")
  82. return
  83. success_count = 0
  84. # 智能识别结构
  85. if isinstance(data, dict):
  86. success_count = process_dict_format(data)
  87. elif isinstance(data, list):
  88. success_count = process_list_format(data)
  89. else:
  90. print("❌ 未知的 JSON 结构,必须是对象或数组")
  91. print("\n" + "="*30)
  92. print(f"📊 任务完成,成功上传: {success_count} 个")
  93. print("="*30)
  94. if __name__ == "__main__":
  95. main()