KeyHunter parser v10 + 18 scanners + tests (synthetic fixtures only, no keys/db/tokens)
This commit is contained in:
45
pat_check.py
Normal file
45
pat_check.py
Normal file
@@ -0,0 +1,45 @@
|
||||
"""Validate PAT pool: GET /user with each token, keep 200s."""
|
||||
import os
|
||||
KF_BASE = os.path.dirname(os.path.abspath(__file__))
|
||||
import sys
|
||||
from concurrent.futures import ThreadPoolExecutor, as_completed
|
||||
|
||||
import requests
|
||||
|
||||
SRC = os.path.join(KF_BASE, "gh_tokens.txt")
|
||||
OUT = os.path.join(KF_BASE, "gh_tokens_valid.txt")
|
||||
|
||||
|
||||
def check(tok):
|
||||
try:
|
||||
r = requests.get("https://api.github.com/user",
|
||||
headers={"Authorization": f"Bearer {tok}",
|
||||
"User-Agent": "keyfarm"},
|
||||
timeout=15)
|
||||
return tok, r.status_code == 200
|
||||
except Exception:
|
||||
return tok, False
|
||||
|
||||
|
||||
def main():
|
||||
toks = [l.strip() for l in open(SRC, encoding="utf-8")
|
||||
if l.strip().startswith("ghp_")]
|
||||
print(f"checking {len(toks)} PATs...", flush=True)
|
||||
alive = []
|
||||
with ThreadPoolExecutor(max_workers=40) as ex:
|
||||
futs = [ex.submit(check, t) for t in toks]
|
||||
for i, fut in enumerate(as_completed(futs), 1):
|
||||
tok, ok = fut.result()
|
||||
if ok:
|
||||
alive.append(tok)
|
||||
if i % 200 == 0:
|
||||
print(f" {i}/{len(toks)} checked, alive={len(alive)}",
|
||||
flush=True)
|
||||
with open(OUT, "w", encoding="utf-8") as f:
|
||||
for t in sorted(alive):
|
||||
f.write(t + "\n")
|
||||
print(f"DONE: {len(alive)}/{len(toks)} alive -> {OUT}", flush=True)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
sys.exit(main())
|
||||
Reference in New Issue
Block a user