yt-flow / key_tester.py
Arshit Malik
remove dead free.v36.cm, seed pool from alistaitsacle README
580a4a8
Raw
History Blame Contribute Delete
10.1 kB
"""Key Tester – yt-keys Space. Scrapes, classifies, verifies keys."""
import json, os, re, sys, time, threading, urllib.request, urllib.error, ssl, random, math
from pathlib import Path
HF_TOKEN = os.environ.get("HF_TOKEN", "")
DATASET_REPO = os.environ.get("OPENCLAW_DATASET_REPO", "arshitmalik/yt-pipeline-data")
POOL_KEY = "verified_keys.json"
TESTER_SPACE = "arshitmalik/yt-keys"
PROVIDER_PRIORITY = ["anthropic", "openai", "google", "mistral", "xai", "others"]
LOG_FILE = Path("/app/tester.log")
def log(msg):
line = f"[{time.strftime('%H:%M:%S')}] {msg}"
print(line)
try:
with open(LOG_FILE, "a") as f:
f.write(line + "\n")
except Exception:
pass
ctx = ssl.create_default_context()
ctx.check_hostname = False; ctx.verify_mode = ssl.CERT_NONE
def fetch(url, timeout=25, headers=None):
if headers is None: headers = {"User-Agent": "Mozilla/5.0"}
try:
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req, timeout=timeout, context=ctx) as r:
return r.read().decode("utf-8", errors="replace")
except Exception: return None
def shannon_entropy(s):
if not s: return 0
prob = [float(s.count(c))/len(s) for c in set(s)]
return -sum(p*math.log2(p) for p in prob)
PLACEHOLDER_RE = re.compile(r'sk-0+$|sk-a+$|sk-x+$|qwerty|xxxx|placeholder|your.key|example|sample|sk-[A-Za-z0-9]{0,10}$', re.I)
def is_likely_real(key):
if len(key) < 20 or len(key) > 200: return False
if not re.match(r'^(sk-|AIza|fk|hf_|xai-|ghp_)', key): return False
if PLACEHOLDER_RE.search(key): return False
if key.count(key[0]) > len(key)*0.7: return False
if shannon_entropy(key) < 3.5: return False
return True
def extract_keys(text):
found = set()
for pat in [r'(sk-[A-Za-z0-9]{48,})', r'(sk-or-v1-[A-Za-z0-9]{48,})', r'(sk-ant-api[0-9]{2}-[A-Za-z0-9\-_]{60,})', r'(AIza[0-9A-Za-z\-_]{35})', r'(xai-[A-Za-z0-9]{20,})', r'(fk[A-Za-z0-9]{48,})', r'(hf_[A-Za-z0-9]{30,})']:
for m in re.finditer(pat, text):
k = m.group(1)
if is_likely_real(k): found.add(k)
return found
def guess_provider(key):
k = key.lower()
if k.startswith("sk-ant-api"): return "anthropic"
if k.startswith("aiza"): return "google"
if k.startswith("xai-"): return "xai"
if k.startswith("hf_"): return "others"
if k.startswith("sk-or-v1"): return "others"
if k.startswith("sk-") or k.startswith("fk"): return "openai"
return "others"
README_SRCS = [f"https://raw.githubusercontent.com/alistaitsacle/free-llm-api-keys/main/README{ext}.md" for ext in ["", "_CN", "_JA", "_KO"]]
OTHER_REPOS = ["chatanywhere/GPT_API_free", "Poghappy/gpt_api_free", "popjane/free_chatgpt_api", "onlywyl/free_chatgpt_api", "dan1471/FREE-openai-api-keys", "racalado/free-openai-api-keys", "CyYxl2024/freeai", "qwq202/One-FAS-API", "vibheksoni/free-ai", "Mr-Abood/GPTFree", "BuluBulugege/Free-BAI", "thesecondchance/freeflow-llm", "tashfeenahmed/freellmapi", "mufeng510/Free-ChatGPT-API", "ling-drag0n/api-pool", "fengqiaozhu/openrouter-free-pool", "mahdi-marjani/free-llm-api", "realasfngl/ChatGPT", "Butakov-Andrey/freegpt", "elphen-wang/FreeAI", "devashish2024/freegpt"]
FREE_TIER_LISTS = ["https://raw.githubusercontent.com/cheahjs/free-llm-api-resources/main/README.md", "https://raw.githubusercontent.com/mnfst/awesome-free-llm-apis/main/README.md"]
WEBSITES = ["https://alistaitsacle.github.io/free-llm-api-keys/", "https://freetheai.xyz", "https://free.gpt.ge", "https://freeapi.geekgpt.site", "https://aipipe.org"]
GIST_KW = ["sk-or-v1-", "sk-ant-api", "AIzaSy", "xai-", "sk-proj-"]
def search_gists(kw, max_r=5):
ids = []
html = fetch(f"https://gist.github.com/search?q={urllib.request.quote(kw)}", timeout=20)
if html:
for m in re.finditer(r'href="/[^/]+/([a-f0-9]{20,})"', html):
if m.group(1) not in ids: ids.append(m.group(1))
if len(ids) >= max_r: break
return ids
def fetch_gist(gid):
raw = fetch(f"https://api.github.com/gists/{gid}", headers={"User-Agent": "KeyTester/1.0", "Accept": "application/vnd.github+json"})
if raw:
try:
data = json.loads(raw)
return "\n".join(finfo.get("content", "") or "" for finfo in data.get("files", {}).values())
except: pass
return None
PROXY_BASE = "https://aiapiv2.pekpik.com/v1"
VERIFY_ENDPOINTS = {
"anthropic": ("https://api.anthropic.com/v1/models", {"x-api-key": "{key}", "anthropic-version": "2023-06-01"}),
"openai": (f"{PROXY_BASE}/models", {"Authorization": "Bearer {key}"}),
"google": ("https://generativelanguage.googleapis.com/v1beta/models?key={key}", {}),
"mistral": ("https://api.mistral.ai/v1/models", {"Authorization": "Bearer {key}"}),
"xai": ("https://api.x.ai/v1/models", {"Authorization": "Bearer {key}"}),
"others": (f"{PROXY_BASE}/models", {"Authorization": "Bearer {key}"}),
}
def test_key(key, provider):
url_t, headers_t = VERIFY_ENDPOINTS.get(provider, VERIFY_ENDPOINTS["others"])
url = url_t.replace("{key}", key)
headers = {k: v.replace("{key}", key) for k, v in headers_t.items()}
try:
req = urllib.request.Request(url, headers=headers)
with urllib.request.urlopen(req, timeout=10, context=ctx) as r: return r.status == 200
except urllib.error.HTTPError as e: return e.code == 429
except Exception: return None
def classify_keys(candidates):
results = []
for key in candidates[:10]:
ok = test_key(key, guess_provider(key))
if ok:
classifier_key = key
break
else:
return [(k, "MEDIUM", guess_provider(k)) for k in candidates]
for line in candidates[:100]:
payload = json.dumps({
"model": "gpt-5.4",
"messages": [
{"role": "system", "content": "Analyze this variable for API keys. Output JSON: {\"confidence\":\"NONE\"|\"LOW\"|\"MEDIUM\"|\"HIGH\",\"provider\":\"openai\"|\"anthropic\"|\"google\"|\"mistral\"|\"xai\"|\"others\"}. Placeholders like sk-xxxxx are NONE. Real keys are MEDIUM/HIGH."},
{"role": "user", "content": f"{line}"}
],
"temperature": 0, "max_tokens": 200
}).encode()
try:
req = urllib.request.Request(f"{PROXY_BASE}/chat/completions", data=payload, headers={"Content-Type": "application/json", "Authorization": f"Bearer {classifier_key}"})
with urllib.request.urlopen(req, timeout=15, context=ctx) as r:
resp = json.loads(r.read().decode())
content = resp["choices"][0]["message"]["content"]
try:
parsed = json.loads(content)
conf = parsed.get("confidence", "NONE")
prov = parsed.get("provider", "others")
if conf in ("MEDIUM", "HIGH"): results.append((line, conf, prov))
except: pass
except Exception: break
time.sleep(1)
return results
def scrape_all():
all_keys = set()
for url in README_SRCS:
t = fetch(url)
if t:
keys = extract_keys(t)
log(f" alistaitsacle: {len(keys)} keys")
all_keys.update(keys)
for repo in OTHER_REPOS:
t = fetch(f"https://raw.githubusercontent.com/{repo}/main/README.md")
if t:
keys = extract_keys(t)
if keys: log(f" {repo}: {len(keys)} keys")
all_keys.update(keys)
for url in FREE_TIER_LISTS:
t = fetch(url)
if t:
keys = extract_keys(t)
if keys: log(f" free-tier: {len(keys)} keys")
all_keys.update(keys)
for url in WEBSITES:
t = fetch(url)
if t:
keys = extract_keys(t)
if keys: log(f" {url}: {len(keys)} keys")
all_keys.update(keys)
for kw in random.sample(GIST_KW, min(3, len(GIST_KW))):
gids = search_gists(kw, 3)
for gid in gids:
t = fetch_gist(gid)
if t:
keys = extract_keys(t)
all_keys.update(keys)
time.sleep(2)
return list(all_keys)
def main():
log("Scraping all sources...")
candidates = scrape_all()
log(f"{len(candidates)} candidate keys after extraction")
log("Classifying with LLM...")
classified = classify_keys(candidates)
log(f"{len(classified)} keys classified as MEDIUM/HIGH")
pool = {p: [] for p in PROVIDER_PRIORITY}
rate_limited = set()
for key, conf, prov in (classified if classified else [(k, "MEDIUM", guess_provider(k)) for k in candidates]):
if prov not in pool: prov = "others"
if len(pool[prov]) >= 20: continue
if prov in rate_limited: continue
ok = test_key(key, prov)
if ok is True:
pool[prov].append(key)
log(f" VERIFIED [{prov}]: {key[:14]}...")
elif ok is None:
rate_limited.add(prov)
log(f" RATE_LIMITED [{prov}]")
else:
log(f" INVALID [{prov}]: {key[:14]}...")
time.sleep(1.5)
if len(rate_limited) >= len([p for p in PROVIDER_PRIORITY if pool.get(p)]):
log("All providers rate-limited. Factory rebooting self...")
try:
from huggingface_hub import HfApi
HfApi(token=HF_TOKEN).restart_space(TESTER_SPACE, factory_reboot=True)
except Exception as e:
log(f"Reboot failed: {e}")
return
total = sum(len(v) for v in pool.values())
log(f"Uploading {total} verified keys to dataset...")
try:
from huggingface_hub import HfApi
api = HfApi(token=HF_TOKEN)
api.upload_file(
path_or_fileobj=json.dumps(pool, indent=2).encode(),
path_in_repo=POOL_KEY, repo_id=DATASET_REPO, repo_type="dataset")
log("Pool uploaded successfully.")
except Exception as e:
log(f"Upload failed: {e}")
log("Done. Sleeping.")
while True: time.sleep(3600)
if __name__ == "__main__":
main()