📦 Ekyc Suite — AI身份核验
v1.0.3一站式金融级eKYC能力集:8项生物识别与证件核验API,支持人脸比对、活体检测、OCR证件识别、银行卡识别等,AI代理可直接调用腾讯云接口完成远程开户、实名认证等场景。
详细分析 ▾
运行时依赖
版本
ekyc-suite 1.0.3 - 更新 _meta.json 中的元数据。 - 核心功能、接口与文档无变动。 - 仅因元数据调整而升级版本。
安装命令
点击复制技能文档
金融级电子身份核验工具包,涵盖人脸比对、活体检测、证件 OCR、媒体标签等 8 项能力。 所有输入仅限图像或视频文件。
快速参考
| 能力 | 命令 | |
|---|---|---|
| 人脸比对 | python scripts/ekyc_api.py face_compare --photo1 --photo2 | |
| 照片活体 | python scripts/ekyc_api.py photo_liveness_detect --file | |
| 视频活体 | python scripts/ekyc_api.py video_liveness_detect --file | |
| 身份证 OCR | python scripts/ekyc_api.py id_card_ocr --image | 1> |
| 银行卡 OCR | python scripts/ekyc_api.py bank_card_ocr --image | |
| 驾驶证 OCR | python scripts/ekyc_api.py driver_license_ocr --image | |
| 行驶证 OCR | python scripts/ekyc_api.py vehicle_license_ocr --image | 2> |
| 媒体标签 | python scripts/ekyc_api.py media_labeling --file --labels "A14,B03" --type image |
外部端点
| 端点 | 能力 | 传输数据 |
|---|---|---|
https://kyc1.qcloud.com | 2、3、4、5(活体、证件 OCR) | Base64 图像/视频 + 签名请求 |
https://miniprogram-kyc.tencentcloudapi.com | 1、6、7(人脸比对、驾照/行驶证 OCR) | Base64 图像 + 签名请求 |
https://kyc2.qcloud.com | 8(媒体标签) | Base64 图像/视频 + 签名请求 |
安全与隐私
本软件不存储、缓存或保留任何提交数据。 API 核验结果仅供参考,不构成法律意义上的身份确认。 不得将本软件作为产生法律效果或重大影响的自动化决策唯一依据。 高风险身份决策应补充业务逻辑与人工审核。
信任声明
安装并使用本 skill 后,你提供的图像与视频数据将被发往腾讯云身份核验 API 处理。 仅在你信任上游服务商数据处理实践的前提下安装。 本 skill 不独立存储、处理或保留任何生物识别数据。
目标
接收用户上传的图像或视频,调用对应身份核验 API,将结构化结果用通俗语言解释给用户。
何时使用
当用户请求涉及以下场景时调用本 Skill:
- “Compare these two photos — same person?” / “face similarity score”
- “Is this photo AI-generated?” / “Is this video real?” / “deepfake detection”
- “Read this ID card” / “Read bank card number” / “Read driver's license” / “Read vehicle license”
- “Check for mask” / “Detect coercion” / “Wearing hat?” / “On the phone?”
- “Unconscious or asleep?” / “Wearing sunglasses?” / “Inside a car?”
- “In a hotel room?” / “Has tattoo?” / “Multiple people?” / “Wearing headphones?”
- “Facial sheet mask?” / “Critical patient?” / “At a car dealership?”
- 任何包含 “face comparison”、“liveness detection”、“OCR”、“media labeling”、“ekyc” 的请求
请勿使用
- 用户仅询问 “what is KYC” 或 “how does eKYC work” → 直接以知识回答
- 用户以文本提供姓名、证件号、手机号 → 拒绝并引导(见下方隐私规则)
- 用户要求“活体检测+身份验证”组合(需传输姓名+证件号)→ 说明隐私限制
关键规则
规则 1:隐私 —— 绝不接受个人文本
绝不接受或传输姓名、证件号、手机号等个人文本数据。 若用户提供,回复:“为保护隐私,本服务不接受文本形式的姓名、证件号等敏感信息。AI 对话传输存在泄露风险,请直接上传图像或视频文件,我将通过图像识别完成核验。”
规则 2:绝不重写签名代码
始终使用scripts/ 下的 Python 脚本。签名算法使用 SHA1(40 位大写十六进制)。
过往 AI 模型曾误用 SHA256(64 位)导致 100% 认证失败。脚本含断言:assert len(signature) == 40。
若签名长度为 64,说明误用 SHA256,立即改用脚本。规则 3:双路径解析返回
API 返回可能在顶层或嵌套在result 对象内,必须同时检查:
value = data.get("field") or (data.get("result", {}) or {}).get("field")
跳过将导致 None / undefined 错误。环境变量
# 能力 1-7(人脸比对、活体、证件 OCR) KYC_APPID=your_kyc_appid KYC_SECRET=your_kyc_secret
# 能力 8(媒体标签,独立密钥) LABEL_APPID=your_label_appid LABEL_SECRET=your_label_secret
获取密钥:
- 密钥 A(KYC)与密钥 B(LABEL):联系慧眼技术支持(微信:blue-201809)
- 或在 腾讯云人脸核身控制台 注册获取密钥 A
⚠️ 重要:使用测试密钥(免费 100 次),切勿使用生产密钥,否则将产生上游计费。
部分配置支持: 仅密钥 A 可启用能力 1-7;仅密钥 B 可启用能力 8。 若用户请求未配置的能力,请明确告知缺失的密钥及获取方式。
8 项能力
能力 1:人脸比对
- 触发:“compare these two photos”、“same person?”、“face similarity”
- 用户需提供:两张含人脸照片
- 仅上传一张:请提示“请再上传第二张照片用于比对”
- 执行:
python scripts/ekyc_api.py face_compare --photo1 --photo2 - 返回:similarity(0–100 分)
- 结果解释:
- 回复示例:
能力 2:照片活体检测
- 触发:“is this photo real?”、“AI-generated?”、“photoshopped?”
- 用户需提供:一张含人脸照片
- 执行:
python scripts/ekyc_api.py photo_liveness_detect --file - 返回:riskLevel(风险等级)、riskTag(风险标签编号)
- 结果解释:
- 回复示例:
能力 3:视频活体检测
- 触发:“is this video real?”、“deepfake?”、“video liveness”
- 用户需提供:含人脸视频(≤20 MB;超过 20 秒将报错)
- 视频过大:提示“视频需 ≤20 MB,请压缩后重新上传”
- 执行:
python scripts/ekyc_api.py video_liveness_detect --file - 网络重试:上传可能遇 999999 网络错误,脚本自动指数退避重试 3 次,仍失败则告知“网络繁忙,请稍后再试”
- 返回与解释:同能力 2
- 回复示例:
能力 4:身份证 OCR
- 触发:“read ID card”、“extract ID card info”
- 用户需提供:身份证照片 + 正反面标记
0 = 人像面(正面,含照片)
- 1 = 国徽面(背面,含签发机关与有效期)
- 未指定面:询问“这是人像面(正面带照片)还是国徽面(背面带国徽)?”
- 执行:
python scripts/ekyc_api.py id_card_ocr --image --side <0|1> - 返回:
- 结果解释:将字段整理为清晰列表
- 回复示例(人像面):
- 回复示例(国徽面):
能力 5:银行卡 OCR
- 触发:“read bank card”、“card number”、“bank card OCR”
- 用户需提供:银行卡正面照片
- 执行:
python scripts/ekyc_api.py bank_card_ocr --image - 返回:bankcardNo(卡号)、bankcardValidDate(有效期)
- 结果解释:展示卡号与有效期;若有效期为空,说明卡面未印刷
- 回复示例:
能力 6:驾驶证 OCR
- 触发:“read driver's license”、“driver license info”
- 用户需提供:驾驶证照片
- ⚠️ 仅支持主页:若上传副页,API 返回错误 -9005,回复:
- 执行:
python scripts/ekyc_api.py driver_license_ocr --image - 返回:licenseNo、name、sex、nationality、address、birth、fetchDate、driveClass、validDateFrom、validDateTo
- 结果解释:整理为清晰列表,突出准驾车型与有效期
- 回复示例:
能力 7:行驶证 OCR
- 触发:“read vehicle license”、“vehicle info”
- 用户需提供:行驶证照片 + 页面标记
1 = 主页(车辆基本信息)
- 2 = 副页(核定载客、检验记录等)
- 未指定:询问“这是主页还是副页?”
- 执行:
python scripts/ekyc_api.py vehicle_license_ocr --image --side <1|2> - 返回:
- 结果解释:主页突出车牌与 VIN;副页突出核定载客与检验记录
- 回复示例:
能力 8:媒体标签
- 触发:“check for mask”、“detect coercion”、“wearing hat?”、“on the phone?”、“inside a car?”、“multiple people?”、“tattoo?”、“hotel room?”、“media labeling”
- 用户需提供:图像或视频 + 属性描述(你根据描述自动映射标签代码)
- 标签对照表(根据用户描述自动选取):
人像标签:检测用户状态与风险
环境标签:检测业务场景
代码 标签 描述 场景 A10 Unconscious/asleep 闭眼或强行睁眼 安全监控、风险预警 A09 Under coercion 检测到被胁迫姿势 反欺诈、安全告警 A15 Critical patient 危重病人 骗贷防控、合规 A11 On the phone 正在打电话 通话场景、第三方指导 A04 Wearing headphones 佩戴耳机 通话场景、第三方指导 A05 Nudity 身体敏感部位暴露 合规审核 A13 Tattoo 检测到纹身 特征标记、风险分析 A02 Mask covering face 医用口罩遮挡面部 身份检测、合规 A14 Wearing hat 检测到帽子 遮挡检测、伪装 A01 Facial sheet mask 敷片状面膜 护肤或遮挡检测 A06 Wearing sunglasses 检测到太阳镜 遮挡检测、合规 代码 标签 描述 场景 B02 Multiple people 画面中出现多人 群体场景、第三方指导 B03 Inside passenger vehicle 乘用车(轿车、SUV 等)内 车贷、出行、合规 B06 In hotel 酒店房间内 场景审核、风控 B07 At car dealership 汽车 4S 店内 消费金融、合规
- 每次最多 5 个标签代码
- 执行:
python scripts/ekyc_api.py media_labeling --file --labels "A02,A14" --type image
image 为照片,video 为视频
- 异步流程:API 为 2 步异步(提交→等待→查询),脚本已自动处理,通常 5–10 秒返回
- 返回:fileLabel(标签结果数组)、liveStatus(活体状态)、compareStatus(人脸比对状态)
- 结果解释:
1=检出,0=未检出,空=识别异常(建议重试)
- liveStatus:1=活体,0=非活体
- compareStatus:1=人脸比对通过,0=比对不通过
- 回复示例:
媒体标签结果:
- A14(佩戴帽子):✅ 检出
- A02(口罩遮挡):❌ 未检出
活体状态:活体
完整示例
正向:用户请求人脸比对
用户:“Are these two photos the same person?” + [上传 Photo A] + [上传 Photo B] 你的动作:- 确认收到两张照片
- 执行
python scripts/ekyc_api.py face_compare --photo1 PhotoA --photo2 PhotoB - 收到:
{"success": true, "similarity": "95.7", "orderNo": "ekyc..."} - 回复:
负向:用户提供个人文本
用户:“Verify Li Ming, ID number 440305199206200013, against this photo” + [上传照片] 你的动作:- 检测到提供姓名与证件号 → 触发隐私规则
- 不执行任何 API
- 回复:
完成定义
每次 API 调用后,确保满足:
- [ ] API 返回 code=0(成功)
- [ ] 原始数据已转换为通俗易懂的自然语言
- [ ] 包含结果解释(不仅是数字,而是含义)
- [ ] 若出错(code≠0),已用通俗语言告知原因及建议
- [ ] 对话中未暴露 API 密钥、orderNo 等技术细节(除非用户追问)
错误处理
出错时,用通俗语言说明并给出建议:
通用错误码(所有能力)
| 错误码 | 面向用户的提示 |
|---|---|
| 1101 / 1102 | “认证失败——API 密钥可能配置错误,请检查 .env 文件。” |
| 1103 | “当前 IP 未在白名单,请联系管理员。” |
| 1106 | “请求格式无效,请检查请求结构。” |
| 1107 | “请求参数有误,请确认必填字段。” |
| 1502 | “版本参数无效,请使用 1.0.0。” |
| 1503 | “文件校验失败,请重新上传。” |
| 1505 | “无权限访问,请检查 appid 授权。” |
| 1506 / 1507 | “请求过于频繁,请等待 10 秒后重试。” |
| 1601 | “请求体过大,请减小文件体积。” |
| 1602 | “请求体参数错误,请检查格式。” |
| 999999 / 999998 / 999997 | “网络繁忙,正在自动重试…(3 次均失败请稍后再试)” |
人脸与活体错误码(能力 1–3)
| 错误码 | 面向用户的提示 |
|---|---|
| 66660016 | “图像/视频文件异常,请重拍或换文件。” |
| 66660023 / 66660048 | “未检测到合格人脸,请正对摄像头并确保清晰。” |
| 66660037 | “照片出现多张人脸,请使用单人照片。” |
| 66660041 | “面部被遮挡或闭眼,请换清晰照片重试。” |
| 66660078 | “未检测到人脸,请确保照片光线充足、正面。” |
| 1603 | “视频文件无效,请检查格式。” |
| 1606 | “响应解密失败,请重试。” |
| 1607 | “未找到结果,订单可能已过期。” |
| FailedOperation.CoveredFace | “面部被遮挡,请提供无遮挡照片。” |
| FailedOperation.IncompleteFace | “面部不完整,请提供完整面部照片。” |
| FailedOperation.PoorImageQuality | “图像质量太差,请检查照片。” |
| FailedOperation.ImageDecodeFailed | “图像解码失败,文件可能损坏。” |
| FailedOperation.VideoDecodeFailed | “视频解码失败,请检查格式。” |
| FailedOperation.VideoDurationExceeded | “视频过长,仅支持 20 秒内,请裁剪后重传。” |
| FailedOperation.DetectEngineSystemError | “检测引擎错误,请重试。” |
| FailedOperation.UnKnown | “内部错误,请重试或联系技术支持。” |
OCR 错误码(能力 4–7)
| 错误码 | 面向用户的提示 |
|---|---|
| -1102 | “图像解码失败,文件可能损坏,请重拍或换图。” |
| -1300 | “图像为空,请上传有效图片。” |
| -1301 | “缺少必填参数,请检查请求。” |
| -1304 | “参数值过长,请检查长度限制。” |
| -9001 | “请求类型无效,请检查 side/type 参数。” |
| -9002 | “OCR 识别失败,可能照片不够清晰,请在光线充足处重拍。” |
| -9005 | “图像无效或不支持。驾驶证仅支持主页(正面)。” |
| -9006 | “图像预处理失败,请换照片重试。” |
| 66661001 | “非身份证或图像不清晰,请确认证件类型并确保完整清晰。” |
| 66661013 / 66661005 | “请调整角度,确保证件完整清晰。” |
媒体标签错误码(能力 8)
| 错误码 | 面向用户的提示 |
|---|---|
| 66660000 | “订单号无效,请检查 orderNo。” |
| 66660001 | “appId 无效,请验证密钥。” |
| 66660002 | “请求已过期,请重新生成签名。” |
| 66660003 | “试用额度已用完,请升级套餐或联系商务。” |
| 66660004 | “并发超限,请稍后再试。” |
| 66660013 | “请求参数无效,请检查格式。” |
| 66660016 | “图像/视频文件异常,请重拍或换文件。” |
| 66661014 | “未找到标签结果,订单可能过期,请重新提交。” |
| 66661015 | “标签识别仍在处理中,请稍候…(脚本自动重试)” |
| 66661016 | “单次标签数超限(最多 5 个),请减少后重试。” |
| 66661018 | “部分标签代码不存在或尚未开放。” |
| 66661019 | “未提供标签,请至少指定一个标签代码。” |
| 66661020 | “标签代码格式错误,请使用 A01、B03 这类格式。” |
| 66661021 | “您的 appId 未开通本服务,请联系技术支持。” |
| 66661022 | “媒体标签处理失败,请重新提交。” |
| 66661023 | “图像预检失败,请确保图像符合质量要求。” |
| 1104 | “认证签名过期或无效,正在自动刷新,请重试。” |
| 400101 | “缺少必填参数,请检查请求格式。” |
| 400103 | “参数值无效,请核对标签代码与输入格式。” |
| 400105 | “appid 与密钥集不匹配,请检查 Key A / Key B 配置。” |
| 400106 | “签名验证失败,请确认使用正确的密钥集。” |
| 400501 | “文件上传失败,请检查文件后重试。” |
| 400502 | “文件格式不支持,请使用 JPG、PNG 或 MP4。” |
| 400505 | “文件处理超时,请换小文件重试。” |
| 400506 | “文件内容为空或损坏,请重新上传。” |
| 400601 | “服务暂时不可用,请稍后再试。” |
| 400602 | “服务配额已用完,请联系商务提升额度。” |
认证架构
能力 1–7(KYC 认证)——3 步
Step 1: GET access_token ← app_id + secret
Step 2: GET SIGN ticket ← app_id + access_token
Step 3: Signature = sort([appId, orderNo, nonce, "1.0.0", ticket]) → concat → SHA1 → 40 位大写
实现:scripts/kyc_auth.py —— 勿重写,直接调用
能力 8(标签认证)——2 步
Step 1: GET ticket 直接 ← appId + secret(无需 access_token)
Step 2: Signature = sort([appId, orderNo, nonce, "1.0.0", ticket, unixTimeStamp]) → concat → SHA1 → 40 位大写
区别:6 个参数(增加 unixTimeStamp),ticket 直接获取。
实现:scripts/label_auth.py —— 勿重写,直接调用*
法律声明
本软件不存储、缓存或保留任何提交数据。 API 核验结果仅供参考,不构成法律意义上的身份确认。 不得将本软件作为产生法律效果或重大影响的自动化决策唯一依据。 高风险身份决策应补充业务逻辑与人工审核。