计划执行与检查节点
executing-plans
按既定实施计划完成工作,保持过程检查和反馈。
lov-media-crawler【效率与协作】给定视频号、小红书、抖音、快手、B站、微博、贴吧或知乎链接,复用登录态解析并高速下载媒体,视频号受限内容可回退到本机微信客户端取流,返回可验证文件与诊断报告。Use when the user asks to download a media link, save a WeChat Channels video, or says “下载这个视频链接”.
独立 GitHub 快照 · 自动分类 · 以原作者文档为准
name: lov-media-crawler description: > 给定视频号、小红书、抖音、快手、B站、微博、贴吧或知乎链接,复用登录态解析并高速下载媒体,视频号受限内容可回退到本机微信客户端取流,返回可验证文件与诊断报告。Use when the user asks to download a media link, save a WeChat Channels video, or says “下载这个视频链接”. license: MIT compatibility: "Portable Agent Skills format; Python 3.9+, curl; optional aria2, ffprobe, uv, Git, Playwright, Chrome, MediaCrawler; WeChat client capture needs macOS, WeChat desktop and admin rights for the local proxy." depends_on:
用户给一个公开且有权保存的社交媒体链接,本 Skill 负责识别平台、复用已有授权、下载原始媒体,并交付文件与 JSON 验证报告。优先减少等待、重复登录和中间选择。
weixin.qq.com/sph/...、抖音、小红书、快手、B站、微博、贴吧或知乎内容链接并要求本地文件。lov-media-fetch。lov-media-creator。每次运行读取 skill.yaml 声明的 user-profile/v1:用户语言、工作区输出位置、共享偏好,以及 skills.lov-media-crawler 下的 Skill 记录。解析顺序为当前请求、项目上下文、Skill 记录、共享偏好、用户 Profile、安全默认值。
用户明确声明长期输出目录、下载并发数或媒体格式偏好时,使用 scripts/profile_store.py record --confirm 写回 Profile,并报告保存路径。Cookie、Token、代理密码和浏览器登录态永不写入 Profile;视频号元宝授权仅进入操作系统凭据存储或当前进程环境。完整契约见 references/user-profile.md。
运行前阅读 references/skill-composition.md。本 Skill 独立拥有“已知链接 → 已验证本地媒体”的验收;相邻 Skill 只通过链接或本地文件交接,不是隐藏依赖。
必须按以下顺序执行。
SKILL_DIR,否则从当前 Skill 上下文推断安装目录。scripts/media_crawler.py、scripts/authorize_yuanbao.py、references/platform-matrix.md、references/upstream-and-licenses.md 存在。python3 "$SKILL_DIR/scripts/media_crawler.py" doctor --json,只安装当前链接确实需要的可选依赖。records.output_dir、项目输出目录,最后才是当前目录下 downloads/。不得覆盖已有成品。手工运行时:
export SKILL_DIR="/path/to/lov-media-crawler"
python3 "$SKILL_DIR/scripts/media_crawler.py" probe URL --json
按 references/platform-matrix.md 路由:
微信视频号:先读系统凭据或 LOV_MEDIA_CRAWLER_YUANBAO_COOKIE,通过腾讯元宝解析分享链接,再由微信视频号接口取得 CDN 地址。缺少授权时运行一次可见浏览器授权:
python3 "$SKILL_DIR/scripts/authorize_yuanbao.py" --test-url URL
公共 Worker 默认禁用。只有用户明确接受把公开分享链接发送给该服务时,才使用 --allow-public-resolver;优先使用用户自建的 --worker-url。需要用户决定时(是否把链接交给公共解析服务、是否下载第三方取流程序),用宿主的 AskUserQuestion 提一个聚焦问题,不在对话里猜测同意。
元宝鉴权通过但返回空 wx_export_id(resolver_failed)说明发布方限制了微信外解析,重新授权无效。此时走微信客户端取流:download 默认 --via auto,在元宝失败且本机 wx_channels_download 在线时自动回退;--via wxclient 强制走此路径。准备步骤:
python3 "$SKILL_DIR/scripts/media_crawler.py" setup-wxclient # 下载固定版本、校验 SHA256、生成工作目录
bash "$SKILL_DIR/scripts/wxclient.sh" start # 用户自行执行:需要管理员权限
bash "$SKILL_DIR/scripts/wxclient.sh" status # 确认 API 在线且视频号页面已连接
启动会安装代理根证书并把系统代理指向 127.0.0.1:2023,属于系统安全设置,必须由用户在自己的终端执行,Agent 不得代跑。之后用户在微信 PC 端打开任意视频号页面并保持打开,Skill 通过 127.0.0.1:2022 的 /api/channels/feed/profile 取详情、/api/v1/download_task/create 建任务并轮询到完成,再做同样的媒体验证。
MediaCrawler 支持的平台:使用本机已有 checkout;没有时,先告知上游的非商业学习许可证,再执行:
python3 "$SKILL_DIR/scripts/media_crawler.py" setup-mediacrawler \
--accept-noncommercial-license
适配器固定已验证 commit、关闭评论抓取、只抓指定内容、启用媒体下载,并从 9333 起选择可用调试端口启动独立 Chrome Profile,不连接 9222 或其他已有调试实例。
直接媒体 URL:跳过浏览器与爬虫,直接进入传输层。
不要把 MediaCrawler 不支持视频号的事实隐藏起来;视频号适配器是本 Skill 的独立扩展路径。
python3 "$SKILL_DIR/scripts/media_crawler.py" download URL \
--output-dir OUTPUT_DIR \
--connections 8 \
--json-report OUTPUT_DIR/result.json
.part 文件;重试同一 URL 与输出路径,不创建第二份完整 payload。完成条件不是 HTTP 200,而是:
ftyp,WebM/MKV 检查 EBML,图片检查 PNG/JPEG/GIF/WebP 魔数;视频可用时再用 ffprobe 验证流、时长、编码与分辨率。Content-Length 一致(服务器提供时)。status、platform、source_url、output_path、bytes、elapsed_seconds、average_mbps、verification 和 context_id。视频号只能取得标题/封面但没有视频流时,状态必须是 authorization_required 或 resolver_failed,不得写成 downloaded。
首句给出成功/失败和本地文件路径。成功时补充大小、耗时、平均速度、平台和验证结果;失败时给出错误码、context_id、缺失条件和一条可直接复制的下一步命令。区分:
resolved:已拿到元数据或媒体 URL;downloaded:payload 已落盘;verified:容器/流与大小检查通过。ltaoo/wx_channels_download 固定版本 v260907,由 setup-wxclient 下载并校验;启动需管理员权限,微信 PC 端需已登录。完整平台边界见 references/platform-matrix.md,上游与许可证见 references/upstream-and-licenses.md,故障码见 references/troubleshooting.md。
用户在 Skill 驱动任务中提出修改意见时,继续当前产物前必须执行:
task-specific(仅本次)还是 reusable(可跨任务复用)。task-specific 只修改当前任务,不改 Skill。reusable 先确定作用域:领域规则先更新对应 canonical Skill;适用于所有 Skill 的规则先更新共享规范。reusable 修改会使此前的“确认”“继续”“发吧”失效;完成当前产物修改和回读后必须停下,等待用户下一步指示,不自动进入发布、提交或其他外部写入。