Install
openclaw skills install @yiming1001/web-collectionopenclaw skills install @yiming1001/web-collectionUse this skill for browser-extension collection tasks on:
The online documents are the source of truth for user-facing guidance. Do not duplicate their long-form onboarding, paid-access, UI operation, or QA content in this skill. When a user asks for guidance, read the relevant online document if tools can access it; if not, give the user the link and say the online document should be used as the current guide.
Decision rule:
For collection execution, keep using this SKILL.md and the bundled scripts as the agent contract. For complex or ambiguous execution requests, read references/learning-guide.md as an offline routing and recovery summary after checking whether the QA guide applies.
This skill may include local screenshots or GIFs under assets/ for concise user guidance. For onboarding steps, guide the user in this order:
SKILL.md file, under the bundled assets/ directory. Use the image/attachment mechanism supported by the current Agent host. If the host supports Markdown images with relative packaged assets, use paths like assets/bitable-step-00-personal-center.png; if the host requires attachments, attach that asset file.If an asset is missing, still give a short text instruction first, then send the matching online document link and say the document contains the current visual guide.
When the user has confirmed setup/configuration, asks to bind bitable, or asks how to obtain connector credentials, do not provide a text-only setup answer if matching assets exist. The answer must include the bundled screenshots inline or as attachments, placed next to the corresponding step. Do not invent machine-specific absolute paths; always resolve files from this skill package's assets/ directory.
Do not show screenshots in the lightweight intro response. Screenshots are only for the setup/configuration flow after the user confirms they want to continue.
Image/text placement rules:
登录媒讯助手 text with assets/bitable-step-00-personal-center.png复制多维表格模板 text with assets/bitable-step-01-template-copy.png获取授权码 text with assets/bitable-step-02-auth-code.png测试并保存多维表格配置 text with assets/bitable-step-03-config-save.pngassets/connector-step-01-status-token.png is an overview image for the whole third major step and must appear once at the end of that major step.Connector guidance constraints:
device_id, connector_token, Token, or API token during normal Agent-led use.免费获取云端连接器凭证.云端连接器 / 本地连接器 mode in this onboarding step.assets/connector-step-01-status-token.png as an optional overview image only when explaining the connector UI for troubleshooting or manual fallback.Expected optional assets:
assets/install-extension-connector.gif or assets/install-extension-connector.png
assets/configure-bitable.gif or assets/configure-bitable.png
assets/bitable-step-00-personal-center.png
个人中心, and log in.assets/bitable-step-01-template-copy.png
assets/bitable-step-02-auth-code.png
多维表格插件 -> 自定义插件 and copy the authorization code.assets/bitable-step-03-config-save.png
assets/verify-connector.gif or assets/verify-connector.png
assets/connector-step-01-status-token.png and do not show a separate connector verification image.assets/copy-device-token.gif or assets/copy-device-token.png
assets/connector-step-01-status-token.png and do not show a separate credential-copy image.assets/connector-step-01-status-token.png
assets/view-results.gif or assets/view-results.png
Do not block onboarding when these files are absent. The Feishu documents remain the source of truth for screenshots, GIFs, and current UI details.
When guiding browser extension and connector installation, follow these constraints exactly:
https://vcn5grhrq8y0.feishu.cn/wiki/R6f2w6o7ci1db1kYLK4cgJIYnWh.exe file to run the connector.Use this flow before a user's first collection or whenever setup status is unclear.
Use this when the user asks what the skill is, what it can do, or how to use it in general, but has not explicitly asked to start setup/configuration.
https://vcn5grhrq8y0.feishu.cn/wiki/GO11wlXkriSwNakXrt2ck0GanEe如果你要继续使用,我可以带你完成首次配置。你回复「继续配置」后,我会按步骤发操作指引、截图和配置文档。
Do not include install steps, bitable binding steps, connector credential steps, or screenshots in this intro response.
Use this only after the user confirms setup/configuration, or when they explicitly ask for installation, binding, connector verification, or credential collection.
Do not repeat the "what this skill can do" platform/capability explanation in the setup flow. That content belongs only in the lightweight intro response. The setup flow starts directly with installing the browser extension and connector.
assets/install-extension-connector.* exists, show it with a short instruction..exe file to run it.https://vcn5grhrq8y0.feishu.cn/wiki/R6f2w6o7ci1db1kYLK4cgJIYnWh我已装完.assets/ directory.个人中心, then log in to the media assistant account if the user is not already logged in.
Image: assets/bitable-step-00-personal-center.pnghttps://vcn5grhrq8y0.feishu.cn/base/UKQsbVHpMac293s0cnFc1hq1nDd?table=tblTXM4lclXM6Jzr&view=vew8OdcKHw. Tell the user to open that template link directly, choose 创建副本, and make sure the copy is created in a bitable space. Tell the user to select 仅多维表格结构 when the copy dialog asks for the copy range.
Image: assets/bitable-step-01-template-copy.png多维表格插件, choose 自定义插件, click 获取授权码, enable the authorization code, then copy it.
Image: assets/bitable-step-02-auth-code.png媒讯助手, open 配置中心 with the gear icon, expand the bitable configuration section, paste the newly copied bitable link and the personal authorization code, click 测试连接, wait for Connection successful or green success text, then click 保存配置.
Image: assets/bitable-step-03-config-save.png多维表格已绑定.https://vcn5grhrq8y0.feishu.cn/wiki/EAtJw2irFiDvMpkZXb4cBjYonNgscripts/ensure_connector_auth.sh; it will generate a website login confirmation link.connector_token, ws_url, and device_id into its own state. The Skill should reuse that state automatically.assets/connector-step-01-status-token.png as a manual fallback/troubleshooting overview, not as the primary Agent-led flow.https://vcn5grhrq8y0.feishu.cn/wiki/EAtJw2irFiDvMpkZXb4cBjYonNgFirst-run flow below.export.tableUrl exists, put the table link first and tell the user to open it to view results.https://vcn5grhrq8y0.feishu.cn/wiki/GO11wlXkriSwNakXrt2ck0GanEeopenclaw browser profile.cloud: default; call the connector dispatch API and only run the cloud send-command scriptlocal: troubleshooting/manual fallback; talk to the local bridge directly and only run the local send-command scriptcloud mode, do not rewrite the collection payload. Only wrap it in:
device_idactionpayloadpersonalSmart from this skill. Send personal plus deduplication.enabled=true; the new plugin switches to its smart personal export internally.This skill uses one preferences file:
$OPENCLAW_STATE_DIR/skill-state/web-collection/preferences.json
Fallback:
$HOME/.openclaw/skill-state/web-collection/preferences.json
Helper script:
bash {baseDir}/scripts/export_preference.sh show
bash {baseDir}/scripts/export_preference.sh check
bash {baseDir}/scripts/export_preference.sh apply-recommended
bash {baseDir}/scripts/export_preference.sh set-key defaultConnectionMode cloud
bash {baseDir}/scripts/export_preference.sh set-key defaultExportMode csv
bash {baseDir}/scripts/export_preference.sh set-key defaultDeduplicationEnabled true
bash {baseDir}/scripts/export_preference.sh set-key defaultDeduplicationStrategy keepOld
Required defaults:
defaultExportModedefaultMaxItemsdefaultFetchDetaildefaultDetailSpeedOptional defaults with built-in fallback:
defaultDeduplicationEnabled defaults to truedefaultDeduplicationStrategy defaults to keepOldConnector authorization defaults:
https://i-sync.cn by default.defaultCloudDeviceId and defaultCloudToken are optional manual overrides, not first-run questions.run.sh first tries environment variables, stored preferences, App state, and connector state.run.sh prints a website login confirmation link and stops with an authorization-required message.On first use:
defaultCloudDeviceId or defaultCloudToken.推荐配置自己配置推荐配置, run:bash {baseDir}/scripts/export_preference.sh apply-recommended
自己配置, ask for all common values in one message, not one by one.Preferred cloud prompt:
需要确认一次连接器授权。请打开下面这个登录确认链接,完成网站登录/授权后回到这里,我会继续执行采集:
<login_url>
Preferred quick-reply prompt for common defaults:
常用配置还需要确认一次。
这些配置包括:
- 导出方式
- 默认采集条数
- 是否默认采集详情
- 默认采集速度
- 是否开启导出去重
- 去重保留策略
你可以直接用推荐配置,也可以自己配置。
[[quick_replies: 推荐配置, 自己配置]]
Preferred custom-config prompt:
好,我们一次性把默认配置定好。请直接按下面格式回复:
导出方式:CSV / 多维表格
默认采集条数:10 / 20 / 50 / 100
是否默认采集详情:是 / 否
默认采集速度:fast / medium / slow
是否开启导出去重:是 / 否
去重保留策略:保留原始数据 / 保留新数据
说明:
- 多维表格:适合查看、筛选、分享
- CSV:适合本地保存
- 采集详情:开启后结果更完整,但一般更慢
- 采集速度:推荐 fast
- 导出去重:推荐开启
- 保留原始数据:重复数据保留第一次导入版本
Recommended defaults:
cloud多维表格20truefasttruekeepOld(保留原始数据)Do not send Feishu cards for default configuration. When the user needs the recommended defaults, send the default values directly in plain text and apply them with the bundled preference helper.
Default values to send:
cloud多维表格20truefasttruekeepOld(保留原始数据)Recommended apply path:
bash {baseDir}/scripts/export_preference.sh apply-recommended
If the user wants to customize values, ask for the complete set in one message and then persist them through scripts/export_preference.sh set-key. Do not introduce a card callback server, interactive card form, or Feishu card delivery step for this configuration flow.
Use cloud mode when the collection request should be sent to the platform backend first, and then dispatched to the user's connected local connector.
Cloud responsibilities:
/api/v1/connector/cloud/dispatchAuthorization: Bearer <user_api_key>device_idpayloadmaxItems=20, mode=search, interval=300, fetchDetail=true, detailSpeed=fast/api/v1/connector/cloud/commands/{command_id} for final status and result/api/v1/connector/cloud/commands?device_id=...result + task_updates as the source of completion snapshotDo not:
19820 port from the cloud pathpayload semanticsAdvanced filters, including time-based filtering, must be passed through via the request filters object.
Rules:
filters payload question first, not as a standalone top-level argument.--filters-json '<json-object>' when calling scripts/run.sh; this becomes payload.filters in the final collect body.startTime and endTime, while another may only support keys such as sortBy, relative publish-time options, or other method-specific fields.GET /api/filters first, or the platform/method-scoped filter capability endpoint if available, before guessing.filters object should be preserved inside payload.Time-filter guidance:
filters, not through a fixed top-level skill parameter such as --time-range.filters, for example startTime / endTime.Examples:
bash {baseDir}/scripts/run.sh \
--platform douyin \
--method videoKeyword \
--keyword "AI" \
--filters-json '{"startTime":1717171200000,"endTime":1719763199000}' \
--ensure-bridge
bash {baseDir}/scripts/run.sh \
--platform amazon \
--method productReview \
--link "https://www.amazon.com/dp/B0..." \
--filters-json '{"sortBy":"recent"}' \
--ensure-bridge
When collection fails, parameters look incomplete, or status is unclear, run connector checks in this order instead of guessing.
Layer 1: capability
GET /api/helpGET /api/routesGET /api/filters (or platform/method scoped)Layer 2: diagnostics
GET /api/statusGET /api/platform-stateGET /api/cloud/statusPOST /api/preflight with the final request bodyLayer 3: execution and tracking
POST /api/collectGET /api/tasks/:id (local mode)GET /api/v1/connector/cloud/commands/{command_id} (cloud mode, preferred)GET /api/v1/connector/cloud/commands?device_id=... (cloud fallback)POST /api/stop or POST /api/reset when stuckLocal command template (admin token required):
TOKEN="$(cat ~/.meixi-connector/bridge-admin-token.txt)"
curl -s -H "x-connector-admin-token: $TOKEN" "http://127.0.0.1:19820/api/status"
Cloud command template (async result):
curl -s -H "Authorization: Bearer <token_or_api_key>" \
"https://i-sync.cn/api/v1/connector/cloud/commands/<command_id>"
bitable
--export-target bitableexport.tableUrl on successpersonalexport.deduplication.enabled=true and strategy=keepOldcsv
--export-target csvDeduplication fields are owned by the connector/plugin. Do not ask the user to choose a field and do not pass a field from this skill.
For bitable export, this skill must treat personal export as a smart-export conversation, not as a plain success-or-fail step.
If collection succeeded but export failed:
新建表继续导出导出为CSVRecommended failure explanation:
采集已经完成,失败发生在导出到原多维表格这一步。
原表导出失败通常有几种原因:
- 原目标表不存在
- 原目标表字段结构与本次数据不一致
- 导出服务临时异常
为了避免这次结果丢失,我现在可以继续帮你导出。你可以选择:
- 新建表继续导出:在当前多维表格中创建一个新的数据表后继续导出
- 导出为CSV:直接把这次结果保存成 CSV 文件
[[quick_replies: 新建表继续导出, 导出为CSV]]
If the user chooses 导出为CSV, switch the follow-up run to CSV export.
If the user chooses 新建表继续导出 or 导出为CSV after a failed export and the previous result includes a connector taskId, do not start a new collection. Re-export from the cached task records:
bash {baseDir}/scripts/reexport_task.sh --task-id "<taskId>" --export-target csv
bash {baseDir}/scripts/reexport_task.sh --task-id "<taskId>" --export-target bitable --new-table
This uses POST /api/tasks/:id/export and must be described as reusing the previous task's cached records. If no task id is available, be honest that the skill cannot guarantee a no-recollect retry.
Expected bitable connector payload shape:
{
"autoExport": true,
"exportMode": "personal",
"export": {
"enabled": true,
"mode": "personal",
"deduplication": {
"enabled": true,
"strategy": "keepOld"
}
}
}
Do not use this shape:
{
"exportMode": "personalSmart"
}
Preferred wrapper:
bash {baseDir}/scripts/run.sh ...
The wrapper:
scripts/preflight_check.sh firstscripts/cloud_dispatch_loop.shscripts/collect_and_export_loop.shscripts/preflight_check.sh
scripts/ensure_connector_auth.sh
scripts/run.sh
connection-modescripts/ensure_connector_auth.sh before cloud dispatchscripts/collect_and_export_loop.sh
scripts/cloud_dispatch_loop.sh
scripts/reexport_task.sh
scripts/export_preference.sh
references/learning-guide.md
Douyin keyword search:
bash {baseDir}/scripts/run.sh \
--platform douyin \
--keyword "AI" \
--ensure-bridge
Douyin keyword search via cloud dispatch:
bash {baseDir}/scripts/run.sh \
--connection-mode cloud \
--cloud-device-id desktop-local-smoke-fix \
--cloud-token '<user_api_key>' \
--platform douyin \
--keyword "AI员工"
Amazon keyword search:
bash {baseDir}/scripts/run.sh \
--platform amazon \
--keyword "Chinese porcelain" \
--ensure-bridge
Bilibili keyword search:
bash {baseDir}/scripts/run.sh \
--platform bilibili \
--keyword "古董" \
--ensure-bridge
Wrapper defaults:
douyin => videoKeywordtiktok => keywordSearchxiaohongshu => keywordSearchamazon => keywordSearchbilibili => keywordSearchSupported methods:
douyin: videoKeyword, creatorKeyword, creatorLink, creatorVideo, videoComment, videoInfo, videoLinktiktok: keywordSearch, userVideo, tiktokComment, tiktokCreatorKeyword, tiktokCreatorLinkxiaohongshu: keywordSearch, creatorNote, creatorLink, creatorKeyword, noteLink, noteCommentamazon: keywordSearch, productLink, productReviewbilibili: keywordSearch, videoInfo, creatorVideo, bilibiliCommentlocal mode:
pluginConnected=true/api/collectTASK_RUNNING via stop -> wait idle -> retry/api/tasks/<taskId> until completed or errorcloud mode:
/api/v1/connector/cloud/status?device_id=...action=collect to /api/v1/connector/cloud/dispatch/api/v1/connector/cloud/commands/{command_id} preferred)completed or terminal error stateresult and task_updates for records/count/export snapshot and include key fields in the final replyQuick query examples:
curl -H "Authorization: Bearer <token_or_api_key>" \
"https://i-sync.cn/api/v1/connector/cloud/commands?device_id=<device_id>"
curl -H "Authorization: Bearer <token_or_api_key>" \
"https://i-sync.cn/api/v1/connector/cloud/commands/<command_id>"
When successful:
local or cloud mode.cloud mode was used, include the command status.bitable and export.tableUrl exists, include the table link first.csv, explicitly say export mode is CSV.When bitable export is expected but no table link exists, explicitly say export did not finish correctly.
pluginConnected=false
local mode, ensure collect, status, and stop all use the same local base URLTASK_RUNNING
--force-stop-before-start