用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/TeamWiseFlow/xiaobei --skill wx-channel-engagement命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | wx-channel-engagement |
| description | 微信视频号已发布作品数据抓取,写入 published-track 的 pub_wx_channel 表。wechat-channel session 登录。 |
| metadata | {"openclaw":{"emoji":"📺","requires":{"bins":["python3","camoufox-cli","sqlite3"]}}} |
通过 camoufox-cli + 本技能与 wechat-channels-publish 共管的 wechat-channel 持久化 session + 视频号助手后台爬虫,从视频号助手「内容管理 → 作品管理」页抓已发布视频的播放/点赞/评论/分享/收藏,写入 published-track 的 pub_wx_channel 表。
思路:视频号助手后台 channels.weixin.qq.com/platform/ 的作品管理页把每条已发布视频的播放/点赞/评论/分享/收藏列在行内,走「作品管理页 → 解析 innerText → 按标题匹配 → 提行内数字」,与 wx-mp-engagement 同源方法。
限制:仅支持用户自己有后台权限的号(视频号助手用微信扫码登录)。竞品号拿不到——这是产品约束,不是技术约束。
本技能与 wechat-channels-publish 共用同一个 wechat-channel 持久化 session,靠 session 名字符串约定共享同一 profile 目录与登录态——任一技能登录后另一个不需重登,反之亦然。单一 session、单一 IP、单一 profile,避免多 session 多 IP 的风控风险。
session wechat-channel 正忙 → exit 3,调用方(agent)等待当前操作完成后再试,不自动排队、不自动 close 正在跑的 session。wechat-channel session profile 里就位即可。失效时走本技能 login + login-confirm 重登流。wechat-channel session 的探活 + 登录 + 重登。camoufox-cli 命令统一 --session wechat-channel --persistent,登录态在 session profile 里已就位即可。
登录态判断:camoufox 打开 channels.weixin.qq.com/platform/ 看 redirect URL:
/platform/home 或 /platform/post/list 等后台路径 = 登录就位login / 扫码页 = 失效,需重登失效重登流程(走本技能自己):
wx-channel-engagement login # camoufox 无头截 QR PNG 落 /tmp/qr-wx-channel.png
# (发 QR PNG 给用户 -> 用户扫码后 -> 主会话回复"已扫码")
wx-channel-engagement login-confirm # 验登录就位 + close session(不导出 cookie/UA/token)
login 返回 already_logged_in: true 时无需扫码,直接执行后续命令。扫码失败 / 用错账户后,不要直接重跑 login——旧 cookie 污染 profile,重跑拿到的 QR 扫了也不生效。先带 --reset 清 profile 再重登:
wx-channel-engagement login --reset # 删 profile 目录 + 重新 open,从干净状态拿 QR
退出码:
0 成功1 通用错误(参数错 / row 找不到 / 标题未匹配)2 session 失效(后台首页跳登录页)3 session 正忙(fail-first 队列)ls ~/.openclaw/workspace-main/db/published_track.db
# 初始化(如未建)
~/.openclaw/workspace-main/skills/published-track/scripts/init-db.sh
wx-channel-engagement login # camoufox 无头截 QR PNG,等扫码
wx-channel-engagement login-confirm # 验登录就位 + close session
wx-channel-engagement probe # 打开视频号助手后台 dump DOM/截图/innerText,调试用
wx-channel-engagement list # 列出后台所有视频号作品 + 行内 metrics
wx-channel-engagement fetch --row-id <id> # 抓单篇(按 row.title 在作品管理页匹配)
wx-channel-engagement fetch-all --days 7 # 批量抓最近 N 天未更新的 wx_channel 记录
视频号助手后台 URL:https://channels.weixin.qq.com/platform/(登录后跳转到这里)
https://channels.weixin.qq.com/platform/post/list<wujie-app>::shadow-root 内——camoufox-cli 的 snapshot 默认穿透 shadow DOM 拿 ref,但 eval 读 document.body.innerText 时不穿透 shadow DOM,需要用 eval 手写 document.querySelector('wujie-app').shadowRoot 拿 shadow 内文本。登录态来源:camoufox 打开后台首页后从 redirect URL 判登录态。登录态在 wechat-channel session profile 里就位即可,不导出 cookie/UA/token。
Cookie 导入禁忌:⚠️ 严禁 camoufox-cli cookies import 造会话(浏览器方案严禁 cookie 导入)。本技能与 wechat-channels-publish 共管 wechat-channel 持久化 session,camoufox-cli 命令统一 --session wechat-channel --persistent,登录态在 session profile 里已就位,不开独立 session、不 import cookie。撞 fail-first 队列(同 session 正被占用)就等占用方完成再串行接力,不自动 close 正在跑的 session。
数据提取方式:不依赖 selector,直接用 document.body.innerText 解析(穿透 shadow DOM 后)。页面 innerText 结构清晰:
<视频标题>
<发布时间>
<播放数> <点赞数> <评论数> <分享数> <收藏数>
具体结构需
probe实测确认。如果 innerText 不穿透 shadow DOM 拿不到数据,fallback 到eval注入 JS 手动读wujie-app.shadowRoot内文本。
1. camoufox 打开视频号助手后台首页
├─ redirect URL 跳 login/扫码页 → exit 2(调用方触发本技能 login + login-confirm)
└─ redirect URL 跳 /platform/home 等后台路径 → 继续
2. lookup_published_row(row_id) -> 拿 title / publish_url
3. 复用 wechat-channel 持久化 session(不开独立 session、不 import cookie):
camoufox-cli --session wechat-channel --persistent --json open "https://channels.weixin.qq.com/platform/post/list"
4. eval JS 解析作品管理页 innerText -> [{title, metrics}, ...]
5. match_article(rows, row.title) -> 按标题归一化匹配
6. update-metrics.sh --platform wx_channel --id <row_id> ... -> 写 pub_wx_channel
7. finally: close session(登录态在磁盘 profile,不留进程占内存;下次 fetch 按需重起无头 session,profile 桥接登录态)
{
"ok": true,
"row_id": 42,
"title": "测试视频",
"publish_url": "https://weixin.qq.com/sph/xxx",
"session": "wechat-channel",
"metrics": {
"plays": 1234,
"likes": 56,
"comments": 12,
"shares": 8,
"favorites": 3
},
"update": {"ok": true, "action": "updated"}
}
wx_channel 的互动数据抓取不走 fetch-and-update-metrics.sh——后者只管 xhs/bilibili/douyin/kuaishou 四个纯 HTTP+cookie 平台。wx_channel 走 camoufox 抓视频号助手后台,机制与 wx_mp 同源,由本 skill 独立承担,agent 直调本 skill wrapper:
wx-channel-engagement fetch --row-id <rowid>
本 skill 内部流程:
./skills/published-track/scripts/update-metrics.sh --platform wx_channel --id <rowid> ... 写 pub_wx_channel
update-metrics.sh是 published-track 的纯写库脚本,本 skill 写库就走它(不经过 fetch-and-update-metrics.sh)。fetch-and-update-metrics.sh收到--platform wx_channel会直接 exit 1 报错提示走本 skill,两条链路独立、不耦合。
wechat-channels-publish 共管 wechat-channel 持久化 session,fail-first 队列串行接力,不自动 close 正在跑的 sessionwechat-channel session profile 里就位即可。失效时走本技能 login + login-confirm 重登(重登后登录态在 profile 里就位),再 camoufox 打开后台首页wechat-channels-publish 的发布凭据document.body.innerText 拿不到 shadow DOM 内文本snapshot 默认穿透 shadow DOM 拿 ref;eval 读 innerText 时需手写 document.querySelector('wujie-app').shadowRoot.innerText 拿 shadow 内文本。fallback 才需要 eval 里手写 document.querySelector('wujie-app').shadowRoot.querySelector(selector)probe 命令检查 02_list.html 和 03_inner_text.txt 确认页面结构,调整解析逻辑wechat-channels-publish 正在跑发布流程,本 skill 撞 fail-first 队列,exit 3wechat-channels-publish 共寿命,失效则 camoufox 打开后台首页跳登录页 → exit 2 → 走本技能 login + login-confirm 重登流,再用新登录态打开后台首页update-metrics.sh --plays ... --likes ... --comments ... --shares ... --favorites ... 手动填)--session wechat-channel --persistent(与 wechat-channels-publish 共管的持久化 session),headless 是默认行为;登录态从 session profile 桥接publish_url 是否为空)自行归因