此 skill 用于通过可视浏览器自动化完成钉钉应用创建与 QwenPaw channel 绑定。
{"action": "start", "headed": true}
遇到登录关卡必须暂停:
登录、扫码登录、手机号/密码登录),立即停止自动操作。任何应用配置变更都必须新建版本并发布后才生效:
在开始自动化点击前,先向用户发起一次“配置确认”,明确告知可自定义项、图片规范、默认值。建议使用如下结构化确认:
让用户可自定义以下字段:
明确告知图片规范(显著提示):
240*240px 以上,1:1,2MB 以内,无圆角。png/jpeg/jpg,不超过 2MB。明确告知默认值(用户不指定时自动采用):
QwenPaw
Your personal assistant
https://img.alicdn.com/imgextra/i4/O1CN01M0iyHF1FVNzM9qjC0_!!6000000000492-2-tps-254-254.png
https://img.alicdn.com/imgextra/i4/O1CN01M0iyHF1FVNzM9qjC0_!!6000000000492-2-tps-254-254.png
若用户未给任何自定义值,必须先明确回复:
file_upload 传入本地路径数组(paths_json)file_upload 的 paths_json 必须是“JSON 字符串数组”,注意转义:{
"action": "file_upload",
"paths_json": "[\"xxx.png\"]",
"frame_selector": "iframe[src*=\"/fe/app?isHideOuterFrame=true\"]"
}
若页面在 iframe 内,建议优先带上 frame_selector,否则可能出现找不到上传控件或 chooser 未触发。
上传前必须先点击上传入口;若直接 file_upload 会报:
No chooser. Click upload then file_upload.
机器人图标区域的常见结构特征可用于定位(示例):
text: "* 机器人图标"
button: "使用应用图标"
button: "avatar"(通常内部有 img "avatar")当 snapshot 中同时出现“使用应用图标”和“avatar”时,优先点击 avatar 按钮触发上传,再执行 file_upload。
headed: true)https://open-dev.dingtalk.com/
snapshot 判断是否需要登录若需要登录,使用如下话术暂停:
检测到需要登录钉钉开发者后台。我已暂停自动操作,请先在弹出的浏览器中完成登录。完成后回复“继续”,我再从当前页面接着执行。
用户确认登录后继续:
QwenPaw
Your personal assistant
若页面文案或结构与预期不一致,重新 snapshot,按可见文本语义重新定位元素。
https://img.alicdn.com/imgextra/i4/O1CN01M0iyHF1FVNzM9qjC0_!!6000000000492-2-tps-254-254.png
https://img.alicdn.com/imgextra/i4/O1CN01M0iyHF1FVNzM9qjC0_!!6000000000492-2-tps-254-254.png
Stream 模式
应用发布 -> 版本管理与发布
基础信息 -> 凭证与基础信息
Client ID(AppKey)和Client Secret(AppSecret)在该页面上。不主动进行修改,引导用户自行绑定拿到凭证后,引导用户选择以下任一方式:
控制台前端配置:
控制 -> 频道 -> DingTalk
Client ID 与 Client Secret
配置文件方式:
"dingtalk": {
"enabled": true,
"bot_prefix": "[BOT]",
"client_id": "你的 Client ID",
"client_secret": "你的 Client Secret"
}
路径:~/.qwenpaw/config.json,位于 channels.dingtalk 下。
Client ID 与真实 Client Secret。console 配置、不主动改 ~/.qwenpaw/config.json。控制 -> 频道 -> DingTalk
~/.qwenpaw/config.json 的 channels.dingtalk 字段默认按以下顺序执行:
start with headed: true
open
snapshot
click / type / select_option / press_key as neededsnapshot after page transitionsstop when donesnapshot 的 ref;仅在必要时使用 selector。wait_for)并立即重新 snapshot。