universal-autoreg: initial public release (restored, redacted, hardened)
This commit is contained in:
151
providers/miarouter_farm.py
Normal file
151
providers/miarouter_farm.py
Normal file
@@ -0,0 +1,151 @@
|
||||
|
||||
"""miarouter mass autoreg — pool builder. Free turnstile via local sidecar :8877."""
|
||||
import json, time, secrets, string, urllib.request, urllib.parse, urllib.error, os, sys
|
||||
|
||||
BASE = "https://miarouter.online"
|
||||
SITEKEY = "0x4AAAAAAEj69NaErmbKI26M"
|
||||
SIDE = "http://127.0.0.1:8879/solve"
|
||||
AFF = "IDH1"
|
||||
POOL = r"C:/Users/User/Desktop/farm/miarouter/accounts.jsonl"
|
||||
STATE = r"C:/Users/User/Desktop/farm/miarouter/farm_state.json"
|
||||
UA = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36"
|
||||
PROXY_FILE = r"C:/Users/User/tmp/mia_proxies.json"
|
||||
PROXIES = json.load(open(PROXY_FILE)) + ["DIRECT"] if os.path.exists(PROXY_FILE) else ["DIRECT"]
|
||||
import random
|
||||
random.shuffle(PROXIES)
|
||||
_cur_p = {"i": 0, "proxy": PROXIES[0]}
|
||||
|
||||
def next_proxy():
|
||||
_cur_p["i"] = (_cur_p["i"] + 1) % len(PROXIES)
|
||||
_cur_p["proxy"] = PROXIES[_cur_p["i"]]
|
||||
return _cur_p["proxy"]
|
||||
|
||||
def cur_proxy():
|
||||
return _cur_p["proxy"]
|
||||
|
||||
os.makedirs(os.path.dirname(POOL), exist_ok=True)
|
||||
|
||||
def log(*a):
|
||||
print(time.strftime("%H:%M:%S"), *a, flush=True)
|
||||
|
||||
def solve(url_page="/sign-up"):
|
||||
for _try in range(3):
|
||||
try:
|
||||
p = {"type":"turnstile","url":BASE+url_page,"sitekey":SITEKEY,"real_page":True}
|
||||
req = urllib.request.Request(SIDE, data=json.dumps(p).encode(), headers={"Content-Type":"application/json"})
|
||||
r = json.loads(urllib.request.urlopen(req, timeout=280).read())
|
||||
tok = r.get("token") or ""
|
||||
if tok:
|
||||
return tok
|
||||
except Exception as e:
|
||||
log("solve retry:", str(e)[:50])
|
||||
time.sleep(8)
|
||||
return ""
|
||||
|
||||
def http(method, path, body=None, jwt=None, raw_body=None, proxy=None):
|
||||
url = BASE + path
|
||||
data = None
|
||||
headers = {"User-Agent":UA, "Origin":BASE, "Referer":BASE+"/sign-up", "Accept":"application/json"}
|
||||
if body is not None:
|
||||
data = json.dumps(body).encode(); headers["Content-Type"]="application/json"
|
||||
if raw_body is not None:
|
||||
data = raw_body; headers["Content-Type"]="application/json"
|
||||
if jwt: headers["Authorization"] = "Bearer "+jwt
|
||||
if proxy is None: proxy = cur_proxy()
|
||||
ph = urllib.request.ProxyHandler({} if proxy == "DIRECT" else {"http":proxy,"https":proxy})
|
||||
opener = urllib.request.build_opener(ph)
|
||||
req = urllib.request.Request(url, data=data, method=method, headers=headers)
|
||||
try:
|
||||
r = opener.open(req, timeout=12)
|
||||
return r.status, r.read().decode()
|
||||
except urllib.error.HTTPError as e:
|
||||
try: return e.code, e.read().decode()
|
||||
except: return e.code, ""
|
||||
except Exception:
|
||||
return 0, "proxy_dead"
|
||||
|
||||
def gen_creds():
|
||||
alpha = string.ascii_lowercase + string.digits
|
||||
u = "refox" + "".join(secrets.choice(alpha) for _ in range(6))
|
||||
p = "".join(secrets.choice(string.ascii_letters + string.digits) for _ in range(13)) + "Aa1"
|
||||
return u, p
|
||||
|
||||
def make_account(idx):
|
||||
u, p = gen_creds()
|
||||
proxy = next_proxy() # sticky per account
|
||||
log(idx, "proxy", proxy)
|
||||
# 1. register
|
||||
for attempt in range(3):
|
||||
tok = solve("/sign-up")
|
||||
if not tok: log(idx, "solve fail, retry"); time.sleep(5); continue
|
||||
st, resp = http("POST", f"/api/user/register?turnstile={urllib.parse.quote(tok)}",
|
||||
body={"username":u,"password":p,"aff_code":AFF,"turnstile":tok,"agreement_confirmed":True}, proxy=proxy)
|
||||
try: j = json.loads(resp)
|
||||
except: j = {"success":False,"message":resp[:100]}
|
||||
if st == 200 and j.get("success"): break
|
||||
msg = j.get("message","")
|
||||
if st == 0 or resp == "proxy_dead":
|
||||
proxy = next_proxy(); log(idx, "proxy dead, rotate ->", proxy); continue
|
||||
if st == 429 or "rate" in msg.lower():
|
||||
proxy = next_proxy(); log(idx, "429 register, rotate ->", proxy); time.sleep(2); continue
|
||||
if "already" in msg.lower() or "exist" in msg.lower():
|
||||
u, p = gen_creds(); continue
|
||||
log(idx, "reg fail:", st, msg[:120]); time.sleep(5)
|
||||
else:
|
||||
return None
|
||||
log(idx, "REG OK", u)
|
||||
# 2. login
|
||||
jwt = None
|
||||
for attempt in range(4):
|
||||
tok2 = solve("/sign-in")
|
||||
if not tok2: time.sleep(5); continue
|
||||
st, resp = http("POST", f"/api/user/login?turnstile={urllib.parse.quote(tok2)}",
|
||||
body={"username":u,"password":p,"turnstile":tok2}, proxy=proxy)
|
||||
try: j = json.loads(resp)
|
||||
except: j = {}
|
||||
if st == 200 and j.get("success"):
|
||||
jwt = j["data"]["access_token"]; break
|
||||
if st == 0 or resp == "proxy_dead":
|
||||
proxy = next_proxy(); log(idx, "proxy dead, rotate ->", proxy); continue
|
||||
if st == 429:
|
||||
proxy = next_proxy(); log(idx, "429 login, rotate ->", proxy); time.sleep(2); continue
|
||||
log(idx, "login fail:", st, str(j)[:120]); time.sleep(10)
|
||||
if not jwt:
|
||||
rec = {"username":u,"password":p,"aff":AFF,"status":"reg_ok_login_fail","ts":int(time.time())}
|
||||
open(POOL,"a",encoding="utf-8").write(json.dumps(rec)+"\n")
|
||||
return rec
|
||||
# 3. create token + reveal key
|
||||
key = None; tid = None
|
||||
st, resp = http("POST", "/api/token/", jwt=jwt, body={"name":"main","remain_quota":500000,"expired_time":-1,"unlimited_quota":True,"model_limits":"","allowed_ips":""})
|
||||
if st == 200:
|
||||
st2, resp2 = http("GET", "/api/token/?p=0&size=10", jwt=jwt)
|
||||
try:
|
||||
items = json.loads(resp2)["data"]["items"]
|
||||
if items:
|
||||
tid = items[0]["id"]
|
||||
st3, resp3 = http("POST", f"/api/token/{tid}/key", jwt=jwt, raw_body=b"{}")
|
||||
if st3 == 200:
|
||||
key = json.loads(resp3)["data"]["key"]
|
||||
except Exception as e:
|
||||
log(idx, "key err", e)
|
||||
rec = {"username":u,"password":p,"aff":AFF,"jwt":jwt,"token_id":tid,"api_key":("sk-"+key) if key and not key.startswith("sk-") else key,"status":"full","ts":int(time.time())}
|
||||
open(POOL,"a",encoding="utf-8").write(json.dumps(rec)+"\n")
|
||||
log(idx, "FULL OK", u, "key:", (key or "NONE")[:14]+"...")
|
||||
json.dump({"last_idx":idx,"last_user":u,"ts":int(time.time())}, open(STATE,"w"))
|
||||
return rec
|
||||
|
||||
def main():
|
||||
target = int(sys.argv[1]) if len(sys.argv)>1 else 50
|
||||
ok = 0
|
||||
for i in range(target):
|
||||
try:
|
||||
r = make_account(i)
|
||||
if r and r.get("status")=="full": ok += 1
|
||||
except Exception as e:
|
||||
log(i, "FATAL", repr(e)[:200])
|
||||
time.sleep(20)
|
||||
time.sleep(3)
|
||||
log("DONE. full accounts:", ok)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user