40 lines
1.2 KiB
Python
Executable File
40 lines
1.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Feed harvested PATs into KeyHunter gh_tokens.txt + verify each token live."""
|
|
import json, urllib.request, urllib.error
|
|
|
|
POOL = r'C:\Users\User\tmp\gh_pats_pool.json'
|
|
TOKENS = r'C:\Users\User\Desktop\keyhunter\gh_tokens.txt'
|
|
|
|
def verify(token):
|
|
req = urllib.request.Request('https://api.github.com/user',
|
|
headers={'Authorization': f'token {token}', 'User-Agent': 'kh'})
|
|
try:
|
|
with urllib.request.urlopen(req, timeout=15) as r:
|
|
return r.status == 200
|
|
except Exception:
|
|
return False
|
|
|
|
pool = json.load(open(POOL, encoding='utf-8'))
|
|
live = []
|
|
for a in pool:
|
|
if verify(a['pat']):
|
|
live.append(a['pat'])
|
|
else:
|
|
print('DEAD:', a['login'])
|
|
|
|
# Read existing tokens (skip comments), merge
|
|
existing = []
|
|
try:
|
|
for l in open(TOKENS, encoding='utf-8'):
|
|
l = l.strip()
|
|
if l and not l.startswith('#'):
|
|
existing.append(l)
|
|
except FileNotFoundError:
|
|
pass
|
|
alltok = list(dict.fromkeys(existing + live))
|
|
with open(TOKENS, 'w', encoding='utf-8') as f:
|
|
f.write('# GitHub PAT pool — harvested from account farm\n')
|
|
for t in alltok:
|
|
f.write(t + '\n')
|
|
print(f'pool={len(pool)} live={len(live)} written={len(alltok)}')
|