Use a headed browser to automatically complete DingTalk channel integration for QwenPaw. Applicable when the user mentions DingTalk, developer console, Client I
复制下面这句话,粘贴给 Claude Code、Codex、Cursor 等 AI 编程工具,它会读取安装说明并在你确认后完成安装。
请阅读 https://ai.atlankj.com/install/asset/gh-dingtalk-channel-en-2e7d7fef3f5a ,按照其中的说明把「dingtalk_channel_connect」安装到你(当前 AI 工具)中。执行前先告诉我将运行的命令和写入的位置,等我确认。
查看 AI 将读取的安装说明正在读取 GitHub 原文…
内容来自 GitHub 原始文件,由原作者维护。在 GitHub 查看
This skill automates the creation of a DingTalk application and the binding of a QwenPaw channel using a headed browser.
{"action": "start", "headed": true}
Must pause when a login gate is encountered:
Any application configuration change only takes effect after creating a new version and publishing:
Before starting automated clicks, initiate a "configuration confirmation" with the user, clearly informing them of customizable fields, image specifications, and default values. Use the following structured confirmation:
Allow the user to customize the following fields:
Clearly state the image specifications (prominently):
240*240px or larger, 1:1 ratio, under 2MB, no rounded corners.png/jpeg/jpg, no more than 2MB.Clearly state the default values (used automatically if the user does not specify):
QwenPawYour personal assistanthttps://img.alicdn.com/imgextra/i4/O1CN01M0iyHF1FVNzM9qjC0_!!6000000000492-2-tps-254-254.pnghttps://img.alicdn.com/imgextra/i4/O1CN01M0iyHF1FVNzM9qjC0_!!6000000000492-2-tps-254-254.pngIf the user provides no custom values, you must first explicitly reply:
file_upload with the local path array (paths_json)paths_json of file_upload must be a "JSON string array" -- note the escaping:{
"action": "file_upload",
"paths_json": "[\"xxx.png\"]",
"frame_selector": "iframe[src*=\"/fe/app?isHideOuterFrame=true\"]"
}
If the page is within an iframe, prefer including frame_selector; otherwise the upload control may not be found or the chooser may not trigger.
You must click the upload entry before calling file_upload; calling it directly will result in:
No chooser. Click upload then file_upload.Common structural features of the bot icon area that can be used for locating elements (examples; these may appear as Chinese UI labels in the DingTalk console):
text: "* 机器人图标" (Bot Icon)button: "使用应用图标" (Use App Icon)button: "avatar" (usually contains img "avatar" inside)When the snapshot shows both "使用应用图标" ("Use App Icon") and "avatar", prefer clicking the avatar button to trigger the upload, then call file_upload.
headed: true)https://open-dev.dingtalk.com/snapshot to check if login is requiredIf login is required, pause with the following message:
Login to the DingTalk Developer Console is required. I have paused automated operations. Please complete the login in the opened browser. Reply "continue" when done, and I will resume from the current page.
After the user confirms login, continue:
QwenPawYour personal assistantIf the page text or structure does not match expectations, re-run snapshot and relocate elements based on visible text semantics.
https://img.alicdn.com/imgextra/i4/O1CN01M0iyHF1FVNzM9qjC0_!!6000000000492-2-tps-254-254.pnghttps://img.alicdn.com/imgextra/i4/O1CN01M0iyHF1FVNzM9qjC0_!!6000000000492-2-tps-254-254.pngStream Mode (the Chinese UI may display Stream 模式)Application Release -> Version Management & ReleaseBasic Information -> Credentials & Basic InfoClient ID (AppKey) and Client Secret (AppSecret) are on this page. Do not make changes proactively; guide the user to bind them on their ownAfter obtaining the credentials, guide the user to choose one of the following methods:
Console frontend configuration:
Control -> Channels -> DingTalkClient ID and Client SecretConfiguration file method:
"dingtalk": {
"enabled": true,
"bot_prefix": "[BOT]",
"client_id": "Your Client ID",
"client_secret": "Your Client Secret"
}
Path: ~/.qwenpaw/config.json, under channels.dingtalk.
Client ID and the actual Client Secret.console configuration or ~/.qwenpaw/config.json.Control -> Channels -> DingTalkchannels.dingtalk field in ~/.qwenpaw/config.jsonExecute in the following order by default:
start with headed: trueopensnapshotclick / type / select_option / press_key as neededsnapshot after page transitionsstop when doneref from the latest snapshot; only use selector when necessary.wait_for) and immediately re-run snapshot.