KeyHunter parser v10 + 18 scanners + tests (synthetic fixtures only, no keys/db/tokens)

This commit is contained in:
2026-10-20 07:50:07 +00:00
commit a5008d837b
178 changed files with 36909 additions and 0 deletions

83
sync_keys_live.py Normal file
View File

@@ -0,0 +1,83 @@
"""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()