83 lines
3.1 KiB
Python
83 lines
3.1 KiB
Python
"""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() |