"""sync_keys_live.py — авто-синхронизатор: keys.db WORKING → rotator + one-api Одним запуском: читает все WORKING DashScope-ключи из мастер-базы, добавляет в dashscope_keys.json (ротатор) и one-api каналы. Дубликаты пропускает по точному совпадению ключа. Usage: python sync_keys_live.py """ import json, time, sqlite3 DB = r"C:\Users\User\Desktop\keyhunter\data\keys.db" ROTATOR = r"C:\Users\User\.omp\agent\dashscope_keys.json" ONEAPI = r"C:\Users\User\tmp\gw-run\one-api.db" BASE_URL = "https://dashscope.aliyuncs.com/compatible-mode" def load_live_keys(): """Все WORKING DashScope-ключи из мастер-базы.""" conn = sqlite3.connect(DB) rows = conn.execute(""" SELECT id, hash, prov, val, plan FROM keys WHERE prov IN ('DASHSCOPE','gh_blitz','gh_expanded','gitlab_public') AND status='WORKING' ORDER BY id """).fetchall() conn.close() return rows def sync_rotator(live_keys): """Добавить недостающие ключи в dashscope_keys.json.""" data = json.loads(open(ROTATOR).read()) existing = set(data.get("keys", [])) added = [] for row in live_keys: k = row[3] # val if k not in existing: data["keys"].append(k) existing.add(k) added.append(k) if added: data["synced_at"] = time.strftime("%Y-%m-%dT%H:%M:%SZ") json.dump(data, open(ROTATOR, "w"), indent=2, ensure_ascii=False) return added def sync_oneapi(live_keys): """Добавить недостающие ключи как каналы в one-api.""" conn = sqlite3.connect(ONEAPI) existing = set(row[0] for row in conn.execute( "SELECT key FROM channels WHERE type=1 AND base_url LIKE '%dashscope%'")) ts = int(time.time()) added = [] for row in live_keys: k = row[3] if k in existing: continue name = f"dashscope-sync-{row[0]}" # по id из keys.db conn.execute(""" INSERT INTO channels (type, key, status, name, weight, created_time, test_time, response_time, base_url, other, balance, balance_updated_time, models, "group", used_quota, priority, auto_ban, other_info) VALUES (1, ?, 1, ?, 0, ?, 0, 0, ?, '', 0, 0, '', 'default', 0, 0, 1, '') """, (k, name, ts, BASE_URL)) added.append((name, k)) conn.commit() conn.close() return added def main(): live = load_live_keys() print(f"WORKING DashScope keys in DB: {len(live)}") for r in live: print(f" id={r[0]} hash={r[1]} prov={r[2]} plan={r[4]}") rot_added = sync_rotator(live) api_added = sync_oneapi(live) print(f"\n→ Rotator: +{len(rot_added)} keys (total: {len(json.loads(open(ROTATOR).read())['keys'])})") for k in rot_added: print(f" + {k[:40]}...") print(f"→ One-API: +{len(api_added)} channels") for name, k in api_added: print(f" + {name} {k[:30]}...") print("Done.") if __name__ == "__main__": main()