微信公众号 → ima 知识库 监控入库
这个 Skill 做什么
把"监测某个微信公众号 → 过滤 → 去重 → 存入 ima 知识库"这条重复链路固化下来。
调用时只需给出公众号名、可选的过滤关键词、可选的目标知识库名,
本 Skill 跑完整套流程并汇报结果。换不同公众号、不同知识库,复用同一份逻辑。
调用参数(从用户原话里抽取,缺了就问)
| 参数 | 必填 | 说明 |
|---|---|---|
mp_name 公众号名 |
✅ | 要监控的微信公众号名称,如「勤思棠」。支持同音/形近字(棠/堂),以实际搜到的名为准。 |
keywords 过滤关键词 |
否 | 只保存标题/正文命中这些词的文章,如「卢麒元」「卢老师」。留空 = 该账号所有新文章都存(噪声大,建议先确认)。 |
kb_name 目标知识库 |
否 | ima 里要写入的知识库名,如「勤思堂」。留空 = 列出可写库让用户选,或主动询问。 |
> 单条调用示例:
> - "用 wechat-mp-to-ima 监控公众号「勤思棠」,只存跟卢麒元有关的,存到 ima 的「勤思堂」库"
> - "监控「财新周刊」所有新文章,存到 ima「财经剪报」库"
前置条件
- ima 连接器(ima-mcp)必须已连接。未连接时如实告知用户去设置页连接,不要伪造结果、不要反复重试。
- ima 工具均为 deferred 工具:必须先
ToolSearch加载对应 schema,再用DeferExecuteTool调用,严禁凭记忆猜工具名/参数名。 - 多连接器规则:若当前会话连了多个 ima 连接器(含司内版),写操作前必须先交互式询问用户选哪一个;只连一个就直接用。
执行流程
第 1 步:定位目标知识库
ToolSearch加载「可添加(可写入)知识库列表」工具 →DeferExecuteTool调用,找到名为kb_name的库,取knowledge_base_id。- 找不到就用「我的知识库」类列表按关键词搜。
- 不要凭记忆硬编 knowledge_base_id——每次都从工具返回拿。
第 2 步:发现新文章
WebFetch抓取搜狗微信搜索:https://weixin.sogou.com/weixin?type=2&query=<mp_name>(type=2 = 搜文章),
拿到文章标题、公众号名、发布时间、以及weixin.sogou.com/link?url=...跳转链接。- 同时用
WebSearch搜<mp_name> <keywords>交叉补充最近几天的新文章(搜索结果里公众号原文 URL 常为空,需配合搜狗)。 - 只保留公众号名命中的文章(排除同名冒牌号)。
第 3 步:过滤(仅当给了 keywords)
只保留标题或正文出现 keywords 中任意词的文章。勤思棠这类账号的"卢麒元讲话/博文整理/深度解读"都算命中。
排除明显无关内容(如稀土走私、德国政客等与目标人物无关的文章)。
第 4 步:去重
ToolSearch 加载「列举知识库内容」工具 → DeferExecuteTool 调用:knowledge_base_id + 排序 UPDATE_TS_DESC_SORT_TYPE,
拿到库内已有条目标题,剔除已保存过的(标题做模糊去重,略有差异也算重复)。
第 5 步:入库(对每篇新文章)
首选:用真实微信链接导入(能保留原文图片):import_urls(批量导入网页链接)只认 mp.weixin.qq.com 开头的最终文章地址,ima 会自动抓取正文并一并保留原文图片,入库存档质量最好。
⚠️ 绝对不要直接喂搜狗跳转链接 weixin.sogou.com/link?...——ima 会跟随跳转但落到搜狗反爬验证页(标题变"搜狗搜索"、正文是验证码),存一条废条目且 ima 无删除工具,只能用户在客户端手动删。
真实链接为何难拿:WebFetch 能跟随跳转并解析正文但不暴露最终 URL;裸 curl/urllib 请求会被弹到 /antispider 验证码页。所以真实 mp.weixin.qq.com 地址通常拿不到——若用户手头有原文链接、或从别处获得真实地址,优先用它导入(一次可多 URL,≤10 条)。
拿不到真实链接 → 文件入库兜底(已实测修通,可靠):WebFetch 抓正文 → 存本地 .md(带元数据包头)→ 走「create_media → 把文件 PUT 上传到返回的 COS → add_knowledge」三步(缺一步都不算成功)。落库的是 markdown_cls1_... 这种笔记/文档条目,ima 不要求原文链接,因此链接拿不到也完全不影响入库(代价:原文图片通常不随 md 带入,仅保留文字)。
- 用本 Skill 附带的 cos_upload.py 模板:把 create_media 返回的整段凭证 JSON 原样存成 _cos_creds.json,再 python cos_upload.py <文件> 即可,无需安装任何 SDK(只用标准库)。
- ⚠️ 两层坑都已踩平:① 外层签名串必须是 sha1\n<KeyTime>\n<内层SHA1>\n,只对内层哈希做第二层 HMAC 是错的(会报 SignatureDoesNotMatch);② 凭证要程序化读取,绝不手抄 secret_key(44 位 base64 里 l/1/I、o/0、u/v 极易看错)。
md 文件模板(带元数据,便于在 ima 里追溯来源):
---
source_mp: <公众号名,如 勤思棠>
publish_date: <发布日期,如 2026-09-10;未知则写 未知>
keywords: <命中关键词,未过滤则写 无>
saved_by: wechat-mp-to-ima
saved_at: <抓取时间 ISO>
original_url: <真实链接,拿不到就写 未获取>
---
# <文章标题>
<正文...>
- 文章已被删除(
WebFetch返回"该内容已被发布者删除")→ 跳过并记录。 - 入库是异步的,返回成功即代表资料已收下,不必等解析完成。
第 6 步:汇报
列出本次新入库的文章标题与数量,以及失败/跳过项及原因。
关键技术踩坑(务必遵守)
- 搜狗反爬:直接
curl搜狗/link跳转链接会触发反爬(302 跳/antispider);但WebFetch能跟随跳转并解析出微信文章正文,优先用它。 - 验证码/限流:搜狗偶尔弹验证码或限流。抓不到就正常结束、本轮跳过,下一轮再补,不要反复重试刷屏。
- 公众号无官方接口:只能靠搜狗 + 全网搜索发现新文章,偶发漏抓属正常,不要当成任务失败。
- 微信内容常被下架:部分文章很快被删,那轮抓不到正文会被标记跳过——这是微信侧限制,不是 Skill 问题。
- ima 鉴权失败/无权写入:引导用户重新连接 ima,不要反复重试。
- import_urls 不能接搜狗跳转链接:会存进搜狗反爬验证码页(一条废的"网址"条目),且 ima 当前无删除工具,需用户在 ima 客户端手动删除。这是本 Skill 已实测的坑。
- 真实微信文章链接极难获取(但仍链接优先、拿不到走兜底):WebFetch 不回显最终 URL、裸 HTTP 请求触发搜狗反爬,所以
mp.weixin.qq.com真地址通常拿不到。本 Skill 仍优先尝试import_urls(真实链接能自动保留原文图片,质量最好);拿不到时退化到文件入库兜底(已实测修通、可靠),完全不阻塞入库。 - COS 文件上传(兜底路径,v1.2 已实测修通):用本 Skill 附带的
cos_upload.py,把create_media返回的凭证 JSON 整段原样存成_cos_creds.json,再python cos_upload.py <文件>。⚠️ 两层坑都已踩平:① 外层签名串必须是sha1\n<KeyTime>\n<内层SHA1>\n,只对内层哈希做第二层 HMAC 是错的(报SignatureDoesNotMatch);② 凭证程序化读取,绝不手抄secret_key(44 位 base64 里l/1/I、o/0、u/v极易看错)。模板只用标准库,无需装 SDK。
失败处置速查
| 现象 | 处置 |
|---|---|
| ima 未连接/鉴权失败 | 让用户去设置页重连 ima,停止任务 |
| 找不到目标知识库 | 用可写库列表重新定位,或询问用户 |
| 搜狗抓不到 | 本轮跳过,下轮再补 |
| 文章已删除 | 跳过并记录 |
| 批量导入部分失败 | 只对失败项重试一次,避免重复入库 |
| import_urls 喂了搜狗链接,存进验证码页 | 立即停止;告知用户在 ima 客户端手动删除该"搜狗搜索"条目;下次只喂真实 mp.weixin.qq.com 链接 |
| COS 上传报 SignatureDoesNotMatch | 99% 是外层签名串构造错(第二层 HMAC 消息必须是 sha1\n<KeyTime>\n<内层SHA1>\n),或 secret_key 抄错;改用本 Skill 的 cos_upload.py 模板 + 原样存凭证,不要手敲 |