每日自动化内容抓取、筛选与整理工具。本项目从 Viral Brief 演进而来,第一版聚焦小红书和抖音:
- 使用已登录 Chrome 发现关注博主,并同步到本地账号池。
- 每日按评级生成巡检顺序,先跑小红书阶段,再跑抖音阶段,抓取最新内容。
- 可在设置里调整每轮同时打开的账号标签数,默认 6,范围 1-10,运行时会按可用内存自动下调。
- 账号池可一键把全部有效小红书主页同时打开到 Chrome 标签页。
- 小红书必须点赞和收藏都达标;抖音必须点赞、收藏和转发都达标;
1000+按超过 1000 处理。 - 稳定页面数据和稳定 DOM 证据可自动入选;截图/OCR 或弱文本推断只进入待复核。
- 每天生成本地网页结果,并导出 Markdown / HTML / CSV / ZIP。
前置条件:Node.js 22.5 或更高版本。
普通用户优先下载 GitHub Release 里的正式 macOS 包:Viral Brief Plus-*-mac.zip。正式包需要已经完成 Developer ID 签名和 Apple 公证;解压后双击 Viral Brief Plus.app 即可打开。
如果 macOS 提示“可能会危害系统”或“无法验证开发者”,说明你拿到的多半是未签名/未公证的本地开发包,不应作为公开发布版本发给普通用户。临时内测时,只在确认来源可信的前提下使用“右键 / Control-click 打开”,或到“系统设置 > 隐私与安全性”里选择“仍要打开”。xattr -dr com.apple.quarantine "Viral Brief Plus.app" 只适合开发者自测,不作为普通用户安装路径。
npm start默认打开本地仪表盘:
http://127.0.0.1:8787
如果端口被占用:
VBP_PORT=8797 npm start本地数据默认保存在 data/:
- 数据库:
data/viral-brief-plus.db - 截图:
data/screenshots/ - 导出:
data/exports/ - 配置:
data/config.json
可用 VBP_DATA_DIR=/your/path npm start 改数据目录。旧的 VB_* 环境变量仍兼容,但新项目优先读取 VBP_*。
- 打开仪表盘,进入“账号池”,点击“发现关注账号”。
- 如需人工检查小红书账号,点击“打开全部小红书主页”,系统会筛出有效主页并统一打开为多个 Chrome 标签页。
- 确认账号池里的小红书/抖音/视频号/公众号账号已配置好。
- 在“概览”点击“巡检网页内容”或勾选“先自动采集”后生成网页日报。
- 如需微信内容,单独点击“巡检微信视频号”;公众号文章使用“公众号文章导入”批量粘贴文章链接,确认/补录候选后再点击“生成微信日报”。
- 每条内容进入详情页后读取发布时间和互动数据;只要详情可采,就先截图并保存到本地。
- 巡检完成后,“今日候选”和“内容库”会显示新内容;网页日报用确定性阈值筛出达标内容,微信日报只整理窗口内已人工确认且关联账号池的微信内容。
- 在“每日结果”查看日报,或在“设置”里开启每日自动运行。
巡检顺序:网页内容按平台阶段执行,小红书阶段整体先于抖音阶段;微信视频号由独立按钮/API 发起。每个阶段内部按评级从高到低、添加时间从早到晚排序,缺少添加时间时随机打散。账号当天已经巡检过会跳过,避免重复跑同一主页。
小红书阶段会从左到右检查主页卡片,每个账号按设置的候选数上限检查完就切到下一个账号。置顶内容跳过;每次点击必须位于上一次点击右侧,防止重复点同一条;如果同一候选或详情在同一账号内打开两次,立即停止该账号。已采集过的内容只记录去重,不直接决定是否结束账号;详情页会主动读取标题和正文下方的“编辑于”发布时间。可采详情都会先保存,缺时间、标题不匹配或未达阈值不会在巡检阶段被丢掉;如果非置顶详情发布时间早于本次窗口,保存本条后结束当前博主巡检。保存成功或跳过不可采详情后优先点左上角关闭按钮回到主页,不重新打开主页链接。
抖音阶段先从主页点击第一条非置顶视频,进入详情页后优先点击右侧“下一个/下箭头”连续翻到后续视频;如果右侧按钮不可用、点击后页面不变或未停留在详情页,再回退到旧的逐候选详情链接方案。每条详情必须读取封面、点赞、收藏、转发、评论、标题、正文和发布时间;详情页会先暂停视频,再优先读取“举报”附近的可见发布日期。可采详情都会先保存;如果该发布日期已早于本次窗口,保存本条后结束当前博主巡检,巡检完成后再筛选是否入日报。一个账号实际处理完成后才标记当日已巡检,标签页立即关闭;停止前尚未处理完成的账号不会被跳过。
视频号巡检只操作 macOS 微信客户端内的视频号,不使用网页版链接。系统会先激活桌面微信主窗口、确认主页面可截图/可读取,然后点击微信左上角搜索框,输入账号池昵称,进入第一个放大镜/网络搜索结果行;在搜一搜结果页点击“视频”标签后,会在视频结果主栏匹配目标视频号账号行并打开博主主页视频网格。系统不会点击主微信 Dock 图标或重启微信,也不会使用微信页面自带截图、截图快捷键或剪贴板截图。由于微信窗口可以移动和缩放,左上搜索框、网络搜索结果行、搜一搜“视频”标签、目标视频号账号行、博主主页视频卡片和翻页动作都必须通过当前系统全屏截图或可读 AX 控件现场识别后才会执行;识别不到时只记录窗口锚点、截图特征、候选坐标和几何参考诊断并停止,不按粗略兜底坐标硬点。每个博主默认读取 3 条非置顶视频(可在设置中改为 1-10),主页会用截图网格识别视频卡片,并把 AX 暴露的“置顶/直播/预约”角标按几何关系贴回卡片后跳过;详情页点击“展开”只读取微信辅助功能暴露的文本,读不到完整文案时保存截图和诊断待补录,不调用 AI/OCR。采集点赞、转发、收藏/红心、评论并为每条保存截图后,系统优先在视频区域向下滚动切到下一条,并用截图指纹/AX 文案验证已经换片;滚动不生效时才轻微移动鼠标唤出右侧箭头,再用截图识别下箭头点击兜底。每个博主结束后发送两次 Command+W 回到微信主窗口/搜一搜标签页。公众号文章不自动访问历史消息页,也不绕过登录或验证;把单篇文章链接批量导入后,系统会尽量抽取标题、作者、正文和发布时间,并按公众号作者匹配账号池。采集结果进入候选池待人工确认;人工确认后的微信视频号/公众号内容可进入独立微信日报,不进入网页日报。
正式入选必须满足:
platform ∈ {douyin, xiaohongshu}
AND account_id 已关联账号池
AND content_type ∈ {video, article}
AND data_status == confirmed
AND (
xiaohongshu: like_count > 1000 AND favorite_count > 1000
douyin: like_count > 1000 AND favorite_count > 1000 AND share_count > 1000
)
1000+ 视为超过 1000;纯 1000 不入选。未知指标保留为 null,不会当成 0。
微信日报单独生成:只收 wechat_channels / wechat_article 中窗口内、已人工确认、已关联账号池、未归档、非重复的内容,不使用上述 1000 阈值。
AI 不参与入选判断。AI 只用于整理、聚类、标题建议和商业承接建议;日报里的互动数字都从本地数据库渲染。
npm start
npm test
npm run patrol
npm run report -- last_7_days
npm run package:mac本地 npm run package:mac 默认只生成未签名开发包。正式发布给 GitHub Release 前,需要使用 Apple Developer Program 的 Developer ID 证书和 notary API key:
VBP_MAC_SIGN_IDENTITY="Developer ID Application: Your Name (TEAMID)" \
VBP_MAC_NOTARIZE=1 \
VBP_NOTARY_KEY_PATH="/path/to/AuthKey_KEYID.p8" \
VBP_NOTARY_KEY_ID="KEYID" \
VBP_NOTARY_ISSUER_ID="ISSUER_UUID" \
npm run package:mac打包完成后检查 dist/releases/*-manifest.txt:公开发布包必须显示 signed=true 且 notarized=true。
当前测试覆盖指标标准化、平台必需指标筛选、1000+ 处理、证据可信度、RPA 详情页发布时间记录、巡检阶段先保存后筛选、跳过已见 URL、人类化动作边界、批量标签巡检、停止巡检入口、账号池批量打开、日报导出和 AI 反幻觉护栏。
npm test