| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 |
- # -*- coding: utf-8 -*-
- """
- realname_996.py —— 996盒子账号实名认证(防沉迷实名)
- ====================================================
- 官方实名通道(逆向自 newpc.996db.com 前端 webpack chunk 35/36/37/40/46/80,
- 与盒子内置实名表单完全一致):
- POST https://user-api.996hezi.com/v1/Identify/index
- headers: token(JWT) + X-BOX-AUTHORIZATION(BOXAPP-SHA256 签名)
- body: {"real_name": "<真实姓名>", "idcard": "<18位身份证号>"}
- 服务端做公安系统实名校验(姓名与身份证号必须真实匹配)。
- 认证成功后 auth_status 0→2,进游戏不再被 81111 拦截。
- 用法:
- .venv-mac/bin/python realname_996.py -u cqlongwu1988001 -p Longwu1988001 \
- --name "张三" --idcard "110101199001011237"
- # 只查状态不提交:
- .venv-mac/bin/python realname_996.py -u <账号> -p <密码> --check
- """
- import argparse
- import json
- import random
- import string
- import sys
- import time
- import requests as rq
- import urllib3
- urllib3.disable_warnings()
- HERE = __import__("os").path.dirname(__import__("os").path.abspath(__file__))
- sys.path.insert(0, HERE)
- sys.path.insert(0, __import__("os").path.join(HERE, "已经开发的部分代码", "chuanqi-main", "code", "GeekedTest"))
- from login_996pc import do_login, box_auth, box_headers # noqa: E402
- USER_API = "https://user-api.996hezi.com"
- IDENTIFY_PATH = "/v1/Identify/index"
- USERINFO_PATH = "/v1/UserInfo/getByRefresh"
- def call(session, token, method, path, body_obj=None):
- body = json.dumps(body_obj, separators=(",", ":")) if body_obj is not None else ""
- h = box_headers(token)
- if body_obj is not None:
- h["Content-Type"] = "application/json;charset=UTF-8"
- h["X-BOX-AUTHORIZATION"] = box_auth(method, path, body, token)
- r = session.request(method, USER_API + path,
- data=body.encode() if body else None,
- headers=h, timeout=25, verify=False)
- try:
- return r.json()
- except Exception:
- return {"code": r.status_code, "msg": r.text[:150]}
- def get_auth_status(session, token):
- j = call(session, token, "POST", USERINFO_PATH, {})
- info = ((j.get("data") or {}).get("userinfo")) or {}
- return info.get("auth_status"), info.get("real_name"), info.get("idcard")
- def validate_idcard(idcard: str) -> str | None:
- """18位身份证校验码验证(GB 11643-1999),提交前本地拦截格式错误。"""
- if len(idcard) != 18:
- return "身份证号必须是18位"
- weights = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
- codes = "10X98765432"
- try:
- total = sum(int(idcard[i]) * weights[i] for i in range(17))
- except ValueError:
- return "身份证前17位必须为数字"
- if idcard[17].upper() != codes[total % 11]:
- return "身份证校验码不符合GB11643规则(请核对号码)"
- return None
- def main():
- ap = argparse.ArgumentParser(description="996盒子账号实名认证")
- ap.add_argument("-u", "--user", required=True, help="996盒子账号")
- ap.add_argument("-p", "--password", required=True, help="密码")
- ap.add_argument("--name", help="真实姓名(身份证上的姓名)")
- ap.add_argument("--idcard", help="18位身份证号")
- ap.add_argument("--check", action="store_true", help="只查询实名状态,不提交")
- args = ap.parse_args()
- s = rq.Session()
- print(f"[*] 登录账号: {args.user}")
- j, _ = do_login(s, args.user, args.password)
- if j.get("code") != 200 or not (j.get("data") or {}).get("token"):
- raise SystemExit(f"[!] 登录失败: code={j.get('code')} msg={j.get('msg')}")
- token = j["data"]["token"]
- info = j["data"].get("userInfo") or {}
- print(f"[✓] 登录成功 uid={info.get('id')} 昵称={info.get('nick_name')}")
- status, real_name, idcard = get_auth_status(s, token)
- print(f"[*] 当前实名状态: auth_status={status}"
- f"({'未实名' if status == 0 else '已实名' if status == 2 else status})"
- f"{' real_name=' + real_name if real_name else ''}")
- if args.check:
- return
- if status == 2:
- print("[✓] 该账号已实名,无需重复认证")
- return
- if not args.name or not args.idcard:
- raise SystemExit("[!] 需要 --name <真实姓名> --idcard <18位身份证号>")
- err = validate_idcard(args.idcard)
- if err:
- raise SystemExit(f"[!] {err}")
- print(f"[*] 提交实名: {args.name} / {args.idcard[:6]}********{args.idcard[-4:]}")
- r = call(s, token, "POST", IDENTIFY_PATH,
- {"real_name": args.name, "idcard": args.idcard})
- code = r.get("code")
- if code == 200:
- print("[✓] 实名认证提交成功!")
- else:
- raise SystemExit(f"[!] 实名失败: code={code} msg={r.get('msg')}")
- # 回查确认
- time.sleep(1)
- status, real_name, _ = get_auth_status(s, token)
- print(f"[*] 复核: auth_status={status} real_name={real_name}")
- if status == 2:
- print("[✓] 认证生效,进游戏 81111 拦截已解除")
- if __name__ == "__main__":
- main()
|