特种设备及特种作业人员证件查询平台
一句话定位
把"姓名 + 身份证号"丢进来,自动对接两个国家官方平台实时核验证件真伪,并吐出一张一页纸 PDF 报告。别人安装本技能后即可复用,无需任何手工翻网站。
核验范围
| 平台 | 主管部门 | 覆盖证件 |
|---|---|---|
| 国家安全生产考试 | 应急管理部 / 省级应急厅 | 电工作业、焊接与热切割、高处作业、制冷与空调、危化品安全作业、金属冶炼作业等特种作业操作证 |
| 全国特种设备公示信息查询 | 市场监管总局 / 省级市场监管部门 | 叉车司机(N1)、起重机械(Q)、电梯(T)、锅炉司炉(G1/G2)、锅炉水处理(G3)、压力容器(R)、特种设备安全管理(A)等 |
> 两平台独立发证,同一人可能只持一类也可能同时持两类,必须双平台都查。
触发场景
- 用户给出"姓名 + 身份证号"或仅"身份证号",要求核验证件真伪 / 有效期 / 可从事作业类别。
- 要求查询某个具体项目(如"有没有 G1 工业锅炉司炉证")。
- 要求出具一页纸证件核验 PDF 报告。
两种运行模式(二选一)
模式 A:在 WorkBuddy 内由 AI 直接执行(推荐)
AI 按下方"平台接口流程"用 curl + Read 工具完成验证码识别与查询,再调用 references/report_template.py 生成 PDF。无需用户装任何依赖。
模式 B:独立 Python 脚本(给非 WorkBuddy 用户 / 批量用)
# 1. 安装依赖(Python 3.8+)
pip install requests pillow numpy reportlab
# 2. 运行(姓名 可省略;省略时先用 CNSE 反查姓名再查 EM)
python scripts/cert_query.py 张月方 429006198412192119 --out 报告.pdf
python scripts/cert_query.py 429006198412192119 # 仅身份证号,自动反查姓名
# EM 字符验证码在脚本模式需人工输入:
# 脚本会保存放大图到 cert_query_captcha.png 并打印路径,
# 用 --emcode ABCD 传入识别结果;不传则交互式等待输入。
python scripts/cert_query.py 雷鸣 T420821199312150054 --emcode 7K9P
CNSE 滑块验证码由脚本用 NCC 模板匹配全自动破解,EM 字符验证码需人工看一眼(AI 模式由 AI 用 Read 识别)。
核心原则(务必遵守,漏查会出事)
- EM 必须 name + idcardNum 同时传入;若用户只给身份证号,先调 CNSE 详情接口反查姓名;CNSE 也无记录则向用户索要姓名再查 EM。
- CNSE 必须双接口联查:首页
remotePubQuery.json每次只回 1 条,会漏证;必须用详情接口getPerInfoBySfzh.json取licList全部证书。 - 证件状态以官方平台实时返回为准,截图 / 口头说法不可作为结论依据。
- 隐私授权:仅用于内部合规核验;报告须注明"仅供内部核验参考"。
平台一:应急管理部 — 特种作业操作证
- 取验证码:
GET https://cx.mem.gov.cn/prod-api/certsearch/code
- 响应:{ img(base64), uuid, captchaOnOff }。解码img为 JPG,PIL 做 3× 等比放大 存 PNG 后用 Read 工具肉眼识别(原图 160×60 细长,直接读难辨)。 - 查询:
GET https://cx.mem.gov.cn/prod-api/certsearch/certInfo/netQuery
- 参数(GET):name(URL 编码)、idcardTypeCode=01、idcardNum、personTypeCode=03、code(验证码)、uuid。 - 解析
data数组(可能多本,如高压+低压):
-certStatus=1→ 有效;5→ 历史 / 失效。
- 字段:certNum(常形如 T+身份证号)、jobTypeName(作业类别)、operItemName(操作项目)、issueOrgName(签发机关)、firstCertDate(初领)、validBeginDate/validEndDate(有效期)。
- 同一人可持多本电工作业证,证书编号相同,用档案号 / 初领日期区分。
平台二:市场监管总局 — 特种设备作业人员证
⚠️ 双接口联查(关键,漏查会出事)
- 首页单条
remotePubQuery.json:按keyword=身份证号查询,仅返回 1 条——即使该人持 G1/G3/A 多本,也只回第一条。绝不可据此判定"只有 1 本"。 - 详情全部
getPerInfoBySfzh.json:进入perResult详情页后 AJAX 调用,返回licList数组(全部证书)。核验完整性必经步骤。
滑块验证码处理(NCC 模板匹配,不要用 xWidth 直接当 moveLength)
- 访问首页
https://cnse.e-cqs.cn/info-pub/pub建 session(存 cookie)。 - 取滑块:
GET /info-pub/pub/pubQueryVCodeData.json→ 响应含smallImage(拼图块)、bigImage(底图)、xWidth(轨道宽)、yHeight。 - 计算 moveLength(见
references/verify_helper.py的solve_slider):
- 用归一化互相关(NCC)将smallImage在bigImage上滑动匹配,取最佳x坐标作为moveLength。
- 切勿把xWidth直接当moveLength提交;只有洞口恰好在最右才会"蒙对",洞口变化即失败。 - 提交验证:
POST /info-pub/pub/checkPubQuerycode.json,bodymoveLength=<x>→ 期望{ errcode:0 }。 - 查询:
- 单条:GET /info-pub/pub/remotePubQuery.json?keyword=<身份证号>&moveLength=<x>
- 全部:GET /info-pub/pub/perResult?sfzh=<身份证号>&moveLength=<x>→ 从返回 HTML 取<input id="validCode" value="...">,再调:
GET /info-pub/pub/getPerInfoBySfzh.json?sfzh=<身份证号>&validCode=<validCode>&r=<timestamp毫秒>→ 解析licList[]。 - 字段映射(licList 元素):
-ryxm(姓名)、sfzh(身份证号)、czxm(操作项目)、itemCode(项目代码 G1/G3/GSY/A)、fzjg(发证机关)、pzrq(批准日期)、yxrqz(有效期至)、validFlag(1=有效)。
特种设备作业项目代码对照(常用)
| 代码 | 含义 |
|---|---|
| G1 | 工业锅炉司炉 |
| G2 | 电站锅炉司炉 |
| G3 / GSY | 锅炉水处理 |
| N1 | 叉车司机(场车) |
| Q1 | 起重机械指挥 |
| Q2 | 起重机械司机 |
| T | 电梯维修 |
| R1/R2 | 压力容器作业 |
| A | 特种设备安全管理(安全管理人员,非现场操作证) |
输出
- 向用户明确两平台各自结论(真实有效 / 未查询到记录)。
- 列出全部有效证书及准操范围;指出"不得从事"的未持证项目。
- 生成一页纸 A4 纵向 PDF 报告(调用
references/report_template.py的build_report())。
注意事项
- EM 验证码为字符验证码(PIL 3× 放大后读);CNSE 为滑块(NCC 算 x)。
- 仅身份证号查 EM 行不通时,先用 CNSE 反查姓名;CNSE 也无记录则需用户补姓名。
- 报告须注明"仅供内部核验参考,最终以官方平台记录为准"。
- 涉及超法定退休年龄等合规风险,应在报告中以 EHS 提示标注。
参考文件
references/api_endpoints.md:完整 API 端点、参数、响应字段。references/verify_helper.py:滑块 NCC 匹配 + EM 验证码解码工具函数。references/report_template.py:一页纸 PDF 报告生成模板。scripts/cert_query.py:端到端独立运行脚本(CNSE 全自动 + EM 需输验证码)。