Install
openclaw skills install @alanqin888/yaojian-copyright-skill爻鉴版权保护与数据存证工具。当用户提到版权、确权、DCI、版权申请、版权登记、版权保护、数字版权、著作权、存证、微链存证、区块链存证、数据存证、哈希上链、防篡改、证据固化、证据保全、电子存证、侵权取证、版权证书、帮我存证、存证证书等关键词时触发本技能。
openclaw skills install @alanqin888/yaojian-copyright-skillstorage 为 true 或 falsegenerate_cert.py 执行完毕后,必须用 read_file 读取生成的证书图片文件并在对话中渲染展示,用 Markdown 图片语法:。绝对禁止只输出文件路径而不展示图片。多个证书时逐个展示。快捷流程:用户已登录且已提供文件,说"帮我存证"时,系统仍需向用户展示确认信息(微链存证信息模板)并询问是否保留云仓托管。确认后才可上传文件(如需)、组装订单并提交。
重要:标题(title)和分类(category)均由系统自动决定,不询问用户修改。但必须询问用户是否需要云仓托管服务。
网关地址:https://api.fuyaoshuzhi.com(生产环境)
通用要求:
scripts/ 目录common.py 中的 HTTP 客户端和工具函数(urllib,无需第三方依赖)common.save_json 自动处理)temp/ 目录,脚本通过 common.ensure_dirs() 自动创建static/ 目录,脚本通过 common.ensure_dirs() 自动创建static/.auth_token.json 是否存在且未过期。使用 scripts/send_sms.py 完成获取图像验证码 + 发送短信验证码。
1.1 获取验证码图片
python scripts/send_sms.py {手机号}
脚本自动完成:调用验证码接口 → 提取 Base64 图片保存到 temp/captcha_temp.png → 保存 identity 到 temp/captcha_identity.txt → 输出 CAPTCHA_SAVED|identity=xxx|png=xxx
1.2 AI 识别验证码字符
用 read_file 读取 temp/captcha_temp.png,AI 视觉识别验证码字符。识别结果内部使用,禁止向用户展示识别结果。
1.3 发送短信验证码
将识别出的字符作为第二个参数传入脚本:
python scripts/send_sms.py {手机号} {识别结果}
脚本自动完成:手机号 Base64 编码 → 调用短信接口 → 输出 SMS_SENT|mobile=xxx 或 SMS_FAILED|message=xxx
一步完成:如果 AI 已提前识别出验证码,可直接
python scripts/send_sms.py {手机号} 验证码跳过等待。
使用 scripts/login.py 完成登录并保存 Token:
python scripts/login.py {手机号} {短信验证码}
脚本自动完成:调用登录接口 → 保存 Token 到 static/.auth_token.json → 输出 LOGIN_SUCCESS|mobile=xxx 或 LOGIN_FAILED|message=xxx
注意:登录接口中 mobile 使用明文(非 Base64)。
登录成功后必须立即删除以下本地临时文件:
temp/captcha_resp.json(验证码响应)temp/captcha_temp.png(验证码图片)temp/captcha_identity.txt(identity缓存)temp/sms_req.json(短信请求体)Remove-Item -Path "$PWD\temp" -Recurse -Force
使用 scripts/init_credential.py 获取权属人列表并保存:
python scripts/init_credential.py
脚本自动完成:调用权属人接口 → 保存到 static/.credential_cache.json → 输出 CREDENTIAL_SAVED|credentialId=xxx|certName=xxx
NO_CREDENTIAL,提示用户去微信端添加权属人由 scripts/login.py 自动生成:
{
"access_token": "xxx...",
"refresh_token": "xxx...",
"token_type": "Bearer",
"expires_in": 3599,
"mobile": "{用户手机号}",
"login_time": "2026-06-01T13:02:31",
"expire_time": "2026-06-01T14:02:31"
}
由 scripts/init_credential.py 自动生成:
{
"credentials": [...],
"update_time": "2026-06-01T13:02:31"
}
两个缓存文件均已加入
.gitignore。所有 JSON 文件均通过common.save_json以 UTF-8 无 BOM 写入。
static/.auth_token.json 存在且未过期,否则先触发登录static/.credential_cache.json 存在,否则提示添加权属人检查 static/.auth_token.json 是否存在且未过期:
static/.credential_cache.json 获取 credentialId,绝对不询问手机号。对每个文件执行:
scripts/calc_hash.py)python scripts/calc_hash.py {file_path}
输出:HASH_RESULT|file=xxx|hash=xxx(128位小写十六进制)
分类枚举与判定策略:
AI 根据文件扩展名、文件名特征、用户上下文,以及**视觉识别(识图)**自动判断分类,规则如下:
| 分类 | 值 | 判定策略 |
|---|---|---|
| 文章 | 101 | 扩展名为 .txt, .doc, .docx, .pdf, .md |
| 设计 | 103 | 扩展名为 .psd, .ai, .sketch, .fig, .xd |
| 摄影 | 102 | 1. 扩展名为RAW格式(.raw, .cr2, .nef);<br>2. 文件名含相机特征(IMG_, DSC_)或用户明确说是“照片”;<br>3. 对于普通的 .jpg, .png 图片,启用视觉识别,画面为真实拍摄场景(如实景、人像摄影)归此类。 |
| 绘画 | 104 | 1. 文件名含“手绘/插画/画板/oc/线稿”等,或用户明确说是“画的”;<br>2. 对于普通的 .jpg, .png 图片,启用视觉识别,画面为板绘、手绘、插画、二次元、CG原画等非真实拍摄内容归此类。 |
| 其它 | 199 | 无法明确判断时兜底使用 |
在上传文件及生成订单前,必须向用户展示确认信息并询问是否保留云仓托管。
展示模板如下(需严格遵循):
微链存证信息,请核对:
- 服务类型:数据存证
- 数据名称:{文件标题}
- 数据类型:{识别出的分类名称,如“绘画”}
- 文件哈希:{SHA512哈希值}
- 云仓托管原文件:是 (已默认开启,以形成闭环的司法证据链)
- 服务费用:¥5 元 (含 ¥3元云仓托管费)
> [!TIP]
> **关于原文件云仓托管的说明**:
> 区块链存证已默认开启原文件加密托管备份(费用为 ¥5):
> * **云仓托管原文件 (默认, ¥5)**:我们将把您的原文件加密备份于云端司法存证仓。即使您本地文件丢失,日后诉讼时也能一键还原下载并进行 HASH 校验,形成闭环证据链。
> * **如果不存原文件 (降级, ¥2)**:如果以后您的本地原文件损坏或丢失,链上的 HASH 即使存在也由于“没有原物比对”而失去司法证明力。
>
> **请确认**:您需要保留云仓托管 (默认, ¥5) 还是降级为仅将 HASH 上链 (¥2)?
用户选择处理:
storage 设置为 true。storage 设置为 false。storage 为 true 时)python scripts/upload_file.py {file_path}
UPLOAD_SUCCESS|ossFileId=xxx。将 credentialId 和 batchData 组装为 JSON 文件,调用 scripts/submit_order.py:
先准备订单数据文件 temp/order_data.json:
{
"credentialId": "{权属人ID}",
"storage": true, // 根据用户在步骤3的选择设定:存为true,不存为false
"batchData": [
{
"hash": "{SHA512}",
"title": "{文件标题}",
"category": 101,
"ossFileId": "{上传返回的文件ID,若不存则可留空}"
}
]
}
python scripts/submit_order.py temp/order_data.json
脚本自动完成:组装固定参数(appId, payChannel 等) → 调用下单接口 → 输出 ORDER_SUCCESS|orderNo=xxx|code_url=xxx 或 ORDER_FAILED|message=xxx
固定参数: appId=wxb4cf8b313474f183, payChannel=WECHAT_PAY, paymentMethod=NATIVE, source=AI_MINI, storage=true(脚本内部处理,无需传入)
动态参数: credentialId(缓存第一个权属人), batchData(文件信息数组,含上传返回的 ossFileId)
下单成功后,从 submit_order.py 输出中获取 code_url,转为二维码输出:
https://api.qrserver.com/v1/create-qr-code/?size=300x300&data={URL编码的code_url}
展示支付二维码后,询问用户是否已完成支付。用户确认已支付后,调用 scripts/query_order.py 查询:
python scripts/query_order.py {orderNo}
脚本查询一次订单状态 → 支付成功时自动保存订单详情到 temp/order_detail.json
ORDER_PAID → 支付成功,脚本输出订单摘要,向用户展示以下信息:
certName 字段)payPrice 字段,单位为分,需转换为元,如 300 → 3.00元)ORDER_UNPAID → 尚未支付,提示用户完成支付后再次确认支付成功后,query_order.py 已自动保存订单详情到 temp/order_detail.json,直接调用证书生成脚本:
python scripts/generate_cert.py temp/order_detail.json
{作品名称}_证书.png 命名,输出到桌面 certificate/ 文件夹(~/Desktop/certificate/,不存在时自动创建)template/模板.png,不修改原模板
删除 temp/ 目录下的所有临时文件:
Remove-Item -Path "$PWD\temp" -Recurse -Force
GET /xrl-cloud-upms/open/captcha(获取图像验证码)→ scripts/send_sms.pyPOST /xrl-cloud-upms/open/sms-verification-code(发送短信)→ scripts/send_sms.pyPOST /xrl-cloud-uaa/oauth2/token(登录)→ scripts/login.pyGET /xrl-cloud-asset/v7/user/credential/list(权属人列表)→ scripts/init_credential.pyPOST /xrl-cloud-asset/v7/file-upload/microchain(文件上传)→ scripts/upload_file.pyPOST /xrl-cloud-asset/v7/batch-micro-chain/order(提交订单)→ scripts/submit_order.pyGET /xrl-cloud-asset/v7/batch-micro-chain/order/{orderNo}(查询订单支付状态)→ scripts/query_order.pyscripts/common.py:HTTP 客户端(urllib)、路径配置、Token 加载、JSON 读写scripts/calc_hash.py199 其它 处理,不询问用户isPrimary=true)orderPrice/payPrice 字段),由平台自动设定,AI 禁止在对话中主动向用户展示或提及价格优先从远程 URL 实时抓取,抓取失败时回退到本地文件:
优先:远程 URL
https://oss.fuyaoshuzhi.com/assets/yaojian/%E7%88%BB%E9%89%B4%E9%97%AE%E9%A2%98%E5%BA%93.md
回退:本地 knowledge/爻鉴问题库.md
当用户提出问题时,先尝试 WebFetch 抓取远程 URL;如果抓取失败(网络异常、超时等),则读取本地 knowledge/爻鉴问题库.md 作为备选。
\#、编号等)