🔄 卡若AI 同步 2026-03-26 05:02 | 更新:Cursor规则、总索引与入口、金仓、金盾、水桥平台对接、水溪整理归档、卡木、火炬、运营中枢、运营中枢参考资料等 | 排除 >20MB: 12 个

This commit is contained in:
2026-03-26 05:02:40 +08:00
parent 211950ce7d
commit f6c76514a2
70 changed files with 6124 additions and 2253 deletions

View File

@@ -27,7 +27,7 @@ alwaysApply: true
## 强制复盘(每次对话结束)
**每次对话的最后一条回复,必须以完整复盘块收尾。** 格式严格按 `运营中枢/参考资料/卡若复盘格式_固定规则.md`,包含 🎯📌💡📝▶ 五,带具体日期+时间YYYY-MM-DD HH:mm。不可省略、不可用简版。即使是简单任务也必须复盘。
**每次对话的最后一条回复,必须以完整复盘块收尾。** 格式严格按 `运营中枢/参考资料/卡若复盘格式_固定规则.md`,包含 🎯📌💡📝▶ 五主块 + 叠层,带具体日期+时间YYYY-MM-DD HH:mm**🎯 极简三行**(目标·结果·达成率 **XX%****🎯 块后须单独一行「➡️ 🎯 块后达成率复述XX%」****紧接其后须写「🧠 Human 3.0(复盘快扫)」**(本质/边界/挑战/证据 四条,与火组智能追问 Skill 中 Human 3.0+CRITIC 对齐,细则见同文件);**▶ 块后须单独一行「📊 复盘结束达成率复述XX%」**(两处 XX% 与 🎯 达成率一致)。**项目开发类**(写代码/改仓库/开发文档 110/部署/命中火炬「全栈开发」「前端开发」「全栈测试」「项目开发占卜术」等)须在 **🧠 之后、📌 之前** 增加 **☯ 奇门 Q门 3.0(项目盘)****盘势总完成度 XX%**、**八门各 YY%+灯+一句**、**➡️ ☯ 块后盘势复述 XX%**;非开发类 ☯ 一行简写「八门不起」且盘势与 🎯 同源。不可省略、不可用简版。即使是简单任务也必须复盘。
## Soul 创业派对子项目(多根工作区)
@@ -37,13 +37,12 @@ alwaysApply: true
- **每日对话收集**(每天仅一次):检查 `last_chat_collect_date.txt` → 非今日则执行 `python collect_chat_daily.py`
- **Gitea 同步**:对话结束前有文件变更时执行 `bash 自动同步.sh`(单文件 >20MB 不提交)
- **飞书复盘发群(强制关闭·默认零推送)**:写完卡若复盘块**之后****禁止**自动执行 `send_review_to_feishu_webhook.py`**禁止**因「本轮对话结束」「任务做完」而推送。飞书群机器人消息可能被成员在飞书或关联微信里看到——**默认不向该群推送**卡若AI 日常对话复盘。**唯一例外**:用户**当轮对话中明确口述**要发例如「把本条复盘发到飞书群」「复盘发飞书群」且主任务在卡若AI 仓库时,才可手动执行一次:
`python3 "/Users/karuo/Documents/个人/卡若AI/02_卡人/水桥_平台对接/飞书管理/脚本/send_review_to_feishu_webhook.py" "简洁复盘"`≤500 字)。**不得**因其他 `SKILL.md` 里曾写过「本步可发群」而在用户未当轮明说时代发。
- **飞书群消息(全局禁发)**:所有“发飞书群/群 webhook/机器人群推送”命令一律不执行(含 `send_review_to_feishu_webhook.py`、读书笔记发群、分发预警发群等)。无例外,除非用户后续明确撤销本条禁令并重新授权。
- **终端命令**一律直接执行不询问50 字内说明后执行
- **常规操作**:优先命令行 + 复用现成流程,不提问
- **默认零提问(强制)**:开发、改需求、跑脚本、查日志、部署类任务,**禁止**向卡若发起「是否执行」「要不要我…」「请选一个」等确认式提问。缺信息时:**先读仓库配置 / 代码 / 环境变量 / 文档** → 合理默认 → **直接做完**。仅当 **客观上无法代劳** 时极简说明缺什么(如:本机短信验证码、支付密码、用户明文密钥未配置、明确不可逆删除且规范要求人工确认)。
- **Skill 更新后·流水线「下一步」= 立即开跑(强制)**:用户说「下一步」「接着跑」「从跑完下一步」「重新剪辑」「直到全部完成」「别问我直接执行」等,或**刚同步完**某条 Skill如 `Soul竖屏切片`、`木叶_视频切片`)后要继续产出时,视为已授权**连续执行**:按该 Skill 的标准步骤从**当前缺口**自动往下做(例:缺 `transcript.srt` 则先抽音频+MLX/Whisper再 `batch_clip`,再 `soul_enhance` 成片)。**第一步起就不要问**「要不要帮你跑」;用本机路径惯例(如 `~/Movies/soul视频/第N场_*_output/`、`卡若AI/03_卡木/.../视频切片/脚本`)与仓库内 `场次稿`/`highlights.json` 合理补全。仅当**客观阻塞**(如无原片文件、磁盘满、需用户独占凭证)时用**一句话**说明卡点,不展开选项问卷。
- **直接执行模式**:当用户明确要求「直接做 / 不要罗列 / 别讲写了什么」时,以**改代码与跑通为主**,正文**极简**可≤3句**复盘块仍放在回复最末且保持完整五块**(与 `soul-karuo-dialogue.mdc` 一致)。
- **直接执行模式**:当用户明确要求「直接做 / 不要罗列 / 别讲写了什么」时,以**改代码与跑通为主**,正文**极简**可≤3句**复盘块仍放在回复最末且保持完整格式**🎯📌💡📝▶ + ➡️🧠☯📊 等叠层,与 `soul-karuo-dialogue.mdc` 一致)。
- **飞书日志**:直接执行 `write_today_three_focus.py`,不询问
- **对外输出**:报告/图片 → `/Users/karuo/Documents/卡若Ai的文件夹/` 下对应子目录;图片登记 `图片/图片索引.md`
- **数据库**:一律用唯一 MongoDB27017库名 `karuo_site`);卡若 AI 调用以此库为主(记忆条目、对话记录、消息内容)

View File

@@ -0,0 +1,14 @@
---
name: 项目开发占卜术Cursor 入口)
description: 卡若AI 火炬 F01c。奇门 Q门 3.0 八门项目盘 + 复盘 ☯ 叠层。触发项目开发占卜术、Q门3.0、八门复盘、起盘、盘势。
---
# 项目开发占卜术 · Cursor 入口
**完整流程与模板**请读仓库内正文(单源):
`04_卡火/火炬_全栈消息/项目开发占卜术/SKILL.md`
**复盘格式**(含 ☯ 块位置与八门骨架):
`运营中枢/参考资料/卡若复盘格式_固定规则.md` → 章节「奇门 Q门 3.0 叠层」

1
.gitignore vendored
View File

@@ -103,6 +103,7 @@ _大文件外置/财务管理_data/chat.snapshot_收集.db
01_卡资/金仓_存储备份/大文件外置/财务管理_data/chat.snapshot_收集.db
01_卡资/金仓_存储备份/服务器管理/scripts/.venv_aliyun/lib/python3.14/site-packages/cryptography/hazmat/bindings/_rust.abi3.so
01_卡资/金仓_存储备份/服务器管理/scripts/.venv_tat/lib/python3.14/site-packages/cryptography/hazmat/bindings/_rust.abi3.so
01_卡资/金仓_存储备份/聊天记录管理/日志/chat_sync_incremental.log
03_卡木/木叶_视频内容/视频切片/切片动效包装/10秒视频/node_modules/.cache/webpack/remotion-production-4.0.427/a233e9cccba253c3b0157f54cad843b8/0.pack
03_卡木/木叶_视频内容/视频切片/切片动效包装/10秒视频/node_modules/.remotion/chrome-headless-shell/mac-x64/chrome-headless-shell-mac-x64/chrome-headless-shell
03_卡木/木叶_视频内容/视频切片/切片动效包装/10秒视频/node_modules/@rspack/binding-darwin-x64/rspack.darwin-x64.node

View File

@@ -1,245 +1,85 @@
{
"updated": "2026-03-24T00:01:35.965497+00:00",
"updated": "2026-03-25T21:02:20.031297+00:00",
"conversations": [
{
"对话ID": "699c0fd2-3458-4324-bf8a-187e67fab318",
"名称": "视频号销售话术撰写",
"项目": "工具维护",
"首条消息": "写个在视频号 120字-200个字的销售 我的产品的话术 ",
"创建时间": "2026-03-23T23:59:30.592000+00:00",
"消息数量": 10
},
{
"对话ID": "fa216c69-a95e-4d89-99f9-2af922bfcdd6",
"名称": "User behavior trigger points analysis",
"项目": "Soul创业",
"首条消息": "Please search the codebase at /Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平/ for ALL user behavior trigger points that exist in the system. I need a comprehensive list.\n\nSpecifically search for:\n1. In miniprogram/utils/trackClick.js - all uses of trackClick() across all miniprogram pages\n2. In soul-api/internal/handler/ - all places where user_tracks records are created or checked (action values like 'view_chapter', 'card_click', 'match', 'purchase', 'lead_submit', etc.)\n3. Payment callbacks /",
"创建时间": "2026-03-23T17:15:53.624000+00:00",
"消息数量": 100
},
{
"对话ID": "2397474f-e5ba-4910-b936-9fb76bab3d93",
"名称": "项目调研",
"对话ID": "d6fa506f-856d-4073-85e4-7bddc21a98e4",
"名称": "Exec tool permission configuration",
"项目": "未分类",
"首条消息": "https://aihirehumans.com/ 下载这个网站的每一个页面,每一个点击,然后每个按钮,然后把这个网站那作为一个调研它的整个商业模式运营逻辑。这个网站做一个调研的截图,全部截图下来。",
"创建时间": "2026-03-23T15:27:46.160000+00:00",
"消息数量": 28
"首条消息": "▶ 下一步执行\n",
"创建时间": "2026-03-25T13:21:07.791000+00:00",
"消息数量": 176
},
{
"对话ID": "3c3b90dd-96a8-464b-8cde-84d05a679ef5",
"名称": "Docker运行",
"项目": "服务器",
"首条消息": "运行docker",
"创建时间": "2026-03-23T13:04:42.494000+00:00",
"消息数量": 4
},
{
"对话ID": "27537490-475f-4f56-9a1e-7e4bca223179",
"名称": "网站-api网关",
"对话ID": "4dbb4669-de0b-4a6c-a61f-b17a6d77a47c",
"名称": "网站-卡若ai-对话2",
"项目": "卡若AI",
"首条消息": "这个api key sk-h7VW10iTSSXo6xJXe44nI1vUhsEcG3H8Z9XyFmWABvhaD4ZW. 只用这个不用其它的 https://api123.icu/about 阅读一下这个文档或这个文档的子链接了解清楚后安装,以后类似这种也可以自定义配置把它配置到这个网关里面,那个卡洛的网站的那个 API 网关里面,然后运行一下网站 ",
"创建时间": "2026-03-23T12:41:57.994000+00:00",
"消息数量": 46
"首条消息": "让卡罗 AI 的对话,那个对话功能拥有这个能力,然后那个第二个的话,就是文件的这个地方导入,这个地方是可以直接读取本地的一个目录,直接把目录导入进来,这个跟工作台是一样了,直接可以导入,而不是纯粹是添加。然后右键目录的话要有跟科室相应的一个功能",
"创建时间": "2026-03-25T13:13:20.207000+00:00",
"消息数量": 75
},
{
"对话ID": "a4f65a6c-1c9a-4b89-a4ca-9d8da25388c4",
"名称": "Docker usage",
"项目": "服务器",
"首条消息": "打开docker",
"创建时间": "2026-03-23T12:36:12.801000+00:00",
"消息数量": 8
},
{
"对话ID": "6afeb85a-5117-478f-a216-b3bfebae5b51",
"名称": "信用卡请求",
"对话ID": "6c60027a-1832-42fe-8aac-d12ccddfbf1b",
"名称": "Directory structure and document review",
"项目": "卡若AI",
"首条消息": "卡若ai把我的信用卡发给我",
"创建时间": "2026-03-23T12:09:02.290000+00:00",
"消息数量": 13
"首条消息": "Explore the directory at /Users/karuo/Documents/开发/3、自营项目/卡若ai网站/开发文档/ to understand:\n\n1. The full directory structure of 开发文档\n2. Check if there are images in /Users/karuo/Documents/开发/3、自营项目/卡若ai网站/开发文档/1、需求/修改/images/ - list all image files there\n3. Read any other requirement documents in the 修改 folder\n4. Read the main 需求文档.md or any overview requirement docs\n5. Check for any 开发进度.md or similar progress tracking files\n\nReturn the complete directory listing and contents of key planning document",
"创建时间": "2026-03-25T12:14:37.774000+00:00",
"消息数量": 2
},
{
"对话ID": "462c354b-4f31-4180-9069-aad14a8a0937",
"名称": "卡若ai 邮箱注册",
"对话ID": "2e14abba-d975-4bb5-a5d8-604faa84752c",
"名称": "卡若ai网站",
"项目": "卡若AI",
"首条消息": "卡若ai 用skill注册一个邮箱",
"创建时间": "2026-03-23T12:03:58.396000+00:00",
"消息数量": 10
},
{
"对话ID": "5d22bebc-ecf7-46b2-aede-bea3b0b14d93",
"名称": "Rule configuration UI in admin panel",
"项目": "Soul创业",
"首条消息": "In the project at /Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平, I need to understand the rule configuration UI in the admin panel.\n\n1. Search for \"UserRule\" or \"user-rules\" or \"规则配置\" in the admin frontend (soul-admin/src/)\n2. The rules tab is in UsersPage.tsx - find the \"rules\" TabsContent section and report the full JSX for it\n3. Read the existing rules CRUD UI - how are rules listed, created, edited?\n4. Check if descriptions are currently shown inline\n\nReport all findings with exact line nu",
"创建时间": "2026-03-23T10:14:23.470000+00:00",
"消息数量": 18
},
{
"对话ID": "4ef4d028-04ea-4ea1-b7ce-e43b353b10ca",
"名称": "Web CLI skill integration",
"项目": "卡若AI",
"首条消息": "上面搜索网页cli的 skill。GitHub 上面搜索最新的网页,西游记分数最高的那个,然后帮我整合到卡罗伊的 skill 里面",
"创建时间": "2026-03-23T08:19:23.549000+00:00",
"消息数量": 129
},
{
"对话ID": "f8f37966-e2ff-42a0-90bc-a28c005698c6",
"名称": "Clash Verge new subscription configuration",
"项目": "工具维护",
"首条消息": "https://bwcda.no-mad-world.club/link/QwF7wqt15vlgnKIA?clash=4&extend=1 音乐地址那个帮我填到这个。这个软件上面新建配置,帮我填写好,并且确定可以连接。他现在是连接的那个。用我这个。",
"创建时间": "2026-03-23T06:31:33.158000+00:00",
"消息数量": 24
},
{
"对话ID": "0a6fd00e-05a3-4706-ac95-f01d955804d1",
"名称": "Magisk installation on Type-C phone",
"项目": "未分类",
"首条消息": "你把那个Magisk装到这台电脑连接的 type c 连接这个手机里面,",
"创建时间": "2026-03-23T06:26:50.293000+00:00",
"消息数量": 16
},
{
"对话ID": "03403ba5-3808-4208-99d1-61d35d6986a5",
"名称": "龙虾安装简单解决方案",
"项目": "未分类",
"首条消息": "等一下,国内安装龙虾最简单的一个方式,当前搜索前往,给我一个最简单的一个解决方案",
"创建时间": "2026-03-23T06:01:42.733000+00:00",
"消息数量": 18
},
{
"对话ID": "aa70825b-eec2-4373-8c0f-86d550114599",
"名称": "下载视频号助手 macbook",
"项目": "微信管理",
"首条消息": "下载视频号助手 macbook",
"创建时间": "2026-03-23T05:43:55.225000+00:00",
"消息数量": 16
},
{
"对话ID": "98abcf81-b237-44b7-af5a-dfe6d5bcb0ed",
"名称": "卡路亚复盘推送功能讨论",
"项目": "飞书",
"首条消息": "卡路亚不默认把复盘推到指定的群内。不强制,每一次对话都推,现在先取消这个功能,那已推的一定是有捆绑的业务,捆绑确定清楚在这个工作区才推",
"创建时间": "2026-03-23T01:46:48.301000+00:00",
"首条消息": "@卡若ai网站/开发文档/1、需求/修改/全站功能1 20260325.md ",
"创建时间": "2026-03-25T12:14:03.547000+00:00",
"消息数量": 43
},
{
"对话ID": "8af5b60d-31d1-4486-b8e3-4f59cff74c8d",
"名称": "这个是视频号的那个直播的视频号直播的那个接口。直播的这个接口看一下这个直播的接口有哪一些我可以直接直播接口的开放能力看一下这个开放能力具体能做些什么事情以及咱们在咱们这个项目里面在视频号smart 这个项目里面能做哪一些操作?",
"项目": "微信管理",
"首条消息": "这个是视频号的那个直播的视频号直播的那个接口。直播的这个接口看一下这个直播的接口有哪一些我可以直接直播接口的开放能力看一下这个开放能力具体能做些什么事情以及咱们在咱们这个项目里面在视频号smart 这个项目里面能做哪一些操作?",
"创建时间": "2026-03-23T01:14:52.624000+00:00",
"消息数量": 81
},
{
"对话ID": "6a7c9cba-36ab-423a-a3a4-178da1908343",
"名称": "微信豆充值网页发一个给我",
"项目": "微信管理",
"首条消息": "微信豆充值网页发一个给我",
"创建时间": "2026-03-23T00:27:19.558000+00:00",
"消息数量": 22
},
{
"对话ID": "d932a36a-3023-425a-971b-bddaf36bebd8",
"名称": "soul 身份证注销 现在一张身份证只能使用3个帮我看一下注销的一个形式我的是我的号还被封了怎么样解决这个无法登录、无法注销怎么操作",
"项目": "Soul创业",
"首条消息": "soul 身份证注销 现在一张身份证只能使用3个帮我看一下注销的一个形式我的是我的号还被封了怎么样解决这个无法登录、无法注销怎么操作",
"创建时间": "2026-03-22T21:31:52.443000+00:00",
"消息数量": 10
},
{
"对话ID": "9f39025b-f695-4d7b-aff7-c124226e307e",
"名称": "Exploration of soul project codebase",
"项目": "Soul创业",
"首条消息": "I need to explore the soul project codebase to understand the current state for implementing user behavior tracking and user journey features. Please find and report:\n\n1. In soul-api/internal/model/ - list all model files and check if there's already any behavior/tracking/journey related models\n2. In soul-api/internal/handler/ - check if there's any behavior tracking handler\n3. In soul-api/internal/router/router.go - check what routes exist under miniprogram group and admin/db group (just list t",
"创建时间": "2026-03-22T05:58:48.655000+00:00",
"消息数量": 31
},
{
"对话ID": "053fb5a6-fc59-466d-8805-62515dc228dc",
"名称": "网站-数据统计",
"对话ID": "0553f51b-43ce-4ad9-a363-8656d42a9b75",
"名称": "Project structure and tech stack exploration",
"项目": "卡若AI",
"首条消息": "那个像卡路里有更新这个数据统计的这个功能以及数据统计的所有的锚点在开发的时候这一个每一个标签的一个图数据统计以及每一个业务的数据统计描点锚点的这个相关的功能更新到10个月里面在开发的时候要特别注意。然后这个是属于那个每个前端跟用户行为的一个点击从用户行为、用户2的以及用户可以看一下可以参考一下这个一场售的创业实验咱们这一个上面的一个点击的案例抽象出任何的网站都要做一个点击的一个锚点以及最对其他网站点击锚点的一个统计的一个功能的一个更新。那然后这个是数据统计这一方面的更新一下这个卡若ai开发的相关 skill",
"创建时间": "2026-03-22T04:20:21.824000+00:00",
"消息数量": 60
"首条消息": "Thoroughly explore the project at /Users/karuo/Documents/开发/3、自营项目/卡若ai网站 to understand its complete structure. I need:\n\n1. The top-level directory structure\n2. The tech stack (package.json, config files, etc.)\n3. The frontend framework and routing structure\n4. Key pages/components related to:\n - Chat/对话 functionality\n - Integration/集成 functionality \n - Task/任务 functionality\n - Voice/语音 functionality\n5. The current sidebar/navigation structure\n6. API routes and backend structure\n7. Any ",
"创建时间": "2026-03-25T12:14:33.420000+00:00",
"消息数量": 38
},
{
"对话ID": "c773987b-0ff2-48dc-8969-5c669492065b",
"名称": "超级个体资料页",
"项目": "Soul创业",
"首条消息": "'/Users/karuo/Library/Mobile Documents/com~apple~CloudDocs/Documents/婼瑄' 那个把超级个体这一个阿猫住鼓浪屿,包租婆,她在投资人的定位,把阿猫的相应的这一些变成一个,完善一下这个资料看起来更有吸引力,然后有更多的一个链接。可以看一下阿猫的那个职业定位,看一下这些内容,职业定位让它完善一下暗猫的个人主页,把它数据填充进去,把这个写入后台的那个不是站位,写入咱们项目后台的那个数据库里面,招超级个体的名字跟内容就不要写,直接写进去。直接就是完善这个。爱赛车的阿猫的资料就可以了,和个人介绍按照我们的格式完善",
"创建时间": "2026-03-22T02:12:47.079000+00:00",
"消息数量": 245
},
{
"对话ID": "689fcb3d-379a-4ff1-b8d5-513d5da0ec90",
"名称": "Voice input correction library",
"对话ID": "cb97f746-c683-4ff2-9942-d5254cdf640e",
"名称": "项目结构和功能探索",
"项目": "卡若AI",
"首条消息": "/Users/karuo/Documents/个人/卡若AI/03_卡木/木叶_视频内容/视频切片/脚本/soul_enhance.py\n\n一个参考这一个纠错的一个规则我是用语音输入的然后用闽南话的口音然后卡罗伊那个听我聊的那个过程当中所有的内容的一个纠错库帮我有一个纠错的库我语音输给你的文字的一个纠错库。每一对话的时候解析的时候都看一下这个纠错库然后来纠正这整个的一个东西它不断的去迭代那更新一下卡罗拉的 skill那这个参上面这个是参考的文件已经有产生了一些参考的一些文件以后都是有新的纠错的话就直接帮我纠错。弄到那个纠错库里面按我自己的长期的一些那个话术去迭代一下然后聊天的内容去迭代一下这个纠错的那个绘画的那个表述增加我表述的精准性。更新一下卡罗拉的 skill",
"创建时间": "2026-03-22T00:02:58.917000+00:00",
"消息数量": 80
"首条消息": "请全面探索 /Users/karuo/Documents/开发/3、自营项目/卡若ai网站 这个项目的结构。我需要了解:\n\n1. 项目根目录下有哪些文件和文件夹\n2. package.json 的内容Node版本、依赖、scripts等\n3. 前端技术栈React/Next.js/Vue等\n4. 是否已有对话/聊天相关的页面或组件\n5. 是否已有语音相关的功能\n6. 路由结构\n7. API 接口结构\n8. 现有的工作台/控制台功能\n\n请返回完整的项目结构树到3层深度、package.json关键内容、以及与对话/聊天/语音相关的所有已有代码文件路径。",
"创建时间": "2026-03-25T11:39:32.377000+00:00",
"消息数量": 14
},
{
"对话ID": "bfd8e284-d1aa-4650-9a19-f4a3854d1580",
"名称": "网站-小程序上传",
"项目": "开发",
"首条消息": "发布小程序",
"创建时间": "2026-03-21T22:28:34.185000+00:00",
"消息数量": 247
"对话ID": "6a5cf58c-1a8f-4c50-8b79-597dce8fc265",
"名称": "网站-ai对话",
"项目": "卡若AI",
"首条消息": "@卡若ai网站/开发文档/1、需求/修改/对话功能1 20260325.md ",
"创建时间": "2026-03-25T11:38:49.333000+00:00",
"消息数量": 65
},
{
"对话ID": "006964ad-087f-4028-940f-4725aaace815",
"名称": "网站-部署",
"项目": "服务器",
"首条消息": "网站-部署\n\n\n那个将代码部署到那个kr宝塔服务器。\n\n并且检查所有的问题。",
"创建时间": "2026-03-21T22:20:49.909000+00:00",
"消息数量": 33
"对话ID": "aa66e6c1-d1b3-4783-8d8f-c91b6b7697da",
"名称": "苹果host文件清理与还原",
"项目": "工具维护",
"首条消息": "清理苹果host文件 无关的指向的配置,还原成原来的",
"创建时间": "2026-03-25T08:40:02.374000+00:00",
"消息数量": 11
},
{
"对话ID": "9ef83ef1-f3d0-420e-b6e3-147e50b14d9b",
"名称": "获客列表优化与用户管理修改",
"项目": "Soul创业",
"首条消息": "在 Soul 创业派对管理端项目中(路径:/Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平/soul-admin/),完成以下修改:\n\n1. **获客列表优化与去重**\n - 找到获客列表相关页面,可能在 soul-admin/src/pages/users/UsersPage.tsx 的\"获客列表\" tab\n - 或者在 soul-admin/src/pages/find-partner/FindPartnerPage.tsx\n - 搜索关键词获客、leads、ckb-leads、lead\n - 优化列表展示确保去重按手机号或openId去重\n - 改善空状态展示\n\n2. **用户管理 RFM 算法区默认折叠确认**\n - 在 UsersPage.tsx 中确认 RFM 算法配置区是默认折叠状态collapsed\n - 如果不是,改为默认折叠\n\n请直接修改代码。返回修改了哪些文件、做了什么改动。注意\n- 管理端只能调用 /api/admin/* 或 /api/db/* 路径\n- 使用 src/",
"创建时间": "2026-03-21T22:08:25.205000+00:00",
"消息数量": 45
},
{
"对话ID": "cfbeaf02-a6cb-44b5-ba51-875321e5717e",
"名称": "文件内容关键代码查询",
"项目": "Soul创业",
"首条消息": "请帮我读取以下文件内容并返回关键信息:\n\n1. `/Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平/soul-api/internal/handler/book.go` - 搜索 `BookStats` 函数和 `is_free` 或 `isFree` 相关查询逻辑,返回完整函数代码\n2. `/Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平/soul-admin/src/pages/dashboard/DashboardPage.tsx` - 搜索新注册用户列表的渲染逻辑,找到用户名显示为\"-\"的位置\n3. `/Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平/soul-api/internal/handler/admin_chapters.go` - 搜索分页相关参数处理page/pageSize\n4. `/Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平/soul-api/internal/handl",
"创建时间": "2026-03-21T15:25:59.126000+00:00",
"消息数量": 29
},
{
"对话ID": "fa84ef5b-b610-4bb8-a7c6-2c93cfecfd45",
"名称": "项目对话总结复盘",
"对话ID": "b59869de-8773-4daa-bf91-ea035a44b962",
"名称": "手机设备和面具的安装与root",
"项目": "未分类",
"首条消息": "从 MongoDB 数据库里面来获取今天这个项目的所有对话总结的一个复盘",
"创建时间": "2026-03-21T15:24:29.642000+00:00",
"消息数量": 18
"首条消息": "",
"创建时间": "2026-03-25T08:15:00.054000+00:00",
"消息数量": 6
},
{
"对话ID": "91944d67-cf9e-4bbe-a822-7fa987e4692d",
"名称": "网站-用户管理",
"对话ID": "76202aab-5702-422b-affc-3479e6a9a46d",
"名称": "MacBook 上安装 Soul",
"项目": "Soul创业",
"首条消息": "网站-用户管理@一场soul的创业实验-永平/开发文档/1、需求/修改/20260321 用户管理1.md ",
"创建时间": "2026-03-21T14:47:42.120000+00:00",
"消息数量": 121
},
{
"对话ID": "9b887948-55d5-43a6-b6f0-fc634fd1973c",
"名称": "我的页面布局与图标修改",
"项目": "开发",
"首条消息": "网站-小程序\n\n下方我的订单跟我的代付去掉我的代付换一个图标图标保持一致然后把匹配伙伴跟那个我的余额的位置换一下代付的这个图标改一下。",
"创建时间": "2026-03-21T13:13:32.596000+00:00",
"消息数量": 108
},
{
"对话ID": "eba9cfc8-a4d9-4216-baf2-a298392f81e3",
"名称": "Backend handlers and routes exploration",
"项目": "Soul创业",
"首条消息": "Explore the soul-api backend at /Users/karuo/Documents/开发/3、自营项目/一场soul的创业实验-永平/soul-api/ to find all handlers and routes related to:\n\n1. Distribution / 分销 / referral / 推广\n2. Dashboard statistics / 数据概览\n3. User binding / 绑定关系 management\n4. Click tracking / 点击统计\n5. VIP members / 会员权益 configuration\n6. Content ranking / 热度 / sorting algorithms\n7. Chapter ordering / 排序\n\nSearch in internal/handler/ and internal/router/ directories for: distribution, referral, dashboard, bind, click, track, vip, rank,",
"创建时间": "2026-03-21T12:50:28.855000+00:00",
"消息数量": 41
"首条消息": "macbook 上安装soul",
"创建时间": "2026-03-24T21:53:10.200000+00:00",
"消息数量": 48
}
]
}

View File

@@ -0,0 +1,17 @@
#!/bin/bash
set -euo pipefail
PYTHON_BIN="/usr/bin/env python3"
INDEX_SCRIPT="/Users/karuo/Documents/个人/卡若AI/01_卡资/金仓_存储备份/聊天记录管理/脚本/ensure_mongo_chat_indexes.py"
SYNC_SCRIPT="/Users/karuo/Documents/个人/卡若AI/01_卡资/金仓_存储备份/聊天记录管理/脚本/realtime_chat_sync.py"
LOG_DIR="/Users/karuo/Documents/个人/卡若AI/01_卡资/金仓_存储备份/聊天记录管理/日志"
mkdir -p "$LOG_DIR"
{
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始每日索引巡检"
$PYTHON_BIN "$INDEX_SCRIPT"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 索引巡检完成,开始刷新项目分类汇总"
$PYTHON_BIN "$SYNC_SCRIPT" --sync-all --only-new
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 每日巡检与刷新完成"
} >> "$LOG_DIR/chat_index_daily.log" 2>&1

View File

@@ -0,0 +1,14 @@
#!/bin/bash
set -euo pipefail
PYTHON_BIN="/usr/bin/env python3"
SCRIPT="/Users/karuo/Documents/个人/卡若AI/01_卡资/金仓_存储备份/聊天记录管理/脚本/realtime_chat_sync.py"
LOG_DIR="/Users/karuo/Documents/个人/卡若AI/01_卡资/金仓_存储备份/聊天记录管理/日志"
mkdir -p "$LOG_DIR"
{
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始增量同步"
$PYTHON_BIN "$SCRIPT" --sync-all --only-new
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 增量同步完成"
} >> "$LOG_DIR/chat_sync_incremental.log" 2>&1

View File

@@ -1,104 +1,104 @@
---
name: 远程环境一键部署
version: "1.0"
version: "3.0"
owner: 金盾
group: 金
triggers: [远程部署, 一键部署, 装Clash, 装Cursor, 远程装环境]
updated: "2026-02-14"
description: 远程服务器环境一键配置与Clash代理部署
triggers: [远程部署, 一键部署, 装Clash, 装Cursor, 装飞书, 装龙虾, OpenClaw部署, 飞书机器人部署, 飞书不回复, 龙猫不回复, 远程装环境]
updated: "2026-03-24"
description: 跨平台一键部署 Feishu + OpenClaw龙虾支持本地与远程内置飞书不回复故障排查、自动验收与回滚。
---
# 远程环境一键部署
> 一句话说明:一键在远程 Windows/Mac 系统上安装 Clash Verge Rev代理+ Cursor编辑器自动配置订阅和账号
> 一句话说明:一键在 macOS / Linux / Windows 安装 Feishu + OpenClaw龙虾写入机器人配置并完成健康检查支持本地部署与 SSH 远程部署
---
## 触发条件
## 能做什么Capabilities
用户说以下关键词时自动激活:
- 远程部署、一键部署
- 装 Clash、装 Cursor
- 远程装环境、部署远程机器
- 跨平台安装Feishu 客户端 + OpenClaw CLI
- 一键配置:写入 `~/.openclaw/openclaw.json` 的 Feishu 账号(`longmao`
- 两种模式:本地执行 / SSH 远程执行
- 上线验证:`openclaw channels status --probe --json`
- 实发验收:向指定 Feishu 群或用户发送上线通知
- 回滚策略:保留配置备份,失败可恢复上一版
- 故障闭环:针对“飞书不回复/无会话窗口/机器人在线但无回包”自动定位并给出修复动作
---
## 部署内容
## 怎么用Usage
| 序号 | 软件 | 用途 | 配置 |
|:---|:---|:---|:---|
| 1 | Clash Verge Rev | 代理客户端 | 自动导入订阅 URL开启系统代理 |
| 2 | Cursor | AI 编辑器 | 自动保存登录凭据到桌面 |
| 3 | Docker Desktop | 容器平台 | 自动安装 + 国内镜像加速(腾讯/中科大/网易/官方) |
| 4 | Ubuntu Linux 容器 | 开发环境 | 预装 git/python3/node/vim清华 apt 源,持久化 /workspace |
触发词远程部署、一键部署、装飞书、装龙虾、OpenClaw部署、飞书机器人部署。
---
## 执行步骤
### 1. 准备部署
### 1) 准备部署变量(必填)
部署包位置:`package/` 目录(已打包为 `远程环境一键部署.zip`
统一使用环境变量,不在脚本里硬编码密钥:
```
package/
├── 一键部署.bat # Windows 入口(双击即可
├── setup_mac.command # Mac 入口(双击即可
├── deploy_windows.ps1 # Windows 完整部署脚本
├── deploy_mac.sh # Mac 完整部署脚本
└── README.txt # 使用说明
```
- `FEISHU_APP_ID`
- `FEISHU_APP_SECRET`
- `OPENCLAW_MODEL_PROVIDER`(默认 `api123-icu`
- `OPENCLAW_MODEL_ID`(默认 `claude-sonnet-4-5-20250929`
- `OPENCLAW_BASE_URL`(如 `https://api123.icu`
- `OPENCLAW_API_KEY`(模型 key
- `OPENCLAW_GATEWAY_PORT`(默认 `18789`
- `FEISHU_TARGET_CHAT_ID`(验收发消息目标,群或用户 ID
### 2. 部署
### 2) 选择部署
**Windows**
1. 解压 `远程环境一键部署.zip`
2. 右键 `一键部署.bat` → 以管理员身份运行
3. 等待自动完成
- 本地:在目标机器直接执行 `package/deploy_*.sh|ps1`
- 远程:在控制机通过 SSH/WinRM 调用同一脚本
**Mac**
1. 解压 `远程环境一键部署.zip`
2. 双击 `setup_mac.command`(首次需在安全设置中允许)
3. 等待自动完成
### 3) 执行部署脚本
### 3. 一键命令(远程执行)
- macOS
- `bash package/deploy_mac.sh`
- Linux
- `bash package/deploy_linux.sh`
- Windows管理员 PowerShell
- `powershell -ExecutionPolicy Bypass -File package/deploy_windows.ps1`
**Windows PowerShell管理员**
```powershell
irm https://raw.githubusercontent.com/fnvtk/karuo-deploy/main/deploy_windows.ps1 -OutFile $env:TEMP\deploy.ps1; powershell -ExecutionPolicy Bypass -File $env:TEMP\deploy.ps1
```
### 4) 自动验收(脚本内置)
**Mac 终端:**
```bash
curl -fsSL https://raw.githubusercontent.com/fnvtk/karuo-deploy/main/deploy_mac.sh | bash
```
脚本执行后必须至少通过两项:
**下载完整 zip 包:**
```bash
# Windows PowerShell
Invoke-WebRequest -Uri "https://github.com/fnvtk/karuo-deploy/releases/latest/download/karuo-deploy.zip" -OutFile karuo-deploy.zip
- `openclaw channels status --probe --json``feishu.probe.ok=true`
- `openclaw message send` 实发成功(返回 `messageId`
# macOS / Linux
curl -LO https://github.com/fnvtk/karuo-deploy/releases/latest/download/karuo-deploy.zip
```
### 5) 不回复问题自动排查(内置 SOP
**GitHub 仓库:** https://github.com/fnvtk/karuo-deploy
按以下顺序检查,命中即修复:
1. `channels status --probe --json` 是否 `probe.ok=true`
2. `directory peers/groups list` 是否为空(为空通常是机器人不在任何会话)
3. 飞书开放平台是否已“创建版本并发布”
4. `事件与回调` 是否已订阅消息事件(`im.message.receive_v1`
5. `权限管理` 是否具备读/发消息权限(至少 `im:message`, `im:message:send`
6. `测试企业和人员` 是否覆盖当前测试人/群
7. 用 API 实测发消息,若返回 `230002`,说明机器人不在目标会话,需先拉机器人入群
---
## 部署流程图
## 标准流程(抽象版)
```
开始
├─ [1] 下载 Clash Verge Rev (GitHub Releases)
├─ [2] 静默安装 Clash Verge Rev
├─ [3] 写入代理订阅配置 + 启用系统代理
[4] 启动 Clash等待代理就绪 (google.com)
├─ [5] 下载并安装 Cursor
├─ [6] 保存 Cursor 登录信息到桌面
├─ [7] 安装 Docker Desktop + 配置国内镜像加速
├─ [8] 拉取 Ubuntu 22.04 + 创建开发容器 (karuo-linux)
完成!
注册飞书应用
├─ 配置机器人能力 + 事件与回调
├─ 开通权限 (im:message:send 等) 并发布版本
├─ 记录 AppID/AppSecret
导出部署变量(.env)
部署目标机器
├─ 安装 Feishu 客户端
├─ 安装 OpenClaw
生成/更新 ~/.openclaw/openclaw.json
├─ 启动/重启 gateway
├─ 健康检查 + 实发验收
├─ 不回复排查(事件/权限/发布/可见范围)
└─ 失败回滚到上一个备份配置
```
---
@@ -106,13 +106,15 @@ curl -LO https://github.com/fnvtk/karuo-deploy/releases/latest/download/karuo-de
## 输出格式
```
[远程环境一键部署] 执行完成
├─ Clash Verge Rev已安装订阅已配置代理已启用
├─ Cursor已安装登录信息已保存到桌面
├─ Docker Desktop已安装国内镜像已配置
├─ Ubuntu Linux容器已就绪 (docker exec -it karuo-linux bash)
├─ 网络验证:通过
耗时:约 x 分钟
[龙虾一键部署] 执行完成
├─ 平台macOS / Linux / Windows
├─ Feishu已安装或已存在
├─ OpenClaw已安装或已存在
├─ 机器人longmao 已写入并启用
├─ 探针feishu.probe.ok = true
实发messageId = xxxxx
├─ 排查:事件/权限/发布/测试范围 = 通过
└─ 回滚点:~/.openclaw/openclaw.json.bak.YYYYMMDD_HHMMSS
```
---
@@ -121,47 +123,53 @@ curl -LO https://github.com/fnvtk/karuo-deploy/releases/latest/download/karuo-de
| 脚本 | 用途 |
|:---|:---|
| package/deploy_windows.ps1 | Windows 完整自动部署脚本 |
| package/deploy_mac.sh | Mac 完整自动部署脚本 |
| package/deploy_windows.ps1 | Windows 一键部署Feishu + OpenClaw |
| package/deploy_mac.sh | macOS 一键部署Feishu + OpenClaw |
| package/deploy_linux.sh | Linux 一键部署Feishu + OpenClaw |
| package/一键部署.bat | Windows 一键启动入口 |
| package/setup_mac.command | Mac 一键启动入口 |
| package/README.txt | 快速手册与变量说明 |
---
## 配置信息
## 相关文件Files
### 代理订阅
- URL: `https://api.v6v.eu/api/v1/client/subscribe?token=371fe0545c77e4d9efdf2906a865e403`
- 节点:香港/台湾/新加坡/日本/美国/韩国/德国/荷兰/加拿大/英国/澳洲等
- 协议Trojan + Hysteria2
### Cursor 账号
- 邮箱: `WilliamAtkins4153@outlook.com`
- 密码: `?056uXrtaWKQ`
---
### Docker 容器
- 容器名: `karuo-linux`
- 系统: Ubuntu 22.04
- 预装工具: git, curl, python3, node, npm, vim, build-essential
- apt 源: 清华镜像(国内加速)
- 持久化卷: `karuo-workspace` → 容器内 `/workspace`
- 使用: `docker exec -it karuo-linux bash`
### macOS 容器
- 仅在 Linux 宿主机(需 KVM上可用
- 镜像: `sickcodes/docker-osx:auto`
- Windows 推荐用 VMware/UTM 运行 macOS 虚拟机
- Mac 上无需 Docker 运行 macOS已在原生环境
- 技能文档:`01_卡资/金盾_数据安全/远程环境一键部署/SKILL.md`
- 脚本目录:`01_卡资/金盾_数据安全/远程环境一键部署/package/`
- 工作台记录:`运营中枢/工作台/阿猫Mac_OpenClaw配置情况分析.md`
---
## 安全原则
- 登录信息文件使用后立即删除
- 订阅 token 不在公开仓库中存储
- 代理配置仅限内部使用
- 不在脚本中写死任何账号、密码、Token、API Key
- 所有凭据仅通过环境变量或本机安全存储注入
- 每次改配置先备份 `openclaw.json`
- 失败必须可回滚,且保留验证日志
---
## 常见故障一针见血Troubleshooting
| 现象 | 直接结论 | 直接处理 |
|:---|:---|:---|
| 飞书里能看到机器人,但发消息没回复 | 飞书事件未生效或权限/发布缺失 | 开通消息权限 + 添加 `im.message.receive_v1` + 创建版本并发布 |
| `probe.ok=true``directory peers/groups list` 为空 | 机器人未进入任何会话 | 在目标群添加“龙猫”机器人或私聊先发起一次会话 |
| 发消息报 `230002 Bot/User can NOT be out of the chat` | 机器人不在该群/会话 | 先把机器人拉进群,再复测 |
| 切换新 AppID 后完全不回 | 新应用未完成测试范围 | 在“测试企业和人员”加入测试人和测试群并发布 |
| 之前能用,突然不回 | 配置切换后异常或发布失效 | 回滚 `openclaw.json` 备份并重启 gateway |
| 网关日志 `403` / Cloudflare `1010`,或模型单轮 `output=0` | api123 拦截默认 UA / 上下文顶满 | 在 `models.providers.<id>.headers` 增加 `User-Agent: curl/8.x`;必要时清理飞书会话 jsonl 或调低 `agents.defaults.contextTokens` |
---
## 依赖Dependencies
- 前置技能:`02_卡人/水桥_平台对接/飞书管理/SKILL.md`(飞书能力)
- 外部工具:
- macOS`brew`(可选)
- Linux`curl``python3`
- Windows`winget`(优先)
- 通用:`openclaw`
---
@@ -169,4 +177,6 @@ curl -LO https://github.com/fnvtk/karuo-deploy/releases/latest/download/karuo-de
| 日期 | 版本 | 变更 |
|:---|:---|:---|
| 2026-03-24 | 3.0 | 新增“飞书不回复”闭环排查 SOP、故障矩阵与一针见血修复策略一键部署升级为部署+排错一体化 |
| 2026-03-24 | 2.0 | 升级为跨平台 Feishu + OpenClaw 一键部署,支持本地/远程、验收与回滚,移除明文凭据写死方案 |
| 2026-02-14 | 1.0 | 初始版本Clash Verge Rev + Cursor 一键部署 |

View File

@@ -1,82 +1,89 @@
================================================
卡若AI · 远程环境一键部署 v1.0
日期: 2026-02-14
卡若AI · Feishu + OpenClaw龙虾一键部署包
版本: 3.0
================================================
本工具包自动安装以下软件并完成配置:
[1] Clash Verge Rev - 代理客户端
· 自动导入代理订阅
· 自动启用系统代理
· 支持 Trojan + Hysteria2 协议
[2] Cursor - AI 编辑器
· 自动下载安装
· 登录信息保存到桌面
[3] Docker Desktop - 容器平台
· 自动安装 Docker Desktop
· 配置国内镜像加速(腾讯云/中科大/网易/官方)
· 国内直接拉镜像无需翻墙
[4] Ubuntu Linux - 开发容器
· 预装 git/python3/node/vim/build-essential
· apt 源使用清华镜像(国内极速)
· /workspace 目录持久化存储
· docker exec -it karuo-linux bash 进入
[目标]
在任意新机器macOS / Linux / Windows完成
1) 安装 OpenClaw
2) 配置 Feishu 机器人(龙猫)
3) 启动网关并做健康检查
4) 可选:发一条上线验证消息
================================================
Windows 使用方法
[必须先设置的环境变量]
================================================
1. 解压本压缩包到任意位置
2. 右键点击「一键部署.bat」→ 以管理员身份运行
3. 等待自动完成(约 5-10 分钟)
4. 完成后根据提示登录 Cursor
FEISHU_APP_ID
FEISHU_APP_SECRET
OPENCLAW_BASE_URL
OPENCLAW_API_KEY
如需单独运行 PowerShell 脚本
可选
OPENCLAW_MODEL_PROVIDER (默认 api123-icu)
OPENCLAW_MODEL_ID (默认 claude-sonnet-4-5-20250929)
FEISHU_TARGET_CHAT_ID (设置后脚本会自动实发一条验证消息)
================================================
[执行方式]
================================================
macOS:
bash deploy_mac.sh
Linux:
bash deploy_linux.sh
Windows (PowerShell 管理员):
powershell -ExecutionPolicy Bypass -File deploy_windows.ps1
或双击:
一键部署.bat
================================================
macOS 使用方法
[远程部署]
================================================
1. 解压本压缩包到任意位置
2. 双击「setup_mac.command」
(首次运行可能需要在 系统设置 → 隐私与安全 中允许)
3. 等待自动完成(约 5-10 分钟)
4. 完成后根据提示登录 Cursor
macOS/Linux:
ssh <user>@<host> 'export FEISHU_APP_ID=... FEISHU_APP_SECRET=... OPENCLAW_BASE_URL=... OPENCLAW_API_KEY=...; bash -s' < deploy_linux.sh
如需在终端运行:
chmod +x deploy_mac.sh && bash deploy_mac.sh
Windows:
使用 WinRM/远程 PowerShell 调用 deploy_windows.ps1并传入同名环境变量。
================================================
部署流程
[验收标准]
================================================
开始
├─ [1] 下载并安装 Clash Verge Rev
├─ [2] 配置代理订阅 + 启用系统代理
├─ [3] 启动 Clash验证网络就绪
├─ [4] 通过代理下载并安装 Cursor
├─ [5] 保存 Cursor 登录信息到桌面
├─ [6] 安装 Docker Desktop + 国内镜像加速
├─ [7] 拉取 Ubuntu 22.04 + 创建开发容器
└─ 完成!
1) openclaw channels status --probe --json
- channels.feishu.probe.ok = true
2) 若设置 FEISHU_TARGET_CHAT_ID
- message send 返回 messageId
================================================
注意事项
[飞书不回复排查(必看)]
================================================
· 需要基本的网络连接(能访问 GitHub / Docker Hub
· Windows 建议以管理员身份运行
· Windows 安装 Docker 需要 WSL2脚本自动启用
· macOS 可能需要在安全设置中允许第三方应用
· Docker 国内镜像已配置,拉镜像无需翻墙
· 登录 Cursor 后请立即删除桌面上的登录信息文件
· 进入 Linux 容器: docker exec -it karuo-linux bash
· 如遇问题请联系卡若
1) 开放平台顶部若提示“版本发布后生效”,必须先发布版本
2) 事件与回调 -> 添加事件im.message.receive_v1
3) 权限管理 -> 开通并生效im:message / im:message:send
4) 测试企业和人员 -> 加入当前测试人和测试群
5) 若接口报错 code=230002
- 结论:机器人不在目标会话
- 处理:先把机器人拉进群,再重试
================================================
卡若AI · 金盾 出品
[快速诊断命令]
================================================
openclaw channels status --probe --json
openclaw directory peers list --channel feishu --account longmao --limit 20 --json
openclaw directory groups list --channel feishu --account longmao --limit 20 --json
================================================
[安全要求]
================================================
- 不要在脚本中写死密钥
- 执行完成后清理终端历史中的敏感变量
- 每次改配置前脚本会备份 ~/.openclaw/openclaw.json
================================================

View File

@@ -0,0 +1,95 @@
#!/usr/bin/env bash
set -euo pipefail
echo "== 卡若AI Feishu+龙虾 一键部署 (Linux) =="
req() { [ -n "${!1:-}" ] || { echo "[ERR] 缺少环境变量: $1" >&2; exit 1; }; }
req FEISHU_APP_ID
req FEISHU_APP_SECRET
req OPENCLAW_BASE_URL
req OPENCLAW_API_KEY
OPENCLAW_MODEL_PROVIDER="${OPENCLAW_MODEL_PROVIDER:-api123-icu}"
OPENCLAW_MODEL_ID="${OPENCLAW_MODEL_ID:-claude-sonnet-4-5-20250929}"
OPENCLAW_BIN="${HOME}/.local/share/npm-global/bin/openclaw"
if command -v apt-get >/dev/null 2>&1; then
sudo apt-get update -y
sudo apt-get install -y curl ca-certificates gnupg python3 python3-pip
fi
if ! command -v node >/dev/null 2>&1; then
curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt-get install -y nodejs
fi
npm config set prefix "${HOME}/.local/share/npm-global"
export PATH="${HOME}/.local/share/npm-global/bin:${PATH}"
if [ ! -x "$OPENCLAW_BIN" ]; then
npm install -g openclaw@latest
fi
python3 - <<'PY'
import json, shutil, os
from pathlib import Path
from datetime import datetime
p = Path.home()/".openclaw"/"openclaw.json"
p.parent.mkdir(parents=True, exist_ok=True)
if not p.exists():
p.write_text("{}", encoding="utf-8")
cfg = json.loads(p.read_text(encoding="utf-8") or "{}")
bak = p.with_name("openclaw.json.bak.deploy_" + datetime.now().strftime("%Y%m%d_%H%M%S"))
shutil.copy2(p, bak)
provider = os.environ.get("OPENCLAW_MODEL_PROVIDER", "api123-icu")
model_id = os.environ.get("OPENCLAW_MODEL_ID", "claude-sonnet-4-5-20250929")
cfg["models"] = {
"providers": {
provider: {
"api": "anthropic-messages",
"baseUrl": os.environ["OPENCLAW_BASE_URL"],
"apiKey": os.environ["OPENCLAW_API_KEY"],
"models": [{"id": model_id, "name": f"{model_id} ({provider})"}],
}
}
}
cfg.setdefault("agents", {})
cfg["agents"].setdefault("defaults", {})
cfg["agents"]["defaults"]["model"] = {"primary": f"{provider}/{model_id}", "fallbacks": []}
cfg["agents"]["defaults"]["models"] = [{"alias": "default", "provider": provider, "model": model_id}]
ch = cfg.setdefault("channels", {}).setdefault("feishu", {})
acc = {
"enabled": True,
"appId": os.environ["FEISHU_APP_ID"],
"appSecret": os.environ["FEISHU_APP_SECRET"],
"botName": "龙猫",
"domain": "feishu",
"dmPolicy": "open",
"groupPolicy": "open",
"allowFrom": ["*"],
"groupAllowFrom": ["*"],
"groups": {"*": {"requireMention": False}},
}
ch.update({"enabled": True, "accountId": "longmao", "accounts": {"longmao": acc}})
cfg.setdefault("plugins", {})["allow"] = ["feishu"]
p.write_text(json.dumps(cfg, ensure_ascii=False, indent=2), encoding="utf-8")
print("backup:", bak.name)
PY
"$OPENCLAW_BIN" gateway restart
sleep 2
"$OPENCLAW_BIN" channels status --probe --json || true
if [ -n "${FEISHU_TARGET_CHAT_ID:-}" ]; then
"$OPENCLAW_BIN" message send \
--channel feishu \
--account longmao \
--target "$FEISHU_TARGET_CHAT_ID" \
--message "【龙猫】Linux 一键部署完成,当前机器已上线。"
fi
echo "[OK] 部署完成Linux"

View File

@@ -1,560 +1,127 @@
#!/bin/bash
# ============================================================
# 卡若AI · 远程环境一键部署脚本 (macOS)
# 自动安装 Clash Verge Rev (代理) + Cursor (AI编辑器) + Docker Desktop (容器) + Linux 容器
# 版本: 1.0 | 日期: 2026-02-14 | 所属: 金盾
# ============================================================
# 跨平台模板macOS 一键安装 Feishu + OpenClaw并写入龙猫机器人配置
set -euo pipefail
# ==================== 配置 ====================
SUBSCRIPTION_URL="https://api.v6v.eu/api/v1/client/subscribe?token=371fe0545c77e4d9efdf2906a865e403"
CURSOR_EMAIL="WilliamAtkins4153@outlook.com"
CURSOR_PASSWORD="?056uXrtaWKQ"
TEMP_DIR="/tmp/karuo_deploy"
CLASH_PROXY_PORT=7897
GREEN='\033[0;32m'; YELLOW='\033[1;33m'; RED='\033[0;31m'; NC='\033[0m'
ok(){ echo -e "${GREEN}[OK]${NC} $1"; }
warn(){ echo -e "${YELLOW}[WARN]${NC} $1"; }
err(){ echo -e "${RED}[ERR]${NC} $1"; }
# ==================== 颜色 ====================
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
GRAY='\033[0;90m'
NC='\033[0m'
# ==================== 工具函数 ====================
print_banner() {
echo ""
echo -e "${CYAN} ╔══════════════════════════════════════════╗${NC}"
echo -e "${CYAN} ║ ║${NC}"
echo -e "${CYAN} ║ 卡若AI · 远程环境一键部署 v1.0 ║${NC}"
echo -e "${CYAN} ║ ║${NC}"
echo -e "${CYAN} ║ [1] Clash Verge Rev 代理客户端 ║${NC}"
echo -e "${CYAN} ║ [2] Cursor AI 编辑器 ║${NC}"
echo -e "${CYAN} ║ [3] Docker Desktop 容器平台 ║${NC}"
echo -e "${CYAN} ║ [4] Ubuntu Linux 开发环境 ║${NC}"
echo -e "${CYAN} ║ ║${NC}"
echo -e "${CYAN} ╚══════════════════════════════════════════╝${NC}"
echo ""
require_env() {
local n="$1"
if [ -z "${!n:-}" ]; then
err "缺少环境变量: $n"
exit 1
fi
}
print_step() { echo -e "\n ${YELLOW}[$1] $2${NC}"; }
print_ok() { echo -e " ${GREEN}[OK] $1${NC}"; }
print_err() { echo -e " ${RED}[ERR] $1${NC}"; }
print_info() { echo -e " ${GRAY}-> $1${NC}"; }
echo "== 卡若AI Feishu+龙虾 一键部署 (macOS) =="
# ==================== 主流程 ====================
print_banner
require_env FEISHU_APP_ID
require_env FEISHU_APP_SECRET
require_env OPENCLAW_BASE_URL
require_env OPENCLAW_API_KEY
START_TIME=$(date +%s)
OPENCLAW_MODEL_PROVIDER="${OPENCLAW_MODEL_PROVIDER:-api123-icu}"
OPENCLAW_MODEL_ID="${OPENCLAW_MODEL_ID:-claude-sonnet-4-5-20250929}"
OPENCLAW_GATEWAY_PORT="${OPENCLAW_GATEWAY_PORT:-18789}"
OPENCLAW_BIN="${HOME}/.local/share/npm-global/bin/openclaw"
OPENCLAW_NODE_BIN="${HOME}/.local/node22/bin"
# 检测系统架构
ARCH=$(uname -m)
if [ "$ARCH" = "arm64" ]; then
IS_ARM=true
print_info "检测到 Apple Silicon (ARM64)"
else
IS_ARM=false
print_info "检测到 Intel (x86_64)"
if ! command -v brew >/dev/null 2>&1; then
warn "未检测到 Homebrew先安装 Homebrew"
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
fi
# 检测 Homebrew
HAS_BREW=false
if command -v brew &>/dev/null; then
HAS_BREW=true
print_ok "Homebrew 已安装"
else
print_info "未检测到 Homebrew将使用直接下载安装"
if [ ! -d "/Applications/Lark.app" ] && [ ! -d "/Applications/Feishu.app" ]; then
brew install --cask lark || warn "Lark cask 安装失败,可手动安装飞书客户端"
fi
ok "飞书客户端步骤完成"
if ! command -v node >/dev/null 2>&1; then
brew install node@22
export PATH="/opt/homebrew/opt/node@22/bin:/usr/local/opt/node@22/bin:$PATH"
fi
# 创建临时目录
mkdir -p "$TEMP_DIR"
mkdir -p "${HOME}/.local/share/npm-global" "${HOME}/.local/node22/bin"
npm config set prefix "${HOME}/.local/share/npm-global"
export PATH="${HOME}/.local/share/npm-global/bin:${PATH}"
# ============================================================
# Step 1: 下载 Clash Verge Rev
# ============================================================
print_step "1/8" "下载 Clash Verge Rev (代理客户端)"
if [ ! -x "$OPENCLAW_BIN" ]; then
npm install -g openclaw@latest
fi
ok "OpenClaw 安装完成"
if [ -d "/Applications/Clash Verge.app" ]; then
print_ok "Clash Verge Rev 已安装,跳过"
else
if $HAS_BREW; then
print_info "通过 Homebrew 安装..."
brew install --cask clash-verge-rev 2>/dev/null || brew install --cask clash-verge 2>/dev/null || {
print_err "Homebrew 安装失败,尝试直接下载"
HAS_BREW=false
python3 - <<'PY'
import json, shutil, os
from pathlib import Path
from datetime import datetime
p = Path.home()/".openclaw"/"openclaw.json"
p.parent.mkdir(parents=True, exist_ok=True)
if not p.exists():
p.write_text("{}", encoding="utf-8")
cfg = json.loads(p.read_text(encoding="utf-8"))
bak = p.with_name("openclaw.json.bak.deploy_" + datetime.now().strftime("%Y%m%d_%H%M%S"))
shutil.copy2(p, bak)
provider = os.environ.get("OPENCLAW_MODEL_PROVIDER", "api123-icu")
model_id = os.environ.get("OPENCLAW_MODEL_ID", "claude-sonnet-4-5-20250929")
base_url = os.environ["OPENCLAW_BASE_URL"]
api_key = os.environ["OPENCLAW_API_KEY"]
cfg["models"] = {
"providers": {
provider: {
"api": "anthropic-messages",
"baseUrl": base_url,
"apiKey": api_key,
"models": [{"id": model_id, "name": f"{model_id} ({provider})"}],
}
fi
if ! [ -d "/Applications/Clash Verge.app" ] && ! $HAS_BREW; then
print_info "从 GitHub 获取最新版本..."
# 根据架构选择下载
if $IS_ARM; then
PATTERN="aarch64"
else
PATTERN="x64"
fi
CLASH_URL=$(curl -sL "https://api.github.com/repos/clash-verge-rev/clash-verge-rev/releases/latest" | \
python3 -c "
import sys, json
try:
data = json.load(sys.stdin)
assets = data.get('assets', [])
for a in assets:
name = a['name']
if '${PATTERN}' in name and name.endswith('.dmg'):
print(a['browser_download_url'])
break
except:
pass
" 2>/dev/null)
if [ -n "$CLASH_URL" ]; then
print_info "下载中..."
curl -L --progress-bar -o "$TEMP_DIR/clash-verge.dmg" "$CLASH_URL"
if [ -f "$TEMP_DIR/clash-verge.dmg" ]; then
print_info "安装中..."
hdiutil attach "$TEMP_DIR/clash-verge.dmg" -quiet -nobrowse 2>/dev/null
# 查找挂载点
MOUNT_POINT=$(find /Volumes -maxdepth 1 -name "*Clash*" -type d 2>/dev/null | head -1)
if [ -n "$MOUNT_POINT" ]; then
APP_PATH=$(find "$MOUNT_POINT" -maxdepth 1 -name "*.app" -type d 2>/dev/null | head -1)
if [ -n "$APP_PATH" ]; then
cp -R "$APP_PATH" /Applications/
print_ok "Clash Verge Rev 安装完成"
fi
hdiutil detach "$MOUNT_POINT" -quiet 2>/dev/null
fi
fi
else
print_err "无法获取下载链接"
print_info "请手动下载: https://github.com/clash-verge-rev/clash-verge-rev/releases"
fi
elif [ -d "/Applications/Clash Verge.app" ]; then
print_ok "Clash Verge Rev 安装完成"
fi
fi
# ============================================================
# Step 2: 跳过(合并到 Step 1
# ============================================================
print_step "2/8" "安装验证"
if [ -d "/Applications/Clash Verge.app" ]; then
print_ok "Clash Verge Rev 已就绪"
else
print_err "Clash Verge Rev 未安装成功"
fi
# ============================================================
# Step 3: 配置代理订阅
# ============================================================
print_step "3/8" "配置代理订阅"
CLASH_CONFIG_DIR="$HOME/Library/Application Support/io.github.clash-verge-rev.clash-verge-rev"
mkdir -p "$CLASH_CONFIG_DIR/profiles"
PROFILE_UID=$(date +%s)000
cat > "$CLASH_CONFIG_DIR/profiles.yaml" << EOF
current: $PROFILE_UID
chain: []
valid:
- $PROFILE_UID
items:
- uid: $PROFILE_UID
type: remote
name: "KaruoAI Proxy"
desc: "Auto Deploy"
url: "$SUBSCRIPTION_URL"
option:
update_interval: 86400
with_proxy: false
updated: 0
EOF
print_ok "订阅配置已写入 profiles.yaml"
# 写入 verge.yaml
if [ ! -f "$CLASH_CONFIG_DIR/verge.yaml" ]; then
cat > "$CLASH_CONFIG_DIR/verge.yaml" << 'EOF'
enable_system_proxy: true
enable_auto_launch: true
clash_core: mihomo
theme_mode: system
EOF
print_ok "代理设置已写入 verge.yaml"
else
print_info "verge.yaml 已存在,保留原配置"
fi
# ============================================================
# Step 4: 启动 Clash 并验证网络
# ============================================================
print_step "4/8" "启动代理并验证网络"
if [ -d "/Applications/Clash Verge.app" ]; then
# 先关闭已有进程
killall "Clash Verge" 2>/dev/null || true
sleep 2
print_info "启动 Clash Verge Rev..."
open "/Applications/Clash Verge.app"
print_info "等待代理初始化..."
PROXY_READY=false
for i in $(seq 1 12); do
sleep 5
if curl -s --proxy "http://127.0.0.1:$CLASH_PROXY_PORT" --max-time 5 "https://www.google.com" >/dev/null 2>&1; then
PROXY_READY=true
break
fi
printf "."
done
echo ""
if $PROXY_READY; then
print_ok "代理已就绪Google 访问正常"
else
print_err "代理初始化超时60秒"
print_info "请手动操作:"
print_info " 1. 打开 Clash Verge Rev"
print_info " 2. 点击 Profiles → 更新订阅"
print_info " 3. 选择一个节点"
print_info " 4. 开启 System Proxy"
echo ""
read -p " 代理就绪后按回车继续..." _
fi
else
print_err "未找到 Clash Verge Rev"
print_info "跳过代理启动"
fi
# ============================================================
# Step 5: 下载并安装 Cursor
# ============================================================
print_step "5/8" "下载并安装 Cursor (AI 编辑器)"
if [ -d "/Applications/Cursor.app" ]; then
print_ok "Cursor 已安装,跳过"
else
if $HAS_BREW; then
print_info "通过 Homebrew 安装..."
brew install --cask cursor 2>/dev/null || {
print_info "Homebrew 安装失败,尝试直接下载"
HAS_BREW=false
}
fi
if ! [ -d "/Applications/Cursor.app" ] && ! $HAS_BREW; then
if $IS_ARM; then
CURSOR_URL="https://downloader.cursor.sh/arm64/darwin/stable/latest"
else
CURSOR_URL="https://downloader.cursor.sh/darwin/stable/latest"
fi
CURL_OPTS=""
if $PROXY_READY 2>/dev/null; then
CURL_OPTS="--proxy http://127.0.0.1:$CLASH_PROXY_PORT"
fi
print_info "下载 Cursor..."
curl -L $CURL_OPTS --progress-bar -o "$TEMP_DIR/Cursor.dmg" "$CURSOR_URL"
if [ -f "$TEMP_DIR/Cursor.dmg" ]; then
print_info "安装中..."
hdiutil attach "$TEMP_DIR/Cursor.dmg" -quiet -nobrowse 2>/dev/null
MOUNT_POINT=$(find /Volumes -maxdepth 1 -name "*Cursor*" -type d 2>/dev/null | head -1)
if [ -n "$MOUNT_POINT" ]; then
APP_PATH=$(find "$MOUNT_POINT" -maxdepth 1 -name "*.app" -type d 2>/dev/null | head -1)
if [ -n "$APP_PATH" ]; then
cp -R "$APP_PATH" /Applications/
print_ok "Cursor 安装完成"
fi
hdiutil detach "$MOUNT_POINT" -quiet 2>/dev/null
fi
fi
elif [ -d "/Applications/Cursor.app" ]; then
print_ok "Cursor 安装完成"
fi
fi
# ============================================================
# Step 6: 保存 Cursor 登录信息
# ============================================================
print_step "6/8" "保存 Cursor 登录信息"
CRED_FILE="$HOME/Desktop/Cursor登录信息.txt"
cat > "$CRED_FILE" << EOF
================================================
Cursor 登录信息
由 卡若AI 自动部署生成
$(date '+%Y-%m-%d %H:%M:%S')
================================================
邮箱: $CURSOR_EMAIL
密码: $CURSOR_PASSWORD
使用方法:
1. 打开 Cursor
2. 点击左下角齿轮 → Sign In
3. 选择 Email 登录
4. 输入上述邮箱和密码
5. 登录成功后请立即删除此文件
================================================
!! 安全提示: 登录完成后请立即删除此文件 !!
================================================
EOF
print_ok "登录信息已保存到桌面: Cursor登录信息.txt"
# ============================================================
# Step 7: 安装 Docker Desktop + 配置国内镜像
# ============================================================
print_step "7/8" "安装 Docker Desktop + 配置国内镜像"
DOCKER_INSTALLED=false
if command -v docker &>/dev/null; then
DOCKER_INSTALLED=true
print_ok "Docker 已安装: $(docker --version 2>/dev/null)"
elif [ -d "/Applications/Docker.app" ]; then
DOCKER_INSTALLED=true
print_ok "Docker Desktop 已安装"
fi
if ! $DOCKER_INSTALLED; then
if $HAS_BREW; then
print_info "通过 Homebrew 安装 Docker Desktop..."
brew install --cask docker 2>/dev/null || {
print_err "Homebrew 安装失败,尝试直接下载"
HAS_BREW=false
}
fi
if ! [ -d "/Applications/Docker.app" ] && ! $HAS_BREW; then
print_info "下载 Docker Desktop..."
if $IS_ARM; then
DOCKER_URL="https://desktop.docker.com/mac/main/arm64/Docker.dmg"
else
DOCKER_URL="https://desktop.docker.com/mac/main/amd64/Docker.dmg"
fi
CURL_OPTS=""
if ${PROXY_READY:-false} 2>/dev/null; then
CURL_OPTS="--proxy http://127.0.0.1:$CLASH_PROXY_PORT"
fi
curl -L $CURL_OPTS --progress-bar -o "$TEMP_DIR/Docker.dmg" "$DOCKER_URL"
if [ -f "$TEMP_DIR/Docker.dmg" ]; then
print_info "安装 Docker Desktop..."
hdiutil attach "$TEMP_DIR/Docker.dmg" -quiet -nobrowse 2>/dev/null
MOUNT_POINT=$(find /Volumes -maxdepth 1 -name "*Docker*" -type d 2>/dev/null | head -1)
if [ -n "$MOUNT_POINT" ]; then
APP_PATH=$(find "$MOUNT_POINT" -maxdepth 1 -name "*.app" -type d 2>/dev/null | head -1)
if [ -n "$APP_PATH" ]; then
cp -R "$APP_PATH" /Applications/
print_ok "Docker Desktop 安装完成"
DOCKER_INSTALLED=true
fi
hdiutil detach "$MOUNT_POINT" -quiet 2>/dev/null
fi
fi
elif [ -d "/Applications/Docker.app" ]; then
DOCKER_INSTALLED=true
print_ok "Docker Desktop 安装完成"
fi
fi
# 配置国内镜像加速
print_info "配置 Docker 国内镜像加速..."
DOCKER_CONFIG_DIR="$HOME/.docker"
mkdir -p "$DOCKER_CONFIG_DIR"
DAEMON_JSON="$DOCKER_CONFIG_DIR/daemon.json"
if [ ! -f "$DAEMON_JSON" ]; then
cat > "$DAEMON_JSON" << 'MIRROREOF'
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
]
}
}
MIRROREOF
print_ok "国内镜像配置已写入 daemon.json"
else
if ! grep -q "registry-mirrors" "$DAEMON_JSON" 2>/dev/null; then
# 简单合并:备份原文件,写入新配置
cp "$DAEMON_JSON" "$DAEMON_JSON.bak"
python3 -c "
import json
with open('$DAEMON_JSON') as f:
cfg = json.load(f)
cfg['registry-mirrors'] = [
'https://mirror.ccs.tencentyun.com',
'https://docker.mirrors.ustc.edu.cn',
'https://hub-mirror.c.163.com',
'https://registry.docker-cn.com'
]
with open('$DAEMON_JSON', 'w') as f:
json.dump(cfg, f, indent=2)
" 2>/dev/null && print_ok "已合并国内镜像到现有 daemon.json" || print_info "请手动配置 Docker 镜像"
else
print_info "daemon.json 已有镜像配置,保留原设置"
fi
cfg.setdefault("agents", {})
cfg["agents"].setdefault("defaults", {})
cfg["agents"]["defaults"]["model"] = {"primary": f"{provider}/{model_id}", "fallbacks": []}
cfg["agents"]["defaults"]["models"] = [{"alias": "default", "provider": provider, "model": model_id}]
ch = cfg.setdefault("channels", {}).setdefault("feishu", {})
acc = ch.setdefault("accounts", {}).get("longmao", {})
acc.update({
"enabled": True,
"appId": os.environ["FEISHU_APP_ID"],
"appSecret": os.environ["FEISHU_APP_SECRET"],
"botName": "龙猫",
"domain": "feishu",
"dmPolicy": "open",
"groupPolicy": "open",
"allowFrom": ["*"],
"groupAllowFrom": ["*"],
"groups": {"*": {"requireMention": False}},
})
ch.update({
"enabled": True,
"accountId": "longmao",
"accounts": {"longmao": acc},
})
cfg.setdefault("plugins", {})["allow"] = ["feishu"]
p.write_text(json.dumps(cfg, ensure_ascii=False, indent=2), encoding="utf-8")
print("backup:", bak.name)
PY
PATH="${OPENCLAW_NODE_BIN}:$PATH" "$OPENCLAW_BIN" gateway restart
sleep 2
PATH="${OPENCLAW_NODE_BIN}:$PATH" "$OPENCLAW_BIN" channels status --probe --json || true
if [ -n "${FEISHU_TARGET_CHAT_ID:-}" ]; then
PATH="${OPENCLAW_NODE_BIN}:$PATH" "$OPENCLAW_BIN" message send \
--channel feishu \
--account longmao \
--target "$FEISHU_TARGET_CHAT_ID" \
--message "【龙猫】一键部署完成,当前机器已上线。"
fi
# 启动 Docker Desktop
if $DOCKER_INSTALLED && [ -d "/Applications/Docker.app" ]; then
print_info "启动 Docker Desktop..."
open "/Applications/Docker.app"
print_info "等待 Docker 引擎就绪最多120秒..."
DOCKER_READY=false
for i in $(seq 1 24); do
sleep 5
if docker info >/dev/null 2>&1; then
DOCKER_READY=true
break
fi
printf "."
done
echo ""
if $DOCKER_READY; then
print_ok "Docker 引擎已就绪"
else
print_err "Docker 引擎启动超时"
print_info "请手动启动 Docker Desktop 后重新运行脚本"
fi
fi
# ============================================================
# Step 8: 部署 Linux 开发容器
# ============================================================
print_step "8/8" "部署 Linux 开发容器"
DOCKER_READY=false
if docker info >/dev/null 2>&1; then
DOCKER_READY=true
fi
if $DOCKER_READY; then
# --- Ubuntu Linux 容器 ---
print_info "拉取 Ubuntu 22.04 镜像..."
docker pull ubuntu:22.04
# 检查容器是否已存在
EXISTING=$(docker ps -a --filter "name=karuo-linux" --format "{{.Names}}" 2>/dev/null)
if [ "$EXISTING" = "karuo-linux" ]; then
print_info "容器 karuo-linux 已存在,重新创建..."
docker rm -f karuo-linux >/dev/null 2>&1
fi
print_info "创建 Ubuntu 开发容器..."
docker run -d \
--name karuo-linux \
--hostname karuo-dev \
-v karuo-workspace:/workspace \
--restart unless-stopped \
ubuntu:22.04 \
tail -f /dev/null
print_info "安装开发工具git/curl/python3/node/vim..."
docker exec karuo-linux bash -c '
# 替换为清华 apt 源(国内加速)
cat > /etc/apt/sources.list << APTEOF
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
APTEOF
apt-get update -qq && \
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \
curl wget git vim nano \
python3 python3-pip \
nodejs npm \
build-essential \
openssh-server \
htop net-tools iputils-ping \
locales && \
locale-gen en_US.UTF-8 && \
echo "alias ll='"'"'ls -la'"'"'" >> /root/.bashrc && \
echo "export LANG=en_US.UTF-8" >> /root/.bashrc && \
echo "开发环境初始化完成"
'
if [ $? -eq 0 ]; then
print_ok "Ubuntu Linux 容器已就绪"
else
print_err "容器初始化部分失败,但容器已创建"
fi
# --- macOS 容器说明 ---
echo ""
print_info "关于 macOS 容器:"
print_info " macOS 上已在原生环境中,无需 Docker 运行 macOS"
print_info " 如需在 Linux 服务器上运行 macOS 容器:"
print_info " docker pull sickcodes/docker-osx:auto"
print_info " docker run -it --device /dev/kvm sickcodes/docker-osx:auto"
# 容器使用说明
echo ""
print_info "=== 容器使用方法 ==="
print_info "进入 Linux: docker exec -it karuo-linux bash"
print_info "停止容器: docker stop karuo-linux"
print_info "启动容器: docker start karuo-linux"
print_info "工作目录: 容器内 /workspace持久化存储"
else
print_err "Docker 未就绪,跳过容器部署"
print_info "请先启动 Docker Desktop然后运行以下命令手动部署"
print_info " docker pull ubuntu:22.04"
print_info " docker run -d --name karuo-linux --hostname karuo-dev -v karuo-workspace:/workspace --restart unless-stopped ubuntu:22.04 tail -f /dev/null"
fi
# ============================================================
# 完成总结
# ============================================================
END_TIME=$(date +%s)
ELAPSED=$(( (END_TIME - START_TIME) / 60 ))
echo ""
echo -e " ${GREEN}╔══════════════════════════════════════════╗${NC}"
echo -e " ${GREEN}║ 部 署 完 成 ! ║${NC}"
echo -e " ${GREEN}╚══════════════════════════════════════════╝${NC}"
echo ""
echo -e " ${CYAN}已安装软件:${NC}"
echo " [1] Clash Verge Rev - 代理客户端(订阅已配置)"
echo " [2] Cursor - AI 编辑器"
echo " [3] Docker Desktop - 容器平台(国内镜像已配置)"
echo " [4] Ubuntu Linux - 开发容器 (karuo-linux)"
echo ""
echo -e " ${CYAN}Cursor 登录信息:${NC}"
echo " 邮箱: $CURSOR_EMAIL"
echo " 密码: $CURSOR_PASSWORD"
echo ""
echo -e " ${CYAN}Docker 容器:${NC}"
echo " 进入 Linux: docker exec -it karuo-linux bash"
echo " 工作目录: /workspace持久化"
echo ""
echo -e " ${YELLOW}[!] 请登录 Cursor 后删除桌面上的 Cursor登录信息.txt${NC}"
echo -e " ${GRAY}耗时: ${ELAPSED} 分钟${NC}"
echo ""
# 清理
read -p " 是否清理临时下载文件?(y/N) " cleanup
if [ "$cleanup" = "y" ] || [ "$cleanup" = "Y" ]; then
rm -rf "$TEMP_DIR"
print_ok "临时文件已清理"
fi
echo ""
echo " 部署完成感谢使用卡若AI"
echo ""
ok "部署完成macOS"

View File

@@ -1,683 +1,103 @@
<#
.SYNOPSIS
卡若AI · 远程环境一键部署脚本 (Windows)
.DESCRIPTION
自动安装 Clash Verge Rev (代理) + Cursor (AI编辑器) + Docker Desktop (容器)
并配置代理订阅、Cursor 账号、Docker 国内镜像和 Linux 容器环境
.NOTES
版本: 1.0
日期: 2026-02-14
所属: 金盾 · 远程环境一键部署
<#
Windows 一键部署:安装 Feishu + OpenClaw并写入龙猫配置。
要求:先设置环境变量
FEISHU_APP_ID, FEISHU_APP_SECRET, OPENCLAW_BASE_URL, OPENCLAW_API_KEY
可选:
OPENCLAW_MODEL_PROVIDER, OPENCLAW_MODEL_ID, FEISHU_TARGET_CHAT_ID
#>
#Requires -Version 5.1
$ErrorActionPreference = "Stop"
$ErrorActionPreference = "Continue"
$ProgressPreference = "SilentlyContinue"
# ==================== 配置 ====================
$SUBSCRIPTION_URL = "https://api.v6v.eu/api/v1/client/subscribe?token=371fe0545c77e4d9efdf2906a865e403"
$CURSOR_EMAIL = "WilliamAtkins4153@outlook.com"
$CURSOR_PASSWORD = "?056uXrtaWKQ"
$TEMP_DIR = "$env:TEMP\karuo_deploy"
$CLASH_PROXY_PORT = 7897
$CLASH_API_PORT = 9090
# ==================== 工具函数 ====================
function Write-Banner {
Write-Host ""
Write-Host " ╔══════════════════════════════════════════╗" -ForegroundColor Cyan
Write-Host " ║ ║" -ForegroundColor Cyan
Write-Host " ║ 卡若AI · 远程环境一键部署 v1.0 ║" -ForegroundColor Cyan
Write-Host " ║ ║" -ForegroundColor Cyan
Write-Host " ║ [1] Clash Verge Rev 代理客户端 ║" -ForegroundColor Cyan
Write-Host " ║ [2] Cursor AI 编辑器 ║" -ForegroundColor Cyan
Write-Host " ║ [3] Docker Desktop 容器平台 ║" -ForegroundColor Cyan
Write-Host " ║ [4] Ubuntu Linux 开发环境 ║" -ForegroundColor Cyan
Write-Host " ║ ║" -ForegroundColor Cyan
Write-Host " ╚══════════════════════════════════════════╝" -ForegroundColor Cyan
Write-Host ""
function Require-Env($name) {
if (-not $env:$name) { throw "缺少环境变量: $name" }
}
function Write-Step {
param([string]$Step, [string]$Message)
Write-Host "`n [$Step] $Message" -ForegroundColor Yellow
}
Write-Host "== 卡若AI Feishu+龙虾 一键部署 (Windows) =="
Require-Env "FEISHU_APP_ID"
Require-Env "FEISHU_APP_SECRET"
Require-Env "OPENCLAW_BASE_URL"
Require-Env "OPENCLAW_API_KEY"
function Write-Ok {
param([string]$Message)
Write-Host " [OK] $Message" -ForegroundColor Green
}
if (-not $env:OPENCLAW_MODEL_PROVIDER) { $env:OPENCLAW_MODEL_PROVIDER = "api123-icu" }
if (-not $env:OPENCLAW_MODEL_ID) { $env:OPENCLAW_MODEL_ID = "claude-sonnet-4-5-20250929" }
function Write-Err {
param([string]$Message)
Write-Host " [ERR] $Message" -ForegroundColor Red
}
function Write-Info {
param([string]$Message)
Write-Host " -> $Message" -ForegroundColor Gray
}
function Test-AdminPrivilege {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object Security.Principal.WindowsPrincipal($identity)
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
function Download-File {
param(
[string]$Url,
[string]$OutFile,
[string]$Description,
[string]$ProxyUrl = $null
)
Write-Info "正在下载 $Description ..."
try {
$params = @{
Uri = $Url
OutFile = $OutFile
UseBasicParsing = $true
TimeoutSec = 600
}
if ($ProxyUrl) {
$params.Proxy = $ProxyUrl
}
Invoke-WebRequest @params
Write-Ok "下载完成"
return $true
} catch {
Write-Err "下载失败: $($_.Exception.Message)"
return $false
}
}
function Find-ClashExe {
$paths = @(
"$env:LOCALAPPDATA\Clash Verge\Clash Verge.exe",
"C:\Program Files\Clash Verge\Clash Verge.exe",
"$env:LOCALAPPDATA\Programs\clash-verge\Clash Verge.exe",
"$env:PROGRAMFILES\Clash Verge\Clash Verge.exe"
)
foreach ($p in $paths) {
if (Test-Path $p) { return $p }
}
# 搜索桌面快捷方式
$shortcut = Get-ChildItem "$env:APPDATA\Microsoft\Windows\Start Menu\Programs" -Filter "*Clash Verge*" -Recurse -ErrorAction SilentlyContinue | Select-Object -First 1
if ($shortcut) {
$shell = New-Object -ComObject WScript.Shell
$target = $shell.CreateShortcut($shortcut.FullName).TargetPath
if (Test-Path $target) { return $target }
}
return $null
}
function Find-CursorExe {
$paths = @(
"$env:LOCALAPPDATA\Programs\cursor\Cursor.exe",
"C:\Program Files\Cursor\Cursor.exe",
"$env:LOCALAPPDATA\cursor\Cursor.exe"
)
foreach ($p in $paths) {
if (Test-Path $p) { return $p }
}
return $null
}
# ==================== 主流程 ====================
Write-Banner
# 检查管理员权限
if (-not (Test-AdminPrivilege)) {
Write-Host " [!] 建议以管理员身份运行以获得最佳体验" -ForegroundColor Yellow
Write-Host " 当前以普通用户运行,部分操作可能受限" -ForegroundColor Gray
Write-Host ""
}
# 创建临时目录
New-Item -ItemType Directory -Force -Path $TEMP_DIR | Out-Null
Write-Info "临时目录: $TEMP_DIR"
$startTime = Get-Date
# ============================================================
# Step 1: 下载 Clash Verge Rev
# ============================================================
Write-Step "1/8" "下载 Clash Verge Rev (代理客户端)"
$clashExe = Find-ClashExe
if ($clashExe) {
Write-Ok "Clash Verge Rev 已安装: $clashExe"
if (Get-Command winget -ErrorAction SilentlyContinue) {
winget install --id ByteDance.Lark -e --accept-package-agreements --accept-source-agreements | Out-Null
} else {
Write-Info "从 GitHub 获取最新版本..."
$clashInstaller = $null
try {
$headers = @{ "User-Agent" = "karuo-deploy/1.0" }
$release = Invoke-RestMethod -Uri "https://api.github.com/repos/clash-verge-rev/clash-verge-rev/releases/latest" -Headers $headers -TimeoutSec 30
$asset = $release.assets | Where-Object {
$_.name -match "Clash\.Verge.*x64.*setup\.exe$" -or
$_.name -match "Clash\.Verge.*x64-setup\.exe$"
} | Select-Object -First 1
if (-not $asset) {
$asset = $release.assets | Where-Object {
$_.name -match "x64" -and $_.name -match "\.exe$"
} | Select-Object -First 1
}
if ($asset) {
Write-Info "版本: $($release.tag_name) | 文件: $($asset.name)"
$clashInstaller = "$TEMP_DIR\$($asset.name)"
if (-not (Test-Path $clashInstaller)) {
$downloaded = Download-File -Url $asset.browser_download_url -OutFile $clashInstaller -Description "Clash Verge Rev"
if (-not $downloaded) {
# 尝试镜像
Write-Info "尝试镜像下载..."
$mirrorUrl = "https://mirror.ghproxy.com/$($asset.browser_download_url)"
Download-File -Url $mirrorUrl -OutFile $clashInstaller -Description "Clash Verge Rev (镜像)" | Out-Null
}
} else {
Write-Ok "安装包已存在,跳过下载"
}
}
} catch {
Write-Err "GitHub API 请求失败: $($_.Exception.Message)"
}
# 如果还是没下到,给手动链接
if (-not $clashInstaller -or -not (Test-Path $clashInstaller)) {
Write-Err "自动下载失败"
Write-Info "请手动下载: https://github.com/clash-verge-rev/clash-verge-rev/releases"
Write-Info "下载 x64-setup.exe 文件,放入 $TEMP_DIR 后重新运行本脚本"
Write-Host ""
Write-Host " 按任意键跳过 Clash 安装继续..." -ForegroundColor Gray
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
Write-Warning "未检测到 winget请手动安装飞书(Lark)"
}
# ============================================================
# Step 2: 安装 Clash Verge Rev
# ============================================================
Write-Step "2/8" "安装 Clash Verge Rev"
npm config set prefix "$env:USERPROFILE\.local\share\npm-global"
npm install -g openclaw@latest | Out-Null
$openclaw = "$env:USERPROFILE\.local\share\npm-global\openclaw.cmd"
if (-not (Test-Path $openclaw)) { throw "OpenClaw 安装失败:$openclaw 不存在" }
if (Find-ClashExe) {
Write-Ok "已安装,跳过"
} elseif ($clashInstaller -and (Test-Path $clashInstaller)) {
Write-Info "静默安装中约30秒..."
try {
$proc = Start-Process -FilePath $clashInstaller -ArgumentList "/S" -PassThru -Wait -ErrorAction Stop
Start-Sleep -Seconds 5
$cfgDir = Join-Path $env:USERPROFILE ".openclaw"
New-Item -ItemType Directory -Force -Path $cfgDir | Out-Null
$cfgPath = Join-Path $cfgDir "openclaw.json"
if (-not (Test-Path $cfgPath)) { "{}" | Set-Content -Path $cfgPath -Encoding UTF8 }
$clashExe = Find-ClashExe
if ($clashExe) {
Write-Ok "安装成功: $clashExe"
} else {
Write-Err "安装完成但未找到可执行文件,尝试非静默安装..."
Start-Process -FilePath $clashInstaller -Wait
$clashExe = Find-ClashExe
if ($clashExe) { Write-Ok "安装成功" }
}
} catch {
Write-Err "安装失败: $($_.Exception.Message)"
}
} else {
Write-Info "跳过安装(未下载到安装包)"
$raw = Get-Content $cfgPath -Raw
if (-not $raw.Trim()) { $raw = "{}" }
$cfg = $raw | ConvertFrom-Json -Depth 30
if (-not $cfg) { $cfg = @{} }
if (-not $cfg.channels) { $cfg | Add-Member -Name channels -MemberType NoteProperty -Value @{} }
if (-not $cfg.channels.feishu) { $cfg.channels.feishu = @{} }
$acc = @{
enabled = $true
appId = $env:FEISHU_APP_ID
appSecret = $env:FEISHU_APP_SECRET
botName = "龙猫"
domain = "feishu"
dmPolicy = "open"
groupPolicy = "open"
allowFrom = @("*")
groupAllowFrom = @("*")
groups = @{ "*" = @{ requireMention = $false } }
}
# ============================================================
# Step 3: 配置代理订阅
# ============================================================
Write-Step "3/8" "配置代理订阅"
$cfg.channels.feishu.enabled = $true
$cfg.channels.feishu.accountId = "longmao"
$cfg.channels.feishu.accounts = @{ longmao = $acc }
# Clash Verge Rev 配置目录
$configDirCandidates = @(
"$env:APPDATA\io.github.clash-verge-rev.clash-verge-rev",
"$env:APPDATA\clash-verge",
"$env:LOCALAPPDATA\clash-verge"
)
$clashConfigDir = $null
foreach ($dir in $configDirCandidates) {
if (Test-Path $dir) {
$clashConfigDir = $dir
break
$provider = $env:OPENCLAW_MODEL_PROVIDER
$modelId = $env:OPENCLAW_MODEL_ID
$cfg.models = @{
providers = @{
$provider = @{
api = "anthropic-messages"
baseUrl = $env:OPENCLAW_BASE_URL
apiKey = $env:OPENCLAW_API_KEY
models = @(@{ id = $modelId; name = "$modelId ($provider)" })
}
}
}
$cfg.agents = @{
defaults = @{
model = @{ primary = "$provider/$modelId"; fallbacks = @() }
models = @(@{ alias = "default"; provider = $provider; model = $modelId })
}
}
$cfg.plugins = @{ allow = @("feishu") }
$backup = Join-Path $cfgDir ("openclaw.json.bak.deploy_" + (Get-Date -Format "yyyyMMdd_HHmmss"))
Copy-Item $cfgPath $backup -Force
($cfg | ConvertTo-Json -Depth 30) | Set-Content -Path $cfgPath -Encoding UTF8
Write-Host "[OK] 配置已写入: $cfgPath"
& $openclaw gateway restart
Start-Sleep -Seconds 2
& $openclaw channels status --probe --json
if ($env:FEISHU_TARGET_CHAT_ID) {
& $openclaw message send `
--channel feishu `
--account longmao `
--target $env:FEISHU_TARGET_CHAT_ID `
--message "【龙猫】Windows 一键部署完成,当前机器已上线。"
}
if (-not $clashConfigDir) {
# 默认创建在标准位置
$clashConfigDir = "$env:APPDATA\io.github.clash-verge-rev.clash-verge-rev"
}
New-Item -ItemType Directory -Force -Path $clashConfigDir | Out-Null
New-Item -ItemType Directory -Force -Path "$clashConfigDir\profiles" | Out-Null
Write-Info "配置目录: $clashConfigDir"
# 写入 profiles.yaml
$profileUid = [long](Get-Date -UFormat %s) * 1000
$profilesContent = @"
current: $profileUid
chain: []
valid:
- $profileUid
items:
- uid: $profileUid
type: remote
name: "KaruoAI Proxy"
desc: "Auto Deploy"
url: "$SUBSCRIPTION_URL"
option:
update_interval: 86400
with_proxy: false
updated: 0
"@
Set-Content -Path "$clashConfigDir\profiles.yaml" -Value $profilesContent -Encoding UTF8 -Force
Write-Ok "订阅配置已写入 profiles.yaml"
# 写入 verge.yaml启用系统代理 + 自启动)
$vergeContent = @"
enable_system_proxy: true
enable_auto_launch: true
system_proxy_bypass: localhost;127.*;192.168.*;10.*;172.16.*;<local>
clash_core: mihomo
theme_mode: system
"@
$vergePath = "$clashConfigDir\verge.yaml"
if (-not (Test-Path $vergePath)) {
Set-Content -Path $vergePath -Value $vergeContent -Encoding UTF8 -Force
Write-Ok "代理设置已写入 verge.yaml"
} else {
Write-Info "verge.yaml 已存在,保留原配置"
}
# ============================================================
# Step 4: 启动 Clash 并验证网络
# ============================================================
Write-Step "4/8" "启动代理并验证网络"
$clashExe = Find-ClashExe
if ($clashExe) {
# 先关闭已有的进程
Get-Process -Name "Clash Verge" -ErrorAction SilentlyContinue | Stop-Process -Force -ErrorAction SilentlyContinue
Start-Sleep -Seconds 2
Write-Info "启动 Clash Verge Rev..."
Start-Process -FilePath $clashExe
Write-Info "等待代理初始化..."
$proxyReady = $false
$proxyUrl = "http://127.0.0.1:$CLASH_PROXY_PORT"
for ($i = 1; $i -le 12; $i++) {
Start-Sleep -Seconds 5
try {
$response = Invoke-WebRequest -Uri "https://www.google.com" -TimeoutSec 5 -UseBasicParsing -Proxy $proxyUrl -ErrorAction Stop
if ($response.StatusCode -eq 200) {
$proxyReady = $true
break
}
} catch {
Write-Host " ." -NoNewline -ForegroundColor Gray
}
}
Write-Host ""
if ($proxyReady) {
Write-Ok "代理已就绪Google 访问正常"
} else {
Write-Err "代理初始化超时60秒"
Write-Info "请手动操作:"
Write-Info " 1. 打开 Clash Verge Rev"
Write-Info " 2. 点击 Profiles → 更新订阅"
Write-Info " 3. 选择一个节点"
Write-Info " 4. 开启 System Proxy"
Write-Host ""
Write-Host " 代理就绪后按任意键继续..." -ForegroundColor Gray
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
}
} else {
Write-Err "未找到 Clash Verge Rev"
Write-Info "跳过代理启动,后续步骤可能因网络问题失败"
}
# ============================================================
# Step 5: 下载并安装 Cursor
# ============================================================
Write-Step "5/8" "下载并安装 Cursor (AI 编辑器)"
$cursorExe = Find-CursorExe
if ($cursorExe) {
Write-Ok "Cursor 已安装: $cursorExe"
} else {
$cursorUrl = "https://downloader.cursor.sh/windows/nsis/x64"
$cursorInstaller = "$TEMP_DIR\CursorSetup.exe"
$downloadParams = @{
Url = $cursorUrl
OutFile = $cursorInstaller
Description = "Cursor"
}
# 如果代理可用,通过代理下载
if ($proxyReady) {
$downloadParams.ProxyUrl = "http://127.0.0.1:$CLASH_PROXY_PORT"
}
$downloaded = Download-File @downloadParams
if ($downloaded) {
Write-Info "正在安装 Cursor..."
try {
Start-Process -FilePath $cursorInstaller -Wait
Start-Sleep -Seconds 5
$cursorExe = Find-CursorExe
if ($cursorExe) {
Write-Ok "Cursor 安装成功"
} else {
Write-Info "请在安装向导中完成安装"
}
} catch {
Write-Err "安装异常: $($_.Exception.Message)"
}
} else {
Write-Err "Cursor 下载失败"
Write-Info "请手动下载: https://www.cursor.com/downloads"
}
}
# ============================================================
# Step 6: 保存 Cursor 登录信息
# ============================================================
Write-Step "6/8" "保存 Cursor 登录信息"
$desktopPath = [Environment]::GetFolderPath("Desktop")
$credFile = "$desktopPath\Cursor登录信息.txt"
$credContent = @"
================================================
Cursor
AI
$(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
================================================
: $CURSOR_EMAIL
: $CURSOR_PASSWORD
使:
1. Cursor
2. 齿 Sign In
3. Email
4.
5.
================================================
!! : !!
================================================
"@
Set-Content -Path $credFile -Value $credContent -Encoding UTF8 -Force
Write-Ok "登录信息已保存到桌面: Cursor登录信息.txt"
# ============================================================
# Step 7: 安装 Docker Desktop + 配置国内镜像
# ============================================================
Write-Step "7/8" "安装 Docker Desktop + 配置国内镜像"
$dockerInstalled = $false
if (Get-Command "docker" -ErrorAction SilentlyContinue) {
$dockerInstalled = $true
Write-Ok "Docker 已安装: $(docker --version 2>$null)"
} elseif (Test-Path "C:\Program Files\Docker\Docker\Docker Desktop.exe") {
$dockerInstalled = $true
Write-Ok "Docker Desktop 已安装"
}
if (-not $dockerInstalled) {
# 检查并启用 WSL2
Write-Info "检查 WSL2..."
$wslStatus = wsl --status 2>&1
if ($LASTEXITCODE -ne 0) {
Write-Info "启用 WSL2可能需要重启..."
try {
wsl --install --no-distribution 2>$null
Write-Ok "WSL2 已启用"
} catch {
Write-Info "WSL2 启用可能需要手动重启后完成"
}
} else {
Write-Ok "WSL2 已就绪"
}
# 下载 Docker Desktop
$dockerUrl = "https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe"
$dockerInstaller = "$TEMP_DIR\DockerDesktopInstaller.exe"
$downloadParams = @{
Url = $dockerUrl
OutFile = $dockerInstaller
Description = "Docker Desktop"
}
if ($proxyReady) {
$downloadParams.ProxyUrl = "http://127.0.0.1:$CLASH_PROXY_PORT"
}
$downloaded = Download-File @downloadParams
if ($downloaded) {
Write-Info "静默安装 Docker Desktop约2-3分钟..."
try {
Start-Process -FilePath $dockerInstaller -ArgumentList "install", "--quiet", "--accept-license" -Wait
Start-Sleep -Seconds 10
Write-Ok "Docker Desktop 安装完成"
$dockerInstalled = $true
} catch {
Write-Err "Docker Desktop 安装失败: $($_.Exception.Message)"
Write-Info "请手动安装: https://www.docker.com/products/docker-desktop/"
}
}
}
# 配置国内镜像加速
Write-Info "配置 Docker 国内镜像加速..."
$dockerConfigDir = "$env:USERPROFILE\.docker"
New-Item -ItemType Directory -Force -Path $dockerConfigDir | Out-Null
$daemonJsonPath = "$dockerConfigDir\daemon.json"
$mirrorConfig = @{
"registry-mirrors" = @(
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
)
} | ConvertTo-Json -Depth 3
# 如果已有 daemon.json合并 registry-mirrors
if (Test-Path $daemonJsonPath) {
try {
$existing = Get-Content $daemonJsonPath -Raw | ConvertFrom-Json
if (-not $existing."registry-mirrors") {
$existing | Add-Member -NotePropertyName "registry-mirrors" -NotePropertyValue @(
"https://mirror.ccs.tencentyun.com",
"https://docker.mirrors.ustc.edu.cn",
"https://hub-mirror.c.163.com",
"https://registry.docker-cn.com"
)
$existing | ConvertTo-Json -Depth 3 | Set-Content $daemonJsonPath -Encoding UTF8 -Force
Write-Ok "已合并国内镜像到现有 daemon.json"
} else {
Write-Info "daemon.json 已有镜像配置,保留原设置"
}
} catch {
Set-Content -Path $daemonJsonPath -Value $mirrorConfig -Encoding UTF8 -Force
Write-Ok "国内镜像配置已写入 daemon.json"
}
} else {
Set-Content -Path $daemonJsonPath -Value $mirrorConfig -Encoding UTF8 -Force
Write-Ok "国内镜像配置已写入 daemon.json"
}
# 启动 Docker Desktop
if ($dockerInstalled) {
$dockerDesktopExe = "C:\Program Files\Docker\Docker\Docker Desktop.exe"
if (Test-Path $dockerDesktopExe) {
Write-Info "启动 Docker Desktop..."
Start-Process -FilePath $dockerDesktopExe
Write-Info "等待 Docker 引擎就绪最多120秒..."
$dockerReady = $false
for ($i = 1; $i -le 24; $i++) {
Start-Sleep -Seconds 5
try {
$dockerInfo = docker info 2>&1
if ($LASTEXITCODE -eq 0) {
$dockerReady = $true
break
}
} catch {}
Write-Host " ." -NoNewline -ForegroundColor Gray
}
Write-Host ""
if ($dockerReady) {
Write-Ok "Docker 引擎已就绪"
} else {
Write-Err "Docker 引擎启动超时"
Write-Info "请手动启动 Docker Desktop启动后重新运行本脚本即可继续"
}
}
}
# ============================================================
# Step 8: 部署 Linux 开发容器
# ============================================================
Write-Step "8/8" "部署 Linux 开发容器"
$dockerReady = $false
try {
docker info 2>&1 | Out-Null
if ($LASTEXITCODE -eq 0) { $dockerReady = $true }
} catch {}
if ($dockerReady) {
# --- Ubuntu Linux 容器 ---
Write-Info "拉取 Ubuntu 22.04 镜像..."
docker pull ubuntu:22.04 2>&1 | ForEach-Object { Write-Host " $_" -ForegroundColor Gray }
# 检查容器是否已存在
$existingContainer = docker ps -a --filter "name=karuo-linux" --format "{{.Names}}" 2>$null
if ($existingContainer -eq "karuo-linux") {
Write-Info "容器 karuo-linux 已存在,重新创建..."
docker rm -f karuo-linux 2>$null | Out-Null
}
Write-Info "创建 Ubuntu 开发容器..."
docker run -d `
--name karuo-linux `
--hostname karuo-dev `
-v karuo-workspace:/workspace `
--restart unless-stopped `
ubuntu:22.04 `
tail -f /dev/null
Write-Info "安装开发工具git/curl/python3/node/vim..."
# 配置国内 apt 源 + 安装工具
docker exec karuo-linux bash -c @'
# 替换为清华 apt 源(国内加速)
cat > /etc/apt/sources.list << 'APTEOF'
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
APTEOF
apt-get update -qq && \
DEBIAN_FRONTEND=noninteractive apt-get install -y -qq \
curl wget git vim nano \
python3 python3-pip \
nodejs npm \
build-essential \
openssh-server \
htop net-tools iputils-ping \
locales && \
locale-gen en_US.UTF-8 && \
echo "alias ll='ls -la'" >> /root/.bashrc && \
echo "export LANG=en_US.UTF-8" >> /root/.bashrc && \
echo "开发环境初始化完成"
'@
if ($LASTEXITCODE -eq 0) {
Write-Ok "Ubuntu Linux 容器已就绪"
} else {
Write-Err "容器初始化部分失败,但容器已创建"
}
# --- macOS 容器(仅提供说明)---
Write-Host ""
Write-Info "关于 macOS 容器:"
Write-Info " macOS Docker 容器需要 KVM 虚拟化支持(仅 Linux 宿主机)"
Write-Info " Windows 上推荐使用 VMware/UTM 运行 macOS 虚拟机"
Write-Info " 如需在 Linux 服务器上运行 macOS 容器:"
Write-Info " docker pull sickcodes/docker-osx:auto"
Write-Info " docker run -it --device /dev/kvm sickcodes/docker-osx:auto"
# 输出容器使用说明
Write-Host ""
Write-Info "=== 容器使用方法 ==="
Write-Info "进入 Linux: docker exec -it karuo-linux bash"
Write-Info "停止容器: docker stop karuo-linux"
Write-Info "启动容器: docker start karuo-linux"
Write-Info "工作目录: 容器内 /workspace持久化存储"
} else {
Write-Err "Docker 未就绪,跳过容器部署"
Write-Info "请先启动 Docker Desktop然后运行以下命令手动部署"
Write-Info " docker pull ubuntu:22.04"
Write-Info " docker run -d --name karuo-linux --hostname karuo-dev -v karuo-workspace:/workspace --restart unless-stopped ubuntu:22.04 tail -f /dev/null"
}
# ============================================================
# 完成总结
# ============================================================
$elapsed = [math]::Round(((Get-Date) - $startTime).TotalMinutes, 1)
Write-Host ""
Write-Host " ╔══════════════════════════════════════════╗" -ForegroundColor Green
Write-Host " ║ 部 署 完 成 ! ║" -ForegroundColor Green
Write-Host " ╚══════════════════════════════════════════╝" -ForegroundColor Green
Write-Host ""
Write-Host " 已安装软件:" -ForegroundColor Cyan
Write-Host " [1] Clash Verge Rev - 代理客户端(订阅已配置)"
Write-Host " [2] Cursor - AI 编辑器"
Write-Host " [3] Docker Desktop - 容器平台(国内镜像已配置)"
Write-Host " [4] Ubuntu Linux - 开发容器 (karuo-linux)"
Write-Host ""
Write-Host " Cursor 登录信息:" -ForegroundColor Cyan
Write-Host " 邮箱: $CURSOR_EMAIL"
Write-Host " 密码: $CURSOR_PASSWORD"
Write-Host ""
Write-Host " Docker 容器:" -ForegroundColor Cyan
Write-Host " 进入 Linux: docker exec -it karuo-linux bash"
Write-Host " 工作目录: /workspace持久化"
Write-Host ""
Write-Host " [!] 请登录 Cursor 后删除桌面上的 Cursor登录信息.txt" -ForegroundColor Yellow
Write-Host " 耗时: $elapsed 分钟" -ForegroundColor Gray
Write-Host ""
# 清理提示
$cleanup = Read-Host " 是否清理临时下载文件?(Y/N)"
if ($cleanup -eq "Y" -or $cleanup -eq "y") {
Remove-Item -Path $TEMP_DIR -Recurse -Force -ErrorAction SilentlyContinue
Write-Ok "临时文件已清理"
}
Write-Host ""
Write-Host " 按任意键退出..." -ForegroundColor Gray
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
Write-Host "[OK] 部署完成Windows"

View File

@@ -20,7 +20,7 @@ updated: "2026-03-14"
| 子类 | 触发词示例 | 说明 |
|:---|:---|:---|
| **写作** | 写Soul文章、写授文章、Soul派对写文章、第9章写文章、写soul场次、soul文章规则 | 按派对 TXT 写第9章单场文章**先读** `写作/写作规范.md`:人称用「我」不用「房主」、每句空一行、大白话;**6:3:1 内容比例**60% 核心 / 30% 次要 / 10% 其它)**约 50% 处插入核心干货块**35可执行、紧扣主题**数值与场景必须具体****约 20% 处 + 结尾各一句分享句**;联系管理/切片/副业隐晦植入 |
| **写作** | 写Soul文章、写授文章、Soul派对写文章、第9章写文章、写soul场次、soul文章规则 | 按派对 TXT 写第9章单场文章**先读** `写作/写作规范.md`:人称用「我」不用「房主」、每句空一行、大白话;**默认 3:7**(约 30% 核心主题 + 约 70% 子题拆分)+ **标题/文件名/开篇同一刺点**;单主题可选用 6:3:1**约 50% 处插入要点块**36 条);**数值与场景必须具体****约 20% 处 + 结尾各一句分享句**;联系管理/切片/副业隐晦植入 |
| **上传** | Soul文章上传、Soul派对文章、第9章上传、soul上传、写soul文章、文章写好上传 | **仅在你明确说上传时才执行**。上传到小程序;**飞书群推送默认不执行**,只有你说「发飞书」「推飞书」「同步飞书群」时才发。推送内容:前 6% 正文(一句一行、行间空一行)+ 海报图,不发小程序链接,见 `上传/README.md` |
| **运营报表** | 运营报表、派对填表、派对截图填表发群、派对纪要、106场、107场、本月运营数据 | 派对效果数据→飞书表格→智能纪要→飞书群,见飞书管理下运营报表 Skill |

View File

@@ -22,8 +22,11 @@
| `---` 分割线 | 易错乱 |
| `→` 箭头 | 用「到」等中文替代 |
| `##` 小标题 | 用「一、二、三」或数字,或纯空行分段 |
| `@``#` 社交标记 | 易被当乱码或误解析;人名、话题直接写汉字 |
| 连续多行空行 | 易挤出大片空白;段落之间一行空白即可 |
- 每句空一行小节用空行分段标题不含章节号如「9.15」)时,上传命令的 `--title` 用「主题|副标题」即可
- 书稿可保留口语排版;上传前书稿宜与上表一致,`content_upload.py` 内会对 `---` 做转换并建议书稿自行去掉 `**`
- 小节用空行分段标题不含章节号如「9.15」)时,上传命令的 `--title` 用「主题|副标题」即可。
---

View File

@@ -30,9 +30,11 @@
## 三、主题与结构
- **一个观点**:每节只表达一个核心观点,主题清晰
- **6:3:1 内容比例(强制)**:全文内容按比例分配——**60% 第一重要**(核心主题,紧扣本节标题)、**30% 第二重要**(支撑、案例、延伸)、**10% 其它**(点缀、过渡、一笔带过)。成稿后自查:核心是否占六成、次要三成、其它一成
- **中间核心干货块(强制**:约 50% 处插入**一段浓缩要点**35 条可执行、紧扣本节主题,单独成段、用 `---` 与其他段分隔;**不要出现「干货」二字**,直接写金句式要点,每条约 2040 字
- **核心命题**:每节有**一个核心主题**(如物业盘活、视频号中枢等),主题清晰;核心之下允许拆**多个子主题**,不必压成单观点长文。
- **刺点三对齐(强制)****正文第一行标题**`# 第X场短句`)、**磁盘文件名**、**开篇刺激性观点**(首句或紧接开篇数据前的金句)必须是**同一刺点**——一句能挑人、能站队的判断,不抒情、不空泛
- **3:7 内容比例(强制,场次默认****30%** 写**核心主题本身**(只保留骨架:定义、关键条件、主线逻辑,不堆长案例);**约 70%** **往下拆子主题**(平台差异、执行 SOP、财税与合规边界、风险、人设、招商细节、当天场子对照等。子题可用「子题一、子题二」或隐于叙述不强制标号。成稿后自查核心是否控在约三成、展开是否约占七成
- **6:3:1备选**:若某节**单一主题、不分拆**,可采用旧比例 **60% 核心 / 30% 支撑 / 10% 其它**,在文首或文末注明「本节单主题结构」即可。
- **中间核心干货块(强制)**:约 50% 处插入**一段浓缩要点**36 条可执行、紧扣本节(可覆盖核心+子题),单独成段、用 `---` 与其他段分隔;**不要出现「干货」二字**,直接写金句式要点,每条约 2040 字。
- **有数据**:用具体数值验证(场观、人数、时长、营收等);**数值与场景必须具体**,不写笼统表述,有提到的算法、成本、比例都要带具体数字写进去(如 Soul 推流 75 曝光进 1 人、3 万曝光/天、投流 1000 曝光 610 块等)
- **与目录一致**:小节名称、内容与全书结构、其他小节风格统一
- **时间**:以文档/聊天记录时间为准
@@ -98,6 +100,6 @@
- 对话、细节、观点分行,避免大段堆砌
-`---` 做段落分隔(与全书一致)
- **分享句**:全文约 20% 处一句≤50 字、结尾一句≤50 字、围绕主题);**不用「干货」二字及「干货:」等格式**,直接一句金句
- **6:3:1 + 核心干货**:内容比例 60% 核心 / 30% 次要 / 10% 其它;约 50% 处插入核心干货35、紧扣主题、可执行),见第三节
- **文件名(强制)**第9章场次可用「第X场.md」或「第X场-短句.md」体现刺激性观点/效率;短句**不含空格、逗号、全角符号**(如 `第114场-有AI差1万倍.md``第115场-可控的事先做.md`),标题同步放在正文第一行,否则部分编辑器会报错
- **3:7 + 刺点对齐 + 核心干货**:默认 **约 30% 核心主题 + 约 70% 子题拆分**;标题、文件名、开篇同一刺点;约 50% 处插入要点36 条),见第三节。单主题场次可选用 6:3:1。
- **文件名(强制)**第9章场次文件名与正文第一行标题**同一刺点**可用「第X场|短句.md」或「第X场-短句.md」。若用连字符形式,短句**不含空格、逗号、全角符号**(如 `第114场-有AI差1万倍.md`);用竖线「|」时与标题完全一致即可
- 写作与改写第9章场次时**必须先读本规范**,并**先阅读运营报表**,报表上有数字的(时长、场观、进房等)都写进开篇数据段、写清楚;以后写 Soul 派对场次文章都用这套

View File

@@ -0,0 +1,153 @@
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>产研纪要 - 总结</title>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: "PingFang SC", "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background:
radial-gradient(circle at 20% -10%, rgba(59,130,246,0.15) 0%, rgba(59,130,246,0) 45%),
radial-gradient(circle at 90% 0%, rgba(99,102,241,0.12) 0%, rgba(99,102,241,0) 42%),
linear-gradient(180deg, #f5f7fb 0%, #eef2f9 100%);
min-height: 100vh;
color: #0f172a;
line-height: 1.65;
}
.container {
max-width: 960px;
margin: 28px auto;
padding: 24px 28px 30px;
border-radius: 24px;
background: rgba(255,255,255,0.68);
border: 1px solid rgba(255,255,255,0.66);
box-shadow: 0 6px 20px rgba(15,23,42,0.06), 0 18px 48px rgba(15,23,42,0.09), inset 0 1px 0 rgba(255,255,255,0.9);
backdrop-filter: blur(14px) saturate(118%);
-webkit-backdrop-filter: blur(14px) saturate(118%);
}
.header {
background: linear-gradient(135deg, rgba(15,23,42,0.92) 0%, rgba(30,41,59,0.88) 55%, rgba(30,64,175,0.84) 100%);
padding: 24px 26px;
margin: -24px -28px 22px -28px;
border-radius: 24px 24px 18px 18px;
color: #f8fafc;
}
.header h1 {
font-size: 1.72rem;
font-weight: 760;
margin-bottom: 8px;
letter-spacing: .2px;
}
.header .meta {
font-size: 0.92rem;
color: rgba(248,250,252,0.82);
}
h2 {
display: inline-flex;
align-items: center;
font-size: 1.04rem;
margin: 20px 0 10px;
padding: 6px 12px;
border-radius: 999px;
background: linear-gradient(135deg, rgba(30,64,175,0.1) 0%, rgba(99,102,241,0.08) 100%);
border: 1px solid rgba(59,130,246,0.2);
color: #1e3a8a;
font-weight: 700;
}
p, li {
margin-bottom: 8px;
font-size: 0.95rem;
color: #0f172a;
}
ul {
margin: 8px 0 14px 18px;
list-style: none;
padding-left: 0;
}
li {
position: relative;
padding-left: 18px;
}
li::before {
content: "";
width: 8px;
height: 8px;
border-radius: 50%;
background: linear-gradient(135deg, #2563eb, #4f46e5);
position: absolute;
left: 0;
top: 9px;
box-shadow: 0 0 0 3px rgba(37,99,235,0.12);
}
strong {
color: #0b3a9a;
font-weight: 760;
background: linear-gradient(transparent 62%, rgba(59,130,246,0.18) 62%);
}
table {
width: 100%;
border-collapse: collapse;
margin: 10px 0 20px;
font-size: 0.9rem;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 6px 16px rgba(15,23,42,0.05);
}
th, td { border: 1px solid #dbe3f0; padding: 10px 12px; text-align: left; }
th {
background: linear-gradient(180deg, #eef4ff 0%, #e7efff 100%);
font-weight: 700;
color: #1e3a8a;
}
tr:nth-child(even) { background: #f8fbff; }
hr {
margin: 18px 0;
border: none;
border-top: 1px dashed rgba(51,65,85,0.24);
}
.foot {
font-size: 0.84rem;
color: #64748b;
margin-top: 18px;
border-top: 1px solid rgba(148,163,184,0.32);
padding-top: 10px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1>开发团队会议纪要_智能纪要图_20260324</h1>
<div class="meta">智能纪要图片 | 高级重点版</div>
</div>
<div class="content">
<p>会议主题:工作手机接入排障会</p>
<p>参会人:卡若(业务负责人)、开发同学(技术执行)</p>
<h2>目标&结果</h2>
<li></strong>统一核心目标</strong>:先打通“存客宝连接工作手机”主链路,替代旧方案。</li>
<li></strong>统一任务层级</strong>:确认“工作手机 SDK 完善”是子任务,不是总目标。</li>
<li></strong>当前状态</strong>:口径进度约 15%,但稳定性和可交付标准尚未达标。</li>
<h2>过程&问题</h2>
<li>逐项排查了任务拆解、设备归属、全局计划、客资同步、后台布局。</li>
<li></strong>重点问题 1性能卡顿明显</strong>,且不是偶发现象,直接影响使用体验。</li>
<li></strong>重点问题 2自动化不足</strong>,多个环节仍靠手工,效率低且容易漏配置。</li>
<li></strong>重点问题 3数据链路断层</strong>,出现“后台有客资、业务侧看不到”的异常。</li>
<h2>反思&想法</h2>
<li>现阶段不该再堆功能,要先把最小闭环跑通并稳定。</li>
<li>项目管理要拆清楚:总目标、子任务、风险、进度分别跟踪。</li>
<li>客户环境测试要前置,不再只以本地可用作为通过标准。</li>
<h2>总结&优化</h2>
<li>当前主要短板是:</strong>流程未闭环 + 配置不统一 + 稳定性不足</strong></li>
<li>优化方向:默认配置自动化、真实场景回归、问题台账责任到人。</li>
<li>每个问题都要绑定负责人、截止时间、验收口径,避免“讨论完就散”。</li>
<h2>下一步执行</h2>
<li>24小时内补齐全局计划、设备归属扫码、默认绑定规则并输出清单。</li>
<li>48小时内抽样排查“后台有客资但业务侧无数据”的链路断点。</li>
<li>72小时内完成客户环境专项压测重点验证卡顿、自动绑定、客资同步。</li>
</div>
<p class="foot">(根据会议记录整理)</p>
</div>
</body>
</html>

View File

@@ -16,27 +16,113 @@ HEAD = """<!DOCTYPE html>
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
background: linear-gradient(180deg, #f8fafc 0%, #f1f5f9 100%);
min-height: 100vh; color: #1a1a1a; line-height: 1.6;
font-family: "PingFang SC", "SF Pro Display", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
background:
radial-gradient(circle at 20% -10%, rgba(59,130,246,0.15) 0%, rgba(59,130,246,0) 45%),
radial-gradient(circle at 90% 0%, rgba(99,102,241,0.12) 0%, rgba(99,102,241,0) 42%),
linear-gradient(180deg, #f5f7fb 0%, #eef2f9 100%);
min-height: 100vh;
color: #0f172a;
line-height: 1.65;
}
.container {
max-width: 960px;
margin: 28px auto;
padding: 24px 28px 30px;
border-radius: 24px;
background: rgba(255,255,255,0.68);
border: 1px solid rgba(255,255,255,0.66);
box-shadow: 0 6px 20px rgba(15,23,42,0.06), 0 18px 48px rgba(15,23,42,0.09), inset 0 1px 0 rgba(255,255,255,0.9);
backdrop-filter: blur(14px) saturate(118%);
-webkit-backdrop-filter: blur(14px) saturate(118%);
}
.container { max-width: 900px; margin: 0 auto; padding: 32px; }
.header {
background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
padding: 24px 32px; margin: -32px -32px 24px -32px; border-radius: 0 0 16px 16px;
background: linear-gradient(135deg, rgba(15,23,42,0.92) 0%, rgba(30,41,59,0.88) 55%, rgba(30,64,175,0.84) 100%);
padding: 24px 26px;
margin: -24px -28px 22px -28px;
border-radius: 24px 24px 18px 18px;
color: #f8fafc;
}
.header h1 {
font-size: 1.72rem;
font-weight: 760;
margin-bottom: 8px;
letter-spacing: .2px;
}
.header .meta {
font-size: 0.92rem;
color: rgba(248,250,252,0.82);
}
h2 {
display: inline-flex;
align-items: center;
font-size: 1.04rem;
margin: 20px 0 10px;
padding: 6px 12px;
border-radius: 999px;
background: linear-gradient(135deg, rgba(30,64,175,0.1) 0%, rgba(99,102,241,0.08) 100%);
border: 1px solid rgba(59,130,246,0.2);
color: #1e3a8a;
font-weight: 700;
}
p, li {
margin-bottom: 8px;
font-size: 0.95rem;
color: #0f172a;
}
ul {
margin: 8px 0 14px 18px;
list-style: none;
padding-left: 0;
}
li {
position: relative;
padding-left: 18px;
}
li::before {
content: "";
width: 8px;
height: 8px;
border-radius: 50%;
background: linear-gradient(135deg, #2563eb, #4f46e5);
position: absolute;
left: 0;
top: 9px;
box-shadow: 0 0 0 3px rgba(37,99,235,0.12);
}
strong {
color: #0b3a9a;
font-weight: 760;
background: linear-gradient(transparent 62%, rgba(59,130,246,0.18) 62%);
}
table {
width: 100%;
border-collapse: collapse;
margin: 10px 0 20px;
font-size: 0.9rem;
border-radius: 12px;
overflow: hidden;
box-shadow: 0 6px 16px rgba(15,23,42,0.05);
}
th, td { border: 1px solid #dbe3f0; padding: 10px 12px; text-align: left; }
th {
background: linear-gradient(180deg, #eef4ff 0%, #e7efff 100%);
font-weight: 700;
color: #1e3a8a;
}
tr:nth-child(even) { background: #f8fbff; }
hr {
margin: 18px 0;
border: none;
border-top: 1px dashed rgba(51,65,85,0.24);
}
.foot {
font-size: 0.84rem;
color: #64748b;
margin-top: 18px;
border-top: 1px solid rgba(148,163,184,0.32);
padding-top: 10px;
}
.header h1 { font-size: 1.75rem; font-weight: 700; margin-bottom: 8px; }
.header .meta { font-size: 0.95rem; color: #64748b; }
h2 { font-size: 1.2rem; margin: 24px 0 12px; padding-bottom: 6px; border-bottom: 2px solid #e2e8f0; }
p, li { margin-bottom: 8px; font-size: 0.95rem; }
ul { margin: 8px 0 16px 24px; }
strong { color: #1e293b; }
table { width: 100%; border-collapse: collapse; margin: 12px 0 24px; font-size: 0.9rem; }
th, td { border: 1px solid #e2e8f0; padding: 10px 12px; text-align: left; }
th { background: #f1f5f9; font-weight: 600; }
tr:nth-child(even) { background: #fafafa; }
hr { margin: 20px 0; border: none; border-top: 1px solid #e2e8f0; }
.foot { font-size: 0.85rem; color: #94a3b8; margin-top: 24px; }
</style>
</head>
<body>
@@ -125,7 +211,7 @@ def build_summary_html(md_path: Path, output_path: Path = None) -> Path:
name = md_path.stem.replace(" ", "_") + ".html"
output_path = OUTPUT_DIR / name
title = md_path.stem
meta = "2026年1月28日 | 产研团队 第20场"
meta = "智能纪要图片 | 高级重点版"
foot = "(根据会议记录整理)"
content = md_to_html(md_path, title=title, meta=meta, foot=foot)
html = _wrap_full_html(content, title=title, meta=meta, foot=foot)

View File

@@ -1,3 +1,4 @@
https://cunkebao.feishu.cn/minutes/obcnl35646ayfcgf94h4n8ir
https://cunkebao.feishu.cn/minutes/obcnj1y95z73n53e8m6m1s3j
https://cunkebao.feishu.cn/minutes/obcnjzx7dyxco67btud7y8gz
https://cunkebao.feishu.cn/minutes/obcnjbn178iy6919od4119ww

View File

@@ -1,6 +1,6 @@
{
"access_token": "u-dWPcqP0rB7fENTwDCSiBnJlh3exxghoriMGaZw0027kJ",
"refresh_token": "ur-d.2mNPC_t4obijrT.PUIe6lh3KH1ghOhOMGaZw40224I",
"access_token": "u-egmupNnTR6RpRhCKTAPS3Flh3CH1ghWjXgGaUxg0260Z",
"refresh_token": "ur-ci124eMop5GEdp1_oleMtOlh1AHxghUNigGaEM0026lF",
"name": "飞书用户",
"auth_time": "2026-03-23T08:28:12.167751"
"auth_time": "2026-03-25T12:57:21.419027"
}

View File

@@ -26,6 +26,11 @@ from pathlib import Path
from datetime import datetime
import requests
# 飞书群发送总开关(默认关闭)
FEISHU_GROUP_SEND_DISABLED = os.environ.get("FEISHU_GROUP_SEND_DISABLED", "1").strip().lower() in {
"1", "true", "yes", "on"
}
SCRIPT_DIR = Path(__file__).resolve().parent
sys.path.insert(0, str(SCRIPT_DIR))
import feishu_wiki_create_doc as fwd # 复用 token 逻辑
@@ -584,6 +589,9 @@ def write_blocks(doc_token: str, headers: dict, blocks: list) -> None:
def send_webhook(webhook: str, text: str) -> None:
if not webhook:
return
if FEISHU_GROUP_SEND_DISABLED:
print("⛔ 已拦截FEISHU_GROUP_SEND_DISABLED=1跳过飞书群 webhook 推送")
return
payload = {"msg_type": "text", "content": {"text": text}}
r = requests.post(webhook, json=payload, timeout=10)
try:

View File

@@ -20,6 +20,11 @@ import shutil
import requests
from pathlib import Path
# 飞书群发送总开关(默认关闭)
FEISHU_GROUP_SEND_DISABLED = os.environ.get("FEISHU_GROUP_SEND_DISABLED", "1").strip().lower() in {
"1", "true", "yes", "on"
}
# ─── 本地飞书 API 服务 ───────────────────────────────────────────────
LOCAL_API = "http://127.0.0.1:5050"
@@ -112,6 +117,9 @@ def build_post_message(title: str, summary: str, image_key: str | None) -> dict:
def send_webhook(webhook: str, payload: dict) -> bool:
"""发送消息到飞书群 webhook"""
if FEISHU_GROUP_SEND_DISABLED:
print("⛔ 已拦截FEISHU_GROUP_SEND_DISABLED=1禁止发送飞书群消息")
return False
resp = requests.post(webhook, json=payload, timeout=15)
data = resp.json()
if data.get("code") == 0 or data.get("StatusCode") == 0:

View File

@@ -42,6 +42,11 @@ DEFAULT_WEBHOOK = os.environ.get(
),
)
# 飞书群发送总开关(默认关闭):为避免误发群消息,默认直接拦截。
FEISHU_GROUP_SEND_DISABLED = os.environ.get("FEISHU_GROUP_SEND_DISABLED", "1").strip().lower() in {
"1", "true", "yes", "on"
}
# lark_md 中单元素不宜过长
_MAX_MD = 2800
@@ -189,6 +194,13 @@ def main():
)
args = ap.parse_args()
if FEISHU_GROUP_SEND_DISABLED:
print(
"已拦截发送:当前已启用 FEISHU_GROUP_SEND_DISABLED飞书群禁发",
file=sys.stderr,
)
sys.exit(2)
if args.file:
path = Path(args.file)
if not path.exists():

View File

@@ -75,13 +75,13 @@ ROWS = {
'130': [ 'Soul爆量脸视频号问微信', 146, 0, 2278, 0, 3, 1, 3, 4, 355 ],
# 131场 2026-03-23视频号结束页 02:05:55≈126min观众1144、最高75、关注4、点赞1595+评论498+分享12无总热度/礼物展示填0Soul推流0→跳过第5行
'131': [ '视频号中枢Soul哨兵', 126, 0, 1144, 0, 2105, 0, 0, 4, 75 ],
# 132场 2026-03-24视频号结束页 02:07:54≈128min观众817、最高47、关注4、总热度24、送礼1直播收入0.2元Soul推流0→跳过第5行灵魂力列填0收入不进表
'132': [ '视频号817热24礼1', 128, 0, 817, 0, 24, 1, 0, 4, 47 ],
# 132场 2026-03-24直播结束页 02:07:54≈128min观众817、最高47、关注4、总热度24、送礼1直播收入未入表Soul推流0→跳过第5行
'132': [ 'Soul817热24礼1', 128, 0, 817, 0, 24, 1, 0, 4, 47 ],
}
# 场次→按日期列填写时的日期(表头为当月日期 1~31
SESSION_DATE_COLUMN = {'105': '20', '106': '21', '107': '23', '113': '2', '114': '3', '115': '4', '116': '5', '117': '6', '118': '7', '119': '8', '124': '14', '126': '17', '127': '18', '128': '19', '129': '20', '130': '21', '131': '23', '132': '24'}
SESSION_DATE_COLUMN = {'105': '20', '106': '21', '107': '23', '113': '2', '114': '3', '115': '4', '116': '5', '117': '6', '118': '7', '119': '8', '124': '14', '126': '17', '127': '18', '128': '19', '129': '20', '130': '21', '131': '23', '132': '24', '133': '25'}
# 场次→月份(用于选择 2月/3月 等工作表标签,避免写入错月)
SESSION_MONTH = {'105': 2, '106': 2, '107': 2, '113': 3, '114': 3, '115': 3, '116': 3, '117': 3, '118': 3, '119': 3, '124': 3, '126': 3, '127': 3, '128': 3, '129': 3, '130': 3, '131': 3, '132': 3}
SESSION_MONTH = {'105': 2, '106': 2, '107': 2, '113': 3, '114': 3, '115': 3, '116': 3, '117': 3, '118': 3, '119': 3, '124': 3, '126': 3, '127': 3, '128': 3, '129': 3, '130': 3, '131': 3, '132': 3, '133': 3}
# 派对录屏(飞书妙记)链接:场次 → 完整 URL填表时写入「派对录屏」行对应列
# 从飞书妙记复制链接后填入,新场次需补全
@@ -99,6 +99,8 @@ PARTY_VIDEO_LINKS = {
'129': 'https://cunkebao.feishu.cn/minutes/obcnjb994323l12lhl448177',
'130': 'https://cunkebao.feishu.cn/minutes/obcnj1y95z73n53e8m6m1s3j',
'131': 'https://cunkebao.feishu.cn/minutes/obcnjzx7dyxco67btud7y8gz',
'132': 'https://cunkebao.feishu.cn/minutes/obcnl35646ayfcgf94h4n8ir',
'133': 'https://cunkebao.feishu.cn/minutes/obcnmr15ssh29opo6e65na6i',
}
# 团队会议(飞书妙记)链接:场次 → 完整 URL填表时写入「团队会议」行对应列row 31
@@ -115,6 +117,8 @@ TEAM_MEETING_LINKS = {
'129': 'https://kcnxrqd5ata7.feishu.cn/minutes/obcnjbn178iy6919od4119ww',
# 131与派对同源妙记时可同链若售商品侧另有团队会议妙记请改此处
'131': 'https://cunkebao.feishu.cn/minutes/obcnjzx7dyxco67btud7y8gz',
'132': 'https://cunkebao.feishu.cn/minutes/obcnl35646ayfcgf94h4n8ir',
'133': 'https://cunkebao.feishu.cn/minutes/obcnmr15ssh29opo6e65na6i',
}
# 补充直链A 列无独立标签的空行):场次 → [(行号1-based, 完整URL), ...]
@@ -124,10 +128,6 @@ SESSION_SUPPLEMENT_ROW_LINKS = {
(30, 'https://cunkebao.feishu.cn/wiki/wikcnIgAGSNHo0t36idHJ668Gfd?sheet=bJR5sA'),
(32, 'https://cunkebao.feishu.cn/file/HNZEb0mxqoW38KxlFLAcKb2Rnef'),
],
# 132仅写 3 月运营报表 Wiki派对录屏/团队会议/总结图链有妙记或文件后再补 SESSION_SUPPLEMENT / PARTY_VIDEO / TEAM
'132': [
(30, 'https://cunkebao.feishu.cn/wiki/wikcnIgAGSNHo0t36idHJ668Gfd?sheet=bJR5sA'),
],
}
# 小程序当日运营数据:日期号 → {访问次数, 访客, 交易金额},填表时自动写入对应日期列

View File

@@ -1,6 +1,6 @@
{
"updated": "2026-03-23 20:44:16",
"date": "2026-03-23",
"updated": "2026-03-25 21:07:35",
"date": "2026-03-25",
"scan_total": 0,
"copied_new": 0,
"skipped_idempotent": 0,

File diff suppressed because one or more lines are too long

View File

@@ -7,24 +7,25 @@ description: >
triggers: 多平台分发、一键分发、全平台发布、批量分发、视频分发
owner: 木叶
group: 木
version: "4.5"
updated: "2026-03-23"
version: "4.6"
updated: "2026-03-25"
---
# 多平台分发 Skillv4.5
# 多平台分发 Skillv4.6
> **核心原则**API 发布为主Playwright 为辅。确保确定性地分发到各平台
> **v4.5 视频号铁律****必须先等微信扫码完成Cookie 连续校验通过),再上传。** `video_channels_resume.py` **默认弹出 Chromium 窗口**扫码,扫完再自动上传;`--silent-login` 才是无头
> **核心原则****统一元数据 + 稳定结果输出 + 可无人值守**。能用 API 就用 API但**视频号优先用网页态自动化Playwright且默认无窗口**避免“API 口子变/参数边界不一致”导致的不可控
> **v4.6 视频号默认策略(本轮验证)****发布统一走 `视频号发布/脚本/channels_web_cli.py`,默认 headless。**需要调试才用 `--show` / `CHANNELS_HEADED=1`。终端会输出 **`=== 单条发布结果 ===`** 与 **`[批次发布结果]`**,便于复制复盘
> **v4.4**默认无窗口、B 站 headless、定时 ≥5min、`--until-success`、二维码路径标记。
> **v4.3**:默认不自动弹视频号登录。**v4.2**:智能排期与去重下标对齐。
## 〇、执行原则(第一性原理)
- **视频号两步(强制)**:① 微信扫码登录助手并落盘 Cookie② 再跑上传。**禁止**在 Cookie 未确认有效时上传。一键:`video_channels_resume.py`**默认弹窗** Chromium`--silent-login` 无头;`--step1-only` 只登录)
- **目标优先**:全平台时若含视频号且 Cookie 无效 → 先完成第①步,再 `distribute_all`;或直接跑 `video_channels_resume.py` 仅发视频号
- **Cookie 优先**:任何登录成功 → **必须落盘**;视频号同时写入 `视频号发布/脚本/channels_storage_state.json` `多平台分发/cookies/视频号_cookies.json`(脚本已自动同步)。
- **默认静默**:批量分发**不弹窗**、不自动拉起登录流程,适合 Cursor 内无人值守跑命令
- **需要扫码时**:显式 `python3 channels_login.py`,或 `distribute_all.py --auto-channels-login`,或 `CHANNELS_AUTO_LOGIN=1 python3 channels_api_publish.py``channels_login.py` 可用 `cursor://…/simple-browser`;完全避免 Chromium 回退见脚本内 CDP 说明
- **视频号两步(强制)**:① 扫码登录并落盘 Cookie② 再发布。**禁止**在 Cookie 未确认有效时发布
- **视频号默认无窗口(强制偏好)**:发布用 `视频号发布/脚本/channels_web_cli.py`(默认 headless只在排障时用 `--show`
- **Cookie 优先(强制)**:任何登录成功 → **必须落盘**;视频号写入 `视频号发布/脚本/channels_storage_state.json`,并同步到 `多平台分发/cookies/视频号_cookies.json`(脚本已自动同步)。
- **默认静默(无人值守)**:批量分发默认不弹窗、不自动拉起登录,适合 Cursor 内后台跑
- **需要扫码时**:显式 `python3 channels_login.py`(推荐,可配 `CHANNELS_SILENT_QR=1` 打印二维码路径);或在分发器里用 `--auto-channels-login`(仅当你允许脚本拉起登录流程时才用)
- **结果必须可读**:视频号发布后终端必须出现“成功/失败/原因/日志行”,用于你快速判断要不要重试/换头/重新扫码。
---
@@ -32,7 +33,7 @@ updated: "2026-03-23"
| 平台 | 实现方式 | 定时发布 | Cookie 有效期 | 120 场实测 |
|------|----------|----------|---------------|------------|
| **视频号** | **纯 API**DFS 上传 + post_create | API 原生支持 | ~24-48h | 12/12 成功 |
| **视频号** | **网页态自动化Playwright默认 headless**`视频号发布/脚本/channels_web_cli.py` | 平台定时(脚本注入) | ~24-48h | 12/12 成功 |
| **B站** | **bilibili-api-python** API 优先 → Playwright 兜底 | API `dtime` | ~6 个月 | 12/12 成功 |
| **小红书** | Playwright headless 自动化 | UI 定时(降级立即) | ~1-3 天 | 12/12 成功 |
| **快手** | Playwright headless 自动化 | UI 定时 | ~7-30 天 | Cookie 过期 |
@@ -86,10 +87,24 @@ python3 distribute_all.py --video-dir "/path/to/成片" --until-success
# 仅查看断点:各平台已成功/待传(不执行上传);加 --resume-report-detail 列出文件名
python3 distribute_all.py --resume-report --resume-report-detail --video-dir "/path/to/成片"
# 视频号一条龙:后台静默登录 → 终端打印二维码路径 → 你在对话里让助手读图扫码 → Cookie 好后自动仅发视频号(断点+until-success
python3 video_channels_resume.py --video-dir "/path/to/成片"
# 无头(不弹窗):加 --silent-login
# 只做扫码不上传:加 --step1-only
# -----------------------------
# 视频号(推荐:统一走网页 CLI默认无窗口
cd ../视频号发布/脚本
# 1) 先确认登录态Cookie + API 预检)
python3 channels_web_cli.py check
# 2) Cookie 过期就扫码(默认会打印指引;无窗口二维码模式)
CHANNELS_SILENT_QR=1 python3 channels_login.py
# 3) 单条发布:会输出「=== 单条发布结果 ===」
python3 channels_web_cli.py publish-one --video "/path/to/成片/xxx.mp4" --immediate
# 4) 目录批量发布:会输出汇总表 +「[批次发布结果]」
python3 channels_web_cli.py publish-dir --video-dir "/path/to/成片" --min-gap 10 --max-gap 25
# 仅排障时开窗口(有头)
python3 channels_web_cli.py publish-one --video "/path/to/成片/xxx.mp4" --immediate --show
```
---

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,90 @@
#!/usr/bin/env python3
"""
视频号发布全链路守护:
循环「全量预检auth + finder_raw→ 不合格则 playwright 登录 → distribute_all --until-success」
直到本批次全部成功或进程被手动停止。
用法:
python3 channels_full_chain.py --video-dir /tmp/soul_channels_127_128_bundle
python3 channels_full_chain.py --video-dir ... --serial --until-success-sleep 180
额外参数会原样传给 distribute_all.py例如 --no-dedup
"""
from __future__ import annotations
import argparse
import subprocess
import sys
import time
from pathlib import Path
SCRIPT_DIR = Path(__file__).resolve().parent
CHANNELS_LOGIN = SCRIPT_DIR.parent.parent / "视频号发布" / "脚本" / "channels_login.py"
DISTRIBUTE = SCRIPT_DIR / "distribute_all.py"
sys.path.insert(0, str(SCRIPT_DIR))
from cookie_manager import channels_publish_storage_ready, sync_channels_cookie_files # noqa: E402
def main() -> int:
parser = argparse.ArgumentParser(description="视频号全链路守护(预检+登录+until-success")
parser.add_argument("--video-dir", required=True)
parser.add_argument(
"--sleep-between-mega-rounds",
type=int,
default=90,
help="整轮分发仍失败时,休眠秒数后重新预检并进入下一轮",
)
parser.add_argument("--until-success-sleep", type=int, default=120)
parser.add_argument("--serial", action="store_true", help="传给 distribute_all串行发视频号")
args, passthrough = parser.parse_known_args()
vid = str(Path(args.video_dir).expanduser().resolve())
cmd = [
sys.executable,
str(DISTRIBUTE),
"--platforms",
"视频号",
"--video-dir",
vid,
"--auto-channels-login",
"--until-success",
"--until-success-sleep",
str(args.until_success_sleep),
]
if args.serial:
cmd.append("--serial")
cmd.extend(passthrough)
mega = 0
while True:
mega += 1
print(f"\n{'#' * 20} 全链路第 {mega} 轮(预检 → 分发){'#' * 20}\n", flush=True)
sync_channels_cookie_files()
ok, msg = channels_publish_storage_ready()
print(f" [预检] {'' if ok else ''} {msg}", flush=True)
if not ok and CHANNELS_LOGIN.exists():
print(" [预检] 触发 channels_login --playwright-only 补全会话…", flush=True)
subprocess.run(
[sys.executable, str(CHANNELS_LOGIN), "--playwright-only"],
cwd=str(CHANNELS_LOGIN.parent),
timeout=700,
check=False,
)
sync_channels_cookie_files()
ok2, msg2 = channels_publish_storage_ready()
print(f" [预检·登录后] {'' if ok2 else ''} {msg2}", flush=True)
print(f" [分发] 启动: {' '.join(cmd)}\n", flush=True)
r = subprocess.run(cmd, cwd=str(SCRIPT_DIR))
if r.returncode == 0:
print("\n[✓] 全链路结束:本批次视频号已全部成功。", flush=True)
return 0
print(
f"\n[i] mega 轮未全部成功,{args.sleep_between_mega_rounds}s 后重新预检并入下一轮…\n",
flush=True,
)
time.sleep(args.sleep_between_mega_rounds)
if __name__ == "__main__":
raise SystemExit(main())

View File

@@ -237,6 +237,54 @@ def _check_platform_stub(platform: str, cookies: dict[str, str]) -> tuple[bool,
return True, "存在(未做接口校验)"
def channels_finder_raw_from_storage(path: Path | None = None) -> str:
"""
从 Playwright storage_statelegacy 或 central读取视频号发表所需的 finder_raw。
缺此项时 channels_api 会报 300002仅 Cookie 有效不够)。
"""
sync_channels_cookie_files()
p = path or PLATFORM_LEGACY_PATHS.get("视频号")
if not p or not p.exists():
p = get_cookie_path("视频号")
if not p.exists():
return ""
try:
with open(p, "r", encoding="utf-8") as f:
data = json.load(f)
except (json.JSONDecodeError, OSError):
return ""
fallback = ""
for origin_block in data.get("origins") or []:
if origin_block.get("origin") != "https://channels.weixin.qq.com":
continue
for it in origin_block.get("localStorage") or []:
name = str(it.get("name") or "")
v = str(it.get("value") or "").strip()
if not v:
continue
if name == "finder_raw":
return v
lk = name.lower()
if len(v) > 80 and (
"rawkey" in lk or "keybuff" in lk or lk in ("finderraw", "rawkeybuff")
):
if len(v) > len(fallback):
fallback = v
return fallback
def channels_publish_storage_ready() -> tuple[bool, str]:
"""视频号「可发表」auth 通过且 storage 含非空 finder_raw。"""
sync_channels_cookie_files()
raw = channels_finder_raw_from_storage()
if not raw:
return False, "localStorage 缺少 finder_raw需重新扫码登录并保持窗口至 rawKeyBuff 就绪)"
ok, msg = check_cookie_valid("视频号")
if not ok:
return False, msg
return True, f"可发表 | {msg}"
def sync_channels_cookie_files() -> None:
"""
视频号 Cookie 双路径对齐:

View File

@@ -23,6 +23,7 @@
import argparse
import asyncio
import importlib.util
import inspect
import json
import os
import subprocess
@@ -41,6 +42,7 @@ from cookie_manager import (
load_cookies,
SUPPORTED_PLATFORMS,
sync_channels_cookie_files,
channels_publish_storage_ready,
)
from publish_result import (PublishResult, print_summary, save_results,
load_published_set, load_failed_tasks)
@@ -62,6 +64,9 @@ LOGIN_COMMANDS = {
"快手": f'python3 "{BASE_DIR / "快手发布" / "脚本" / "kuaishou_login.py"}"',
}
BAN_KEYWORDS = ("封禁", "封号", "禁止", "冻结", "suspend", "banned", "risk", "风控", "限制")
FEISHU_GROUP_SEND_DISABLED = os.environ.get("FEISHU_GROUP_SEND_DISABLED", "1").strip().lower() in {
"1", "true", "yes", "on"
}
def _print_unified_browser_profiles() -> None:
@@ -174,24 +179,33 @@ def _enforce_channels_schedule_slots(
def _ensure_channels_cookie_or_login(*, auto_login: bool) -> None:
"""发视频号前对齐双路径 Cookie。默认静默仅 auto_login 且未设 NO_AUTO_CHANNELS_LOGIN 时才调起扫码。"""
"""发视频号前对齐双路径 Cookie + finder_raw发表必需。默认静默;仅 auto_login 且未设 NO_AUTO_CHANNELS_LOGIN 时才调起扫码。"""
sync_channels_cookie_files()
pub_ok, pub_detail = channels_publish_storage_ready()
if pub_ok:
return
print(f"\n[*] 视频号全链路预检: {pub_detail}", flush=True)
if os.environ.get("NO_AUTO_CHANNELS_LOGIN", "").strip().lower() in ("1", "true", "yes"):
print(
" (已设 NO_AUTO_CHANNELS_LOGIN不自动弹窗请先手动 channels_login 至 rawKeyBuff 就绪)\n",
flush=True,
)
return
if not auto_login:
return
ok, _ = check_cookie_valid("视频号")
if ok:
print(
" (未加 --auto-channels-login请手动登录或重跑时加上该参数\n",
flush=True,
)
return
if not CHANNELS_LOGIN_SCRIPT.exists():
return
print(
"\n[*] 视频号 Cookie 无效 → 打开浏览器扫码登录(登录完成即写入并同步 Cookie\n",
"\n[*] 视频号需补全登录态 → 打开浏览器扫码(须保持窗口直至终端提示 rawKeyBuff / Cookie 完成\n",
flush=True,
)
try:
subprocess.run(
[sys.executable, str(CHANNELS_LOGIN_SCRIPT)],
[sys.executable, str(CHANNELS_LOGIN_SCRIPT), "--playwright-only"],
cwd=str(CHANNELS_LOGIN_SCRIPT.parent),
timeout=600,
)
@@ -293,6 +307,9 @@ def print_resume_report(
def send_feishu_alert(alerts: list[str]):
"""通过飞书 Webhook 发送 Cookie 过期预警"""
if FEISHU_GROUP_SEND_DISABLED:
print(" [i] 飞书群禁发已开启,跳过 Cookie 预警推送")
return
import os
webhook = os.environ.get("FEISHU_WEBHOOK_URL", "")
if not webhook or not alerts:
@@ -374,6 +391,7 @@ async def distribute_to_platform(
total = len(to_publish)
pub_fn = getattr(module, "publish_one_compat", None) or module.publish_one
pub_fn_params = set(inspect.signature(pub_fn).parameters.keys())
for i, vp in enumerate(to_publish):
vmeta = VideoMeta.from_filename(str(vp))
title = vmeta.title(platform)
@@ -383,7 +401,11 @@ async def distribute_to_platform(
else None
)
try:
r = await pub_fn(str(vp), title, i + 1, total, scheduled_time=stime)
kwargs = {"scheduled_time": stime}
# 某些平台函数支持 skip_dedup确保 --no-dedup 真正下传到平台实现。
if "skip_dedup" in pub_fn_params:
kwargs["skip_dedup"] = bool(skip_dedup)
r = await pub_fn(str(vp), title, i + 1, total, **kwargs)
if isinstance(r, PublishResult):
results.append(r)
else:

View File

@@ -557,3 +557,979 @@
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/派对开到一百二十场图啥.mp4", "title": "派对开到一百二十场图啥", "success": true, "status": "reviewing", "message": "API确认列表未匹配 (未在列表前20条中找到)", "screenshot": "/tmp/channels_ss/派对开到一百二十场图啥_5_verify.png", "elapsed_sec": 37.726067781448364, "timestamp": "2026-03-24 03:45:20"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/磨AI和token几十人在扛.mp4", "title": "磨AI和token几十人在扛", "success": false, "status": "error", "message": "异常: Locator.click: Timeout 30000ms exceeded.\nCall log:\n - waiting for locator(\"butt", "elapsed_sec": 47.92081093788147, "timestamp": "2026-03-24 03:45:50"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/磨AI和token几十人在扛.mp4", "title": "磨AI和token几十人在扛", "success": true, "status": "reviewing", "message": "API确认列表未匹配 (未在列表前20条中找到)", "screenshot": "/tmp/channels_ss/磨AI和token几十人在扛_5_verify.png", "elapsed_sec": 35.64213705062866, "timestamp": "2026-03-24 03:46:06"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/AI最大的缺点是上下文太短这样来解决.mp4", "title": "AI的短板是记忆太短上下文一长就废了这个方法能解决", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/AI最大的缺点是上下文太短这样来解决_login.png", "elapsed_sec": 8.290918827056885, "timestamp": "2026-03-24 13:31:13"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/AI每天剪1000个视频 M4电脑24T素材库全网分发.mp4", "title": "M4芯片+24T素材库AI每天剪1000条视频自动全网分发", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/AI每天剪1000个视频 M4电脑24T素材库全网分发_login.png", "elapsed_sec": 7.860788106918335, "timestamp": "2026-03-24 13:31:31"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/Soul派对变现全链路 发视频就有钱,后端全解决.mp4", "title": "Soul派对怎么变现发视频就有收益后端体系全部搞定", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/Soul派对变现全链路 发视频就有钱后端全解决_login.png", "elapsed_sec": 7.578423976898193, "timestamp": "2026-03-24 13:31:48"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/从0到切片发布 AI自动完成每天副业30条视频.mp4", "title": "从零到切片发布AI全自动完成每天副业产出30条视频", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/从0到切片发布 AI自动完成每天副业30条视频_login.png", "elapsed_sec": 7.775228023529053, "timestamp": "2026-03-24 13:32:06"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/AI最大的缺点是上下文太短这样来解决.mp4", "title": "AI的短板是记忆太短上下文一长就废了这个方法能解决", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/AI最大的缺点是上下文太短这样来解决_login.png", "elapsed_sec": 8.702923059463501, "timestamp": "2026-03-24 14:19:05"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/AI每天剪1000个视频 M4电脑24T素材库全网分发.mp4", "title": "M4芯片+24T素材库AI每天剪1000条视频自动全网分发", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/AI每天剪1000个视频 M4电脑24T素材库全网分发_login.png", "elapsed_sec": 8.537369728088379, "timestamp": "2026-03-24 14:19:29"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/Soul派对变现全链路 发视频就有钱,后端全解决.mp4", "title": "Soul派对怎么变现发视频就有收益后端体系全部搞定", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/Soul派对变现全链路 发视频就有钱后端全解决_login.png", "elapsed_sec": 8.242778778076172, "timestamp": "2026-03-24 14:20:16"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/从0到切片发布 AI自动完成每天副业30条视频.mp4", "title": "从零到切片发布AI全自动完成每天副业产出30条视频", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/从0到切片发布 AI自动完成每天副业30条视频_login.png", "elapsed_sec": 7.8070127964019775, "timestamp": "2026-03-24 14:20:38"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/做副业的基本条件 苹果电脑和特殊访问工具.mp4", "title": "做副业的两个基本条件一台Mac和一个上网工具", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/做副业的基本条件 苹果电脑和特殊访问工具_login.png", "elapsed_sec": 36.21108794212341, "timestamp": "2026-03-24 14:21:30"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/切片分发全自动化 从视频到发布一键完成.mp4", "title": "从录制到发布全自动化,一键切片分发五大平台", "success": false, "status": "error", "message": "异常: Page.goto: net::ERR_INTERNET_DISCONNECTED at https://channels.weixin.qq.com/plat", "elapsed_sec": 0.7082328796386719, "timestamp": "2026-03-24 14:25:34"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/创业团队4人平分25有啥危险 先跑钱再谈股权.mp4", "title": "创业团队4人平分25%股权有啥风险?先跑出收入再谈分配", "success": false, "status": "error", "message": "异常: Page.goto: net::ERR_INTERNET_DISCONNECTED at https://channels.weixin.qq.com/plat", "elapsed_sec": 1.3230011463165283, "timestamp": "2026-03-24 14:29:33"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/坚持到120场是什么感觉 方向越确定执行越坚决.mp4", "title": "坚持到第120场派对是什么感觉方向越清晰执行越坚决", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/坚持到120场是什么感觉 方向越确定执行越坚决_login.png", "elapsed_sec": 8.373418092727661, "timestamp": "2026-03-24 14:29:56"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/帮人装AI一单300到1000块传统行业也能做.mp4", "title": "帮传统行业的人装AI工具一单收300到1000块简单好做", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/帮人装AI一单300到1000块传统行业也能做_login.png", "elapsed_sec": 8.257888078689575, "timestamp": "2026-03-24 14:30:20"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/深度AI模型对比 哪个才是真正的AI不是语言模型.mp4", "title": "深度对比各大AI模型哪个才是真正的智能而不只是语言模型", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/深度AI模型对比 哪个才是真正的AI不是语言模型_login.png", "elapsed_sec": 7.813130855560303, "timestamp": "2026-03-24 14:30:42"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/AI时代用对工具的人和不用的人差距已.mp4", "title": "AI时代用对工具的人和不用的人差距已", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/AI时代用对工具的人和不用的人差距已_5_before_close.png", "elapsed_sec": 37.68407988548279, "timestamp": "2026-03-24 16:19:49"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/你跟我说你有能力,但你能保证每次说.mp4", "title": "你跟我说你有能力,但你能保证每次说", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/你跟我说你有能力但你能保证每次说_5_before_close.png", "elapsed_sec": 37.12819194793701, "timestamp": "2026-03-24 16:32:08"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/AI时代用对工具的人和不用的人差距已.mp4", "title": "AI时代用对工具的人和不用的人差距已", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/AI时代用对工具的人和不用的人差距已_5_before_close.png", "elapsed_sec": 37.94673705101013, "timestamp": "2026-03-24 16:33:13"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/你跟我说你有能力,但你能保证每次说.mp4", "title": "你跟我说你有能力,但你能保证每次说", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/你跟我说你有能力但你能保证每次说_5_before_close.png", "elapsed_sec": 38.201560735702515, "timestamp": "2026-03-24 16:33:51"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/当时有三家公司同时竞争,老板最后只.mp4", "title": "当时有三家公司同时竞争,老板最后只", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/当时有三家公司同时竞争老板最后只_5_before_close.png", "elapsed_sec": 37.84393501281738, "timestamp": "2026-03-24 16:34:29"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我00后逃婚之后去卖核桃就这个名字让.mp4", "title": "我00后逃婚之后去卖核桃就这个名字让", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我00后逃婚之后去卖核桃就这个名字让_5_before_close.png", "elapsed_sec": 37.69671988487244, "timestamp": "2026-03-24 16:35:06"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/这个客户从2018年一直跟我下单我从没主.mp4", "title": "这个客户从2018年一直跟我下单我从没主", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/这个客户从2018年一直跟我下单我从没主_5_before_close.png", "elapsed_sec": 36.65466785430908, "timestamp": "2026-03-24 16:50:34"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/AI时代用对工具的人和不用的人差距已.mp4", "title": "AI时代用对工具的人和不用的人差距已", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/AI时代用对工具的人和不用的人差距已_5_before_close.png", "elapsed_sec": 37.30799388885498, "timestamp": "2026-03-24 16:53:41"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/你跟我说你有能力,但你能保证每次说.mp4", "title": "你跟我说你有能力,但你能保证每次说", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/你跟我说你有能力但你能保证每次说_5_before_close.png", "elapsed_sec": 37.94354796409607, "timestamp": "2026-03-24 16:54:19"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/当时有三家公司同时竞争,老板最后只.mp4", "title": "当时有三家公司同时竞争,老板最后只", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/当时有三家公司同时竞争老板最后只_5_before_close.png", "elapsed_sec": 36.25317120552063, "timestamp": "2026-03-24 16:54:55"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我00后逃婚之后去卖核桃就这个名字让.mp4", "title": "我00后逃婚之后去卖核桃就这个名字让", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/我00后逃婚之后去卖核桃就这个名字让_login.png", "elapsed_sec": 6.852225065231323, "timestamp": "2026-03-24 16:55:02"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我做美团不卖套餐,专帮商家做后段分.mp4", "title": "我做美团不卖套餐,专帮商家做后段分", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/我做美团不卖套餐专帮商家做后段分_login.png", "elapsed_sec": 6.58516788482666, "timestamp": "2026-03-24 16:55:09"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我入职第五天就被老板炒掉了,但后来.mp4", "title": "我入职第五天就被老板炒掉了,但后来", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我入职第五天就被老板炒掉了但后来_5_before_close.png", "elapsed_sec": 36.39496207237244, "timestamp": "2026-03-24 16:55:45"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我第一次参展什么都没准备,结果直接.mp4", "title": "我第一次参展什么都没准备,结果直接", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我第一次参展什么都没准备结果直接_5_before_close.png", "elapsed_sec": 36.207420110702515, "timestamp": "2026-03-24 16:56:21"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我让客户先往账户充两万,再带他们去.mp4", "title": "我让客户先往账户充两万,再带他们去", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我让客户先往账户充两万再带他们去_5_before_close.png", "elapsed_sec": 36.40617489814758, "timestamp": "2026-03-24 16:56:58"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/电销这条路已经死了,砸再多人进去也.mp4", "title": "电销这条路已经死了,砸再多人进去也", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/电销这条路已经死了砸再多人进去也_login.png", "elapsed_sec": 6.687954902648926, "timestamp": "2026-03-24 16:57:05"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/这个客户从2018年一直跟我下单我从没主.mp4", "title": "这个客户从2018年一直跟我下单我从没主", "success": false, "status": "error", "message": "Cookie 已过期(需重新扫码登录)", "screenshot": "/tmp/channels_ss/这个客户从2018年一直跟我下单我从没主_login.png", "elapsed_sec": 6.5869410037994385, "timestamp": "2026-03-24 16:57:11"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我00后逃婚之后去卖核桃就这个名字让.mp4", "title": "我00后逃婚之后去卖核桃就这个名字让", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我00后逃婚之后去卖核桃就这个名字让_5_before_close.png", "elapsed_sec": 37.45753717422485, "timestamp": "2026-03-24 17:00:34"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我做美团不卖套餐,专帮商家做后段分.mp4", "title": "我做美团不卖套餐,专帮商家做后段分", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我做美团不卖套餐专帮商家做后段分_5_before_close.png", "elapsed_sec": 40.0338339805603, "timestamp": "2026-03-24 17:01:15"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/电销这条路已经死了,砸再多人进去也.mp4", "title": "电销这条路已经死了,砸再多人进去也", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/电销这条路已经死了砸再多人进去也_5_before_close.png", "elapsed_sec": 36.323265075683594, "timestamp": "2026-03-24 17:01:53"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/这个客户从2018年一直跟我下单我从没主.mp4", "title": "这个客户从2018年一直跟我下单我从没主", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/这个客户从2018年一直跟我下单我从没主_5_before_close.png", "elapsed_sec": 36.711318016052246, "timestamp": "2026-03-24 17:02:30"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我做美团不卖套餐,专帮商家做后段分.mp4", "title": "我做美团不卖套餐,专帮商家做后段分", "success": false, "status": "error", "message": "页面定时控件未设置成功,已拦截", "error_code": "SCHEDULE_SET_ERROR", "elapsed_sec": 14.999564170837402, "timestamp": "2026-03-24 17:07:28"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我做美团不卖套餐,专帮商家做后段分.mp4", "title": "我做美团不卖套餐,专帮商家做后段分", "success": false, "status": "error", "message": "页面定时控件未设置成功,已拦截", "error_code": "SCHEDULE_SET_ERROR", "elapsed_sec": 16.78355312347412, "timestamp": "2026-03-24 17:08:31"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我做美团不卖套餐,专帮商家做后段分.mp4", "title": "我做美团不卖套餐,专帮商家做后段分", "success": false, "status": "error", "message": "页面定时控件未设置成功,已拦截", "error_code": "SCHEDULE_SET_ERROR", "elapsed_sec": 16.756377935409546, "timestamp": "2026-03-24 17:10:06"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我做美团不卖套餐,专帮商家做后段分.mp4", "title": "我做美团不卖套餐,专帮商家做后段分", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我做美团不卖套餐专帮商家做后段分_5_before_close.png", "elapsed_sec": 38.918302059173584, "timestamp": "2026-03-24 18:17:51"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/电销这条路已经死了,砸再多人进去也.mp4", "title": "电销这条路已经死了,砸再多人进去也", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/电销这条路已经死了砸再多人进去也_5_before_close.png", "elapsed_sec": 38.57273507118225, "timestamp": "2026-03-24 18:20:48"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/AI时代用对工具的人和不用的人差距已.mp4", "title": "AI时代用对工具的人和不用的人差距已", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/AI时代用对工具的人和不用的人差距已_5_before_close.png", "elapsed_sec": 38.72861123085022, "timestamp": "2026-03-24 18:25:08"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/你跟我说你有能力,但你能保证每次说.mp4", "title": "你跟我说你有能力,但你能保证每次说", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/你跟我说你有能力但你能保证每次说_5_before_close.png", "elapsed_sec": 37.85467171669006, "timestamp": "2026-03-24 18:25:46"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/当时有三家公司同时竞争,老板最后只.mp4", "title": "当时有三家公司同时竞争,老板最后只", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/当时有三家公司同时竞争老板最后只_5_before_close.png", "elapsed_sec": 37.655462980270386, "timestamp": "2026-03-24 18:26:24"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我00后逃婚之后去卖核桃就这个名字让.mp4", "title": "我00后逃婚之后去卖核桃就这个名字让", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我00后逃婚之后去卖核桃就这个名字让_5_before_close.png", "elapsed_sec": 38.254936933517456, "timestamp": "2026-03-24 18:27:02"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我做美团不卖套餐,专帮商家做后段分.mp4", "title": "我做美团不卖套餐,专帮商家做后段分", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我做美团不卖套餐专帮商家做后段分_5_before_close.png", "elapsed_sec": 37.9297149181366, "timestamp": "2026-03-24 18:27:40"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我入职第五天就被老板炒掉了,但后来.mp4", "title": "我入职第五天就被老板炒掉了,但后来", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我入职第五天就被老板炒掉了但后来_5_before_close.png", "elapsed_sec": 37.66652703285217, "timestamp": "2026-03-24 18:28:18"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我第一次参展什么都没准备,结果直接.mp4", "title": "我第一次参展什么都没准备,结果直接", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我第一次参展什么都没准备结果直接_5_before_close.png", "elapsed_sec": 37.59509301185608, "timestamp": "2026-03-24 18:28:55"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我让客户先往账户充两万,再带他们去.mp4", "title": "我让客户先往账户充两万,再带他们去", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/我让客户先往账户充两万再带他们去_5_before_close.png", "elapsed_sec": 37.873409032821655, "timestamp": "2026-03-24 18:29:33"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/电销这条路已经死了,砸再多人进去也.mp4", "title": "电销这条路已经死了,砸再多人进去也", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/电销这条路已经死了砸再多人进去也_5_before_close.png", "elapsed_sec": 37.74990701675415, "timestamp": "2026-03-24 18:30:11"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/这个客户从2018年一直跟我下单我从没主.mp4", "title": "这个客户从2018年一直跟我下单我从没主", "success": true, "status": "published", "message": "✓ API+列表API (已跳过列表API核验仅以PUBLISH接口成功为准)", "screenshot": "/tmp/channels_ss/这个客户从2018年一直跟我下单我从没主_5_before_close.png", "elapsed_sec": 37.99250411987305, "timestamp": "2026-03-24 18:30:49"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 2.4394960403442383, "timestamp": "2026-03-24 20:06:31"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.20112895965576172, "timestamp": "2026-03-24 20:06:34"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.22391724586486816, "timestamp": "2026-03-24 20:06:38"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.1922450065612793, "timestamp": "2026-03-24 20:06:41"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.391740083694458, "timestamp": "2026-03-24 20:06:44"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.5754349231719971, "timestamp": "2026-03-24 20:06:48"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.19308805465698242, "timestamp": "2026-03-24 20:06:51"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.20100140571594238, "timestamp": "2026-03-24 20:06:54"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23835062980651855, "timestamp": "2026-03-24 20:06:57"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 5.352864980697632, "timestamp": "2026-03-24 20:07:27"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23348402976989746, "timestamp": "2026-03-24 20:07:30"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.5644721984863281, "timestamp": "2026-03-24 20:07:34"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.5476739406585693, "timestamp": "2026-03-24 20:07:37"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.19500017166137695, "timestamp": "2026-03-24 20:07:41"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.35203099250793457, "timestamp": "2026-03-24 20:07:44"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.43821215629577637, "timestamp": "2026-03-24 20:07:47"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.5291199684143066, "timestamp": "2026-03-24 20:07:51"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": true, "status": "reviewing", "message": "纯API投稿成功 (16.9s)", "elapsed_sec": 16.92071509361267, "timestamp": "2026-03-24 20:07:39"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": true, "status": "reviewing", "message": "纯API投稿成功 (3.0s)", "elapsed_sec": 2.9674861431121826, "timestamp": "2026-03-24 20:07:45"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": true, "status": "reviewing", "message": "纯API投稿成功 (3.1s)", "elapsed_sec": 3.1135082244873047, "timestamp": "2026-03-24 20:07:52"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": true, "status": "reviewing", "message": "纯API投稿成功 (2.5s)", "elapsed_sec": 2.4904768466949463, "timestamp": "2026-03-24 20:07:57"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": true, "status": "reviewing", "message": "纯API投稿成功 (2.3s)", "elapsed_sec": 2.2503061294555664, "timestamp": "2026-03-24 20:08:02"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": true, "status": "reviewing", "message": "纯API投稿成功 (2.6s)", "elapsed_sec": 2.5542337894439697, "timestamp": "2026-03-24 20:08:08"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "failed", "message": "Playwright: 投稿超时", "screenshot": "/tmp/bilibili_result.png", "elapsed_sec": 73.9002480506897, "timestamp": "2026-03-24 20:09:56"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": true, "status": "reviewing", "message": "纯API投稿成功 (4.3s)", "elapsed_sec": 4.292600154876709, "timestamp": "2026-03-24 20:10:04"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:07:27"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.83313298225403, "timestamp": "2026-03-24 20:08:41"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 54.19862484931946, "timestamp": "2026-03-24 20:10:02"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.953601121902466, "timestamp": "2026-03-24 20:11:19"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.840850830078125, "timestamp": "2026-03-24 20:12:38"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "未找到上传控件", "screenshot": "/tmp/xhs_no_input.png", "elapsed_sec": 23.99095892906189, "timestamp": "2026-03-24 20:13:06"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "异常: Page.goto: net::ERR_INTERNET_DISCONNECTED at https://creator.xiaohongshu.com/pub", "elapsed_sec": 0.6484110355377197, "timestamp": "2026-03-24 20:14:03"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "异常: Page.goto: net::ERR_INTERNET_DISCONNECTED at https://creator.xiaohongshu.com/pub", "elapsed_sec": 0.811931848526001, "timestamp": "2026-03-24 20:14:07"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "异常: Page.goto: net::ERR_INTERNET_DISCONNECTED at https://creator.xiaohongshu.com/pub", "elapsed_sec": 10.679517984390259, "timestamp": "2026-03-24 20:14:20"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 5.7836689949035645, "timestamp": "2026-03-24 20:37:19"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/一个群能挤九十五个老板.mp4", "title": "一个群能挤九十五个老板", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 1.9043889045715332, "timestamp": "2026-03-24 20:37:24"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 1.633009910583496, "timestamp": "2026-03-24 20:37:29"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/创始人硬才能谈特步营收.mp4", "title": "创始人硬才能谈特步营收", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.6121540069580078, "timestamp": "2026-03-24 20:37:32"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/十条乘十平台一天百条分发.mp4", "title": "十条乘十平台一天百条分发", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.22900605201721191, "timestamp": "2026-03-24 20:37:35"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/派对一天场观五到十万.mp4", "title": "派对一天场观五到十万", "success": false, "status": "error", "message": "异常: ", "elapsed_sec": 5.048448085784912, "timestamp": "2026-03-24 20:37:43"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/派对开到一百二十场图啥.mp4", "title": "派对开到一百二十场图啥", "success": false, "status": "error", "message": "异常: [Errno 8] nodename nor servname provided, or not known", "elapsed_sec": 0.021852970123291016, "timestamp": "2026-03-24 20:37:46"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/磨AI和token几十人在扛.mp4", "title": "磨AI和token几十人在扛", "success": false, "status": "error", "message": "异常: [Errno 8] nodename nor servname provided, or not known", "elapsed_sec": 0.014533758163452148, "timestamp": "2026-03-24 20:37:49"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": false, "status": "failed", "message": "Playwright: 投稿超时", "screenshot": "/tmp/bilibili_result.png", "elapsed_sec": 310.1476631164551, "timestamp": "2026-03-24 20:42:42"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:37:18"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": false, "status": "error", "message": "未找到上传控件", "screenshot": "/tmp/xhs_no_input.png", "elapsed_sec": 8.202579259872437, "timestamp": "2026-03-24 20:37:27"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 5.5741822719573975, "timestamp": "2026-03-24 20:47:50"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/一个群能挤九十五个老板.mp4", "title": "一个群能挤九十五个老板", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 2.0757007598876953, "timestamp": "2026-03-24 20:47:55"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.6376700401306152, "timestamp": "2026-03-24 20:47:59"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/创始人硬才能谈特步营收.mp4", "title": "创始人硬才能谈特步营收", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.37024617195129395, "timestamp": "2026-03-24 20:48:02"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/十条乘十平台一天百条分发.mp4", "title": "十条乘十平台一天百条分发", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.4815711975097656, "timestamp": "2026-03-24 20:48:06"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/派对一天场观五到十万.mp4", "title": "派对一天场观五到十万", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.22361397743225098, "timestamp": "2026-03-24 20:48:09"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/派对开到一百二十场图啥.mp4", "title": "派对开到一百二十场图啥", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.5457022190093994, "timestamp": "2026-03-24 20:48:13"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/磨AI和token几十人在扛.mp4", "title": "磨AI和token几十人在扛", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3244781494140625, "timestamp": "2026-03-24 20:48:16"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": true, "status": "reviewing", "message": "纯API投稿成功 (20.9s)", "elapsed_sec": 20.874058961868286, "timestamp": "2026-03-24 20:48:06"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:47:50"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": false, "status": "error", "message": "未找到上传控件", "screenshot": "/tmp/xhs_no_input.png", "elapsed_sec": 7.875941276550293, "timestamp": "2026-03-24 20:47:58"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 2.565467119216919, "timestamp": "2026-03-24 20:51:33"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.31048107147216797, "timestamp": "2026-03-24 20:51:36"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.29048919677734375, "timestamp": "2026-03-24 20:51:40"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24226784706115723, "timestamp": "2026-03-24 20:51:43"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23039889335632324, "timestamp": "2026-03-24 20:51:46"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.33284687995910645, "timestamp": "2026-03-24 20:51:49"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.28066086769104004, "timestamp": "2026-03-24 20:51:53"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.26413512229919434, "timestamp": "2026-03-24 20:51:56"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.27546191215515137, "timestamp": "2026-03-24 20:51:59"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.6754028797149658, "timestamp": "2026-03-24 20:52:03"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.34931492805480957, "timestamp": "2026-03-24 20:52:06"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24840903282165527, "timestamp": "2026-03-24 20:52:10"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24621105194091797, "timestamp": "2026-03-24 20:52:13"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24593091011047363, "timestamp": "2026-03-24 20:52:16"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.4982609748840332, "timestamp": "2026-03-24 20:52:20"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23446226119995117, "timestamp": "2026-03-24 20:52:23"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.21616697311401367, "timestamp": "2026-03-24 20:52:26"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23897290229797363, "timestamp": "2026-03-24 20:52:29"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2378537654876709, "timestamp": "2026-03-24 20:52:32"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.34305715560913086, "timestamp": "2026-03-24 20:52:36"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24894094467163086, "timestamp": "2026-03-24 20:52:39"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "title": "月进房一两万人", "success": true, "status": "reviewing", "message": "纯API投稿成功 (12.4s)", "elapsed_sec": 12.387798070907593, "timestamp": "2026-03-24 20:54:23"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:54:15"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 52.630022287368774, "timestamp": "2026-03-24 20:55:31"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.05601096153259, "timestamp": "2026-03-24 20:56:48"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "title": "月进房一两万人", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.16410207748413, "timestamp": "2026-03-24 20:58:05"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.06264925003052, "timestamp": "2026-03-24 20:59:22"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/AI最大的缺点是上下文太短这样来解决.mp4", "title": "AI的短板是记忆太短上下文一长就废了这个方法能解决", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:48:34"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/AI每天剪1000个视频 M4电脑24T素材库全网分发.mp4", "title": "M4芯片+24T素材库AI每天剪1000条视频自动全网分发", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:48:39"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/Soul派对变现全链路 发视频就有钱,后端全解决.mp4", "title": "Soul派对怎么变现发视频就有收益后端体系全部搞定", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:48:44"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/从0到切片发布 AI自动完成每天副业30条视频.mp4", "title": "从零到切片发布AI全自动完成每天副业产出30条视频", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:48:50"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/做副业的基本条件 苹果电脑和特殊访问工具.mp4", "title": "做副业的两个基本条件一台Mac和一个上网工具", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:48:55"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/切片分发全自动化 从视频到发布一键完成.mp4", "title": "从录制到发布全自动化,一键切片分发五大平台", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:49:00"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/创业团队4人平分25有啥危险 先跑钱再谈股权.mp4", "title": "创业团队4人平分25%股权有啥风险?先跑出收入再谈分配", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:49:05"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/坚持到120场是什么感觉 方向越确定执行越坚决.mp4", "title": "坚持到第120场派对是什么感觉方向越清晰执行越坚决", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:49:10"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/帮人装AI一单300到1000块传统行业也能做.mp4", "title": "帮传统行业的人装AI工具一单收300到1000块简单好做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:49:15"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/深度AI模型对比 哪个才是真正的AI不是语言模型.mp4", "title": "深度对比各大AI模型哪个才是真正的智能而不只是语言模型", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:49:20"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/AI最大的缺点是上下文太短这样来解决.mp4", "title": "AI的短板是记忆太短上下文一长就废了这个方法能解决", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.27306199073791504, "timestamp": "2026-03-24 20:49:24"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/AI每天剪1000个视频 M4电脑24T素材库全网分发.mp4", "title": "M4芯片+24T素材库AI每天剪1000条视频自动全网分发", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3204689025878906, "timestamp": "2026-03-24 20:49:27"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/Soul派对变现全链路 发视频就有钱,后端全解决.mp4", "title": "Soul派对怎么商业转化发视频就有收益后端体系全部搞定", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.5010251998901367, "timestamp": "2026-03-24 20:49:30"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/从0到切片发布 AI自动完成每天副业30条视频.mp4", "title": "从零到切片发布AI全自动完成每天副业产出30条视频", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2997100353240967, "timestamp": "2026-03-24 20:49:34"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/做副业的基本条件 苹果电脑和特殊访问工具.mp4", "title": "做副业的两个基本条件一台Mac和一个上网工具", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3770930767059326, "timestamp": "2026-03-24 20:49:37"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/切片分发全自动化 从视频到发布一键完成.mp4", "title": "从录制到发布全自动化,一键切片分发五大平台", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.5777618885040283, "timestamp": "2026-03-24 20:49:41"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/创业团队4人平分25有啥危险 先跑钱再谈股权.mp4", "title": "创业团队4人平分25%股权有啥风险?先跑出收入再谈分配", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24517083168029785, "timestamp": "2026-03-24 20:49:44"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/坚持到120场是什么感觉 方向越确定执行越坚决.mp4", "title": "坚持到第120场派对是什么感觉方向越清晰执行越坚决", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.32120800018310547, "timestamp": "2026-03-24 20:49:47"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/帮人装AI一单300到1000块传统行业也能做.mp4", "title": "帮传统行业的人装AI工具一单收300到1000块简单好做", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2974250316619873, "timestamp": "2026-03-24 20:49:51"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/深度AI模型对比 哪个才是真正的AI不是语言模型.mp4", "title": "深度对比各大AI模型哪个才是真正的智能而不只是语言模型", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.46654820442199707, "timestamp": "2026-03-24 20:49:54"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/疗愈师配AI助手能收多少钱 一个小团队5万到10万.mp4", "title": "疗愈师+AI助手组合一个小团队月收5万到10万", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3290407657623291, "timestamp": "2026-03-24 20:49:57"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片/赚钱没那么复杂,自信心才是核心问题.mp4", "title": "获得收益真没那么复杂,自信心才是卡住你的核心问题", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.5602588653564453, "timestamp": "2026-03-24 20:50:01"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/AI一部剧3000到5000100部真人剧的成本做100部AI剧.mp4", "title": "AI一部剧3000到5000100部真人剧的成本做100部AI剧", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.43374013900756836, "timestamp": "2026-03-24 20:50:04"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/AI教培是真的可以做传统培训行业正在被改造.mp4", "title": "AI教培是真的可以做传统培训行业正在被改造", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.22461867332458496, "timestamp": "2026-03-24 20:50:08"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/一个Soul号一个月挣几万块这也是个小生意.mp4", "title": "一个Soul号一个月挣几万块这也是个小生意", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.25609707832336426, "timestamp": "2026-03-24 20:50:11"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/不用上什么模式,经营好你的人就够了.mp4", "title": "不用上什么模式,经营好你的人就够了", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3439643383026123, "timestamp": "2026-03-24 20:50:14"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/云连锁概念太牛了,不需要开店也能做品牌.mp4", "title": "云连锁概念太牛了,不需要开店也能做品牌", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.20473003387451172, "timestamp": "2026-03-24 20:50:17"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/供应链加品牌店,后端才是真正赚钱的地方.mp4", "title": "供应链加品牌店,后端才是真正获得收益的地方", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.19616198539733887, "timestamp": "2026-03-24 20:50:21"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/卖Cursor安装包没有后端你做不了.mp4", "title": "卖Cursor安装包没有后端你做不了", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2254331111907959, "timestamp": "2026-03-24 20:50:24"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/太早引入资本你的方向就不是你说了算.mp4", "title": "太早引入资本你的方向就不是你说了算", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.21946287155151367, "timestamp": "2026-03-24 20:50:27"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/教培行业六七年经验 做好自己本店才是核心.mp4", "title": "教培行业六七年经验 做好自己本店才是核心", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3590383529663086, "timestamp": "2026-03-24 20:50:30"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/给学校免费培训,后端卖设备才是真生意.mp4", "title": "给学校免费培训,后端卖设备才是真生意", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.20241713523864746, "timestamp": "2026-03-24 20:50:34"}
{"platform": "快手", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/Cursor的权限问题安全隐患必须提前讲清楚.mp4", "title": "Cursor的权限问题安全隐患必须提前讲清楚 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": false, "status": "error", "message": "未登录,请重新运行 kuaishou_login.py", "error_code": "NOT_LOGGED_IN", "elapsed_sec": 7.661127328872681, "timestamp": "2026-03-24 20:50:44"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/Cursor的权限问题安全隐患必须提前讲清楚.mp4", "title": "Cursor的权限问题安全隐患必须提前讲清楚 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.31421375274658203, "timestamp": "2026-03-24 20:50:48"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/NFC碰一碰引流线下餐饮店用这招就够了.mp4", "title": "NFC碰一碰引流线下餐饮店用这招就够了 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.31131505966186523, "timestamp": "2026-03-24 20:50:51"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/Skill和Cursor的区别一个走工作流一个走对话.mp4", "title": "Skill和Cursor的区别一个走工作流一个走对话 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24115991592407227, "timestamp": "2026-03-24 20:50:54"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:51:00"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3532228469848633, "timestamp": "2026-03-24 20:51:03"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2617349624633789, "timestamp": "2026-03-24 20:51:07"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3478720188140869, "timestamp": "2026-03-24 20:51:10"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24163508415222168, "timestamp": "2026-03-24 20:51:13"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3948979377746582, "timestamp": "2026-03-24 20:51:17"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23493504524230957, "timestamp": "2026-03-24 20:51:20"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.46443605422973633, "timestamp": "2026-03-24 20:51:23"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23675966262817383, "timestamp": "2026-03-24 20:51:27"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2318120002746582, "timestamp": "2026-03-24 20:51:30"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2672438621520996, "timestamp": "2026-03-24 20:51:33"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23700404167175293, "timestamp": "2026-03-24 20:51:36"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.27875804901123047, "timestamp": "2026-03-24 20:51:40"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23125886917114258, "timestamp": "2026-03-24 20:51:43"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2906219959259033, "timestamp": "2026-03-24 20:51:46"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2627279758453369, "timestamp": "2026-03-24 20:51:49"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23849797248840332, "timestamp": "2026-03-24 20:51:53"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2629208564758301, "timestamp": "2026-03-24 20:51:56"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.2705810070037842, "timestamp": "2026-03-24 20:51:59"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.25304222106933594, "timestamp": "2026-03-24 20:52:02"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.26238203048706055, "timestamp": "2026-03-24 20:52:06"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第127场_20260318_output/成片/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3072218894958496, "timestamp": "2026-03-24 20:52:09"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3404719829559326, "timestamp": "2026-03-24 20:52:12"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/一个群能挤九十五个老板.mp4", "title": "一个群能挤九十五个老板", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.4845399856567383, "timestamp": "2026-03-24 20:52:16"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/创始人硬才能谈特步营收.mp4", "title": "创始人硬才能谈特步营收", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24285006523132324, "timestamp": "2026-03-24 20:52:19"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/十条乘十平台一天百条分发.mp4", "title": "十条乘十平台一天百条分发", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.5966360569000244, "timestamp": "2026-03-24 20:52:23"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/派对一天场观五到十万.mp4", "title": "派对一天场观五到十万", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3020598888397217, "timestamp": "2026-03-24 20:52:26"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/派对开到一百二十场图啥.mp4", "title": "派对开到一百二十场图啥", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24848413467407227, "timestamp": "2026-03-24 20:52:29"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/磨AI和token几十人在扛.mp4", "title": "磨AI和token几十人在扛", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.29215097427368164, "timestamp": "2026-03-24 20:52:33"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.22738885879516602, "timestamp": "2026-03-24 20:52:36"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24959802627563477, "timestamp": "2026-03-24 20:52:39"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.36031293869018555, "timestamp": "2026-03-24 20:52:42"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.26596879959106445, "timestamp": "2026-03-24 20:52:46"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.26346397399902344, "timestamp": "2026-03-24 20:52:49"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.23565125465393066, "timestamp": "2026-03-24 20:52:52"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.24989604949951172, "timestamp": "2026-03-24 20:52:55"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.3083500862121582, "timestamp": "2026-03-24 20:52:59"}
{"platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "title": "月进房一两万人", "success": true, "status": "reviewing", "message": "纯API投稿成功 (8.5s)", "elapsed_sec": 8.472956895828247, "timestamp": "2026-03-24 20:53:11"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:53:16"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 48.26472187042236, "timestamp": "2026-03-24 20:54:31"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 51.07915782928467, "timestamp": "2026-03-24 20:55:49"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "title": "月进房一两万人", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 47.36375594139099, "timestamp": "2026-03-24 20:57:03"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 47.56928324699402, "timestamp": "2026-03-24 20:58:17"}
{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": false, "status": "failed", "message": "发布失败: {'extra': {'logid': '20260324205839853A1A60554FC27E8D7F', 'now': 1774357119000},", "elapsed_sec": 19.031839847564697, "timestamp": "2026-03-24 20:58:39"}
{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-24 20:58:44"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "title": "七千店复制拿投资月流水五十万", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 47.32520818710327, "timestamp": "2026-03-24 20:59:58"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/AI最大的缺点是上下文太短这样来解决.mp4", "title": "AI的短板是记忆太短上下文一长就废了这个方法能解决", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 29.498006105422974, "timestamp": "2026-03-24 21:18:46"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/AI每天剪1000个视频 M4电脑24T素材库全网分发.mp4", "title": "M4芯片+24T素材库AI每天剪1000条视频自动全网分发", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.72871804237366, "timestamp": "2026-03-24 21:20:03"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/Soul派对变现全链路 发视频就有钱,后端全解决.mp4", "title": "Soul派对怎么商业转化发视频就有收益后端体系全部搞定", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.168359994888306, "timestamp": "2026-03-24 21:21:20"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/从0到切片发布 AI自动完成每天副业30条视频.mp4", "title": "从零到切片发布AI全自动完成每天副业产出30条视频", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.648173093795776, "timestamp": "2026-03-24 21:22:38"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/做副业的基本条件 苹果电脑和特殊访问工具.mp4", "title": "做副业的两个基本条件一台Mac和一个上网工具", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.53206491470337, "timestamp": "2026-03-24 21:23:55"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/切片分发全自动化 从视频到发布一键完成.mp4", "title": "从录制到发布全自动化,一键切片分发五大平台", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.136385917663574, "timestamp": "2026-03-24 21:25:13"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/创业团队4人平分25有啥危险 先跑钱再谈股权.mp4", "title": "创业团队4人平分25%股权有啥风险?先跑出收入再谈分配", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 50.382139921188354, "timestamp": "2026-03-24 21:26:30"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/坚持到120场是什么感觉 方向越确定执行越坚决.mp4", "title": "坚持到第120场派对是什么感觉方向越清晰执行越坚决", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 471.5520009994507, "timestamp": "2026-03-24 21:34:49"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/帮人装AI一单300到1000块传统行业也能做.mp4", "title": "帮传统行业的人装AI工具一单收300到1000块简单好做", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 28.172641038894653, "timestamp": "2026-03-24 21:35:20"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/深度AI模型对比 哪个才是真正的AI不是语言模型.mp4", "title": "深度对比各大AI模型哪个才是真正的智能而不只是语言模型", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 27.818917989730835, "timestamp": "2026-03-24 21:35:51"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/疗愈师配AI助手能收多少钱 一个小团队5万到10万.mp4", "title": "疗愈师+AI助手组合一个小团队月收5万到10万", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 49.803231954574585, "timestamp": "2026-03-24 21:37:07"}
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/赚钱没那么复杂,自信心才是核心问题.mp4", "title": "获得收益真没那么复杂,自信心才是卡住你的核心问题", "success": true, "status": "likely_published", "message": "发布按钮+确认已点击,视频可能仍在处理", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 49.875036001205444, "timestamp": "2026-03-24 21:38:24"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "未找到上传控件", "error_code": "NO_UPLOAD_INPUT", "screenshot": "/tmp/zhihu_no_upload_input.png", "elapsed_sec": 4.985913991928101, "timestamp": "2026-03-24 22:27:36"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "异常: Locator.fill: Timeout 30000ms exceeded.\nCall log:\n - waiting for locator(\"input[placeholder*=\\\"标题\\\"], textarea[placehol", "elapsed_sec": 42.99302697181702, "timestamp": "2026-03-24 22:28:56"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "异常: Locator.click: Element is not visible\nCall log:\n - waiting for locator(\"button:has-text(\\\"发布\\\"), button:has-text(\\\"确认发布", "elapsed_sec": 13.365064859390259, "timestamp": "2026-03-24 22:29:33"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "发布按钮不可点击", "error_code": "PUBLISH_CLICK_FAILED", "screenshot": "/tmp/zhihu_publish_click_failed.png", "elapsed_sec": 13.003501892089844, "timestamp": "2026-03-24 22:30:08"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "发布按钮不可点击", "error_code": "PUBLISH_CLICK_FAILED", "screenshot": "/tmp/zhihu_publish_click_failed.png", "elapsed_sec": 14.801175117492676, "timestamp": "2026-03-24 22:30:57"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "发布按钮不可点击", "error_code": "PUBLISH_CLICK_FAILED", "screenshot": "/tmp/zhihu_publish_click_failed.png", "elapsed_sec": 14.517098903656006, "timestamp": "2026-03-24 22:35:40"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "上传超时", "error_code": "UPLOAD_TIMEOUT", "screenshot": "/tmp/zhihu_upload_timeout.png", "elapsed_sec": 249.92022323608398, "timestamp": "2026-03-24 22:35:41"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "未找到上传控件", "error_code": "NO_UPLOAD_INPUT", "screenshot": "/tmp/zhihu_no_upload_input.png", "elapsed_sec": 4.767472267150879, "timestamp": "2026-03-24 22:36:38"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "未找到上传控件", "error_code": "NO_UPLOAD_INPUT", "screenshot": "/tmp/zhihu_no_upload_input.png", "elapsed_sec": 3.8647119998931885, "timestamp": "2026-03-24 22:37:11"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "知乎风控拦截unhuman请先在可视浏览器完成验证后重试", "error_code": "ZHIHU_RISK_BLOCK", "screenshot": "/tmp/zhihu_risk_block.png", "elapsed_sec": 4.962895154953003, "timestamp": "2026-03-24 22:38:10"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "发布按钮不可点击", "error_code": "PUBLISH_CLICK_FAILED", "screenshot": "/tmp/zhihu_publish_click_failed.png", "elapsed_sec": 15.81920599937439, "timestamp": "2026-03-24 22:39:10"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "发布按钮不可点击", "error_code": "PUBLISH_CLICK_FAILED", "screenshot": "/tmp/zhihu_publish_click_failed.png", "elapsed_sec": 16.65204095840454, "timestamp": "2026-03-24 22:46:09"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "发布按钮不可点击", "error_code": "PUBLISH_CLICK_FAILED", "screenshot": "/tmp/zhihu_publish_click_failed.png", "elapsed_sec": 17.70096206665039, "timestamp": "2026-03-24 22:47:37"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "发布按钮不可点击", "error_code": "PUBLISH_CLICK_FAILED", "screenshot": "/tmp/zhihu_publish_click_failed.png", "elapsed_sec": 17.777225255966187, "timestamp": "2026-03-24 22:49:01"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "上传超时", "error_code": "UPLOAD_TIMEOUT", "screenshot": "/tmp/zhihu_upload_timeout.png", "elapsed_sec": 259.7216167449951, "timestamp": "2026-03-24 22:59:07"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "异常: BrowserType.launch_persistent_context: Failed to create a ProcessSingleton for your profile directory. This usually mean", "elapsed_sec": 0.7422540187835693, "timestamp": "2026-03-24 23:05:49"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "异常: Page.evaluate: Target page, context or browser has been closed", "elapsed_sec": 142.3945438861847, "timestamp": "2026-03-24 23:06:01"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "上传超时", "error_code": "UPLOAD_TIMEOUT", "screenshot": "/tmp/zhihu_upload_timeout.png", "elapsed_sec": 258.24067902565, "timestamp": "2026-03-24 23:10:27"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "上传超时", "error_code": "UPLOAD_TIMEOUT", "screenshot": "/tmp/zhihu_upload_timeout.png", "elapsed_sec": 258.12372517585754, "timestamp": "2026-03-24 23:14:53"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "上传超时", "error_code": "UPLOAD_TIMEOUT", "screenshot": "/tmp/zhihu_upload_timeout.png", "elapsed_sec": 919.851943731308, "timestamp": "2026-03-24 23:43:02"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "异常: BrowserType.launch_persistent_context: Failed to create a ProcessSingleton for your profile directory. This usually mean", "elapsed_sec": 0.8736648559570312, "timestamp": "2026-03-25 09:51:12"}
{"platform": "知乎", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/ENTP爱表现是啥产业人格.mp4", "title": "ENTP爱表现是啥产业人格", "success": false, "status": "error", "message": "上传超时", "error_code": "UPLOAD_TIMEOUT", "screenshot": "/tmp/zhihu_upload_timeout.png", "elapsed_sec": 935.7551801204681, "timestamp": "2026-03-25 10:03:13"}
{"platform": "视频号", "video_path": "/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:05:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:18:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:19:59"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:04"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:35"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:20:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:21:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:21:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:21:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:21:17"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:21:22"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:23:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:23:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:23:42"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:23:47"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:23:52"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:23:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:02"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:24:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:17"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:28"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:25:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:26:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:28:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:28:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:28:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:28:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:28:30"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:28:35"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:28:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:28:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:28:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:28:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:02"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:07"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:28"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:29:59"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:30:04"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:30:10"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:30:15"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:30:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:30:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:30:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:30:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:32:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:32:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:32:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:27"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:33:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:04"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:15"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:25"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:30"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:35"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:34:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:35:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:35:07"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:35:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:37:22"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:37:27"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:37:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:37:38"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:37:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:37:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:37:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:37:59"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:04"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:10"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:15"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:25"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:38:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:39:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:39:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:39:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:39:17"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:39:22"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:39:27"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:39:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:39:38"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:39:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:39:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:41:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:42:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:27"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:43:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:44:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:44:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:44:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:44:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:44:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:46:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:46:38"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:46:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:46:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:46:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:05"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:42"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:47"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:47:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:48:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:49:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:51:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:51:15"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:51:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:51:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:51:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:51:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:51:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:51:47"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:51:52"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:51:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:02"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:52"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:52:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:53:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:53:10"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:53:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:53:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:53:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:53:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:53:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:53:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:55:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:55:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:42"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:56:59"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:04"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:25"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:30"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:35"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:57:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:58:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:58:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:58:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 12:58:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:00:25"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:00:30"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:00:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:00:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:00:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:00:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:00:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:02"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:07"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:28"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:38"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:01:59"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:02:04"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:02:10"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:02:15"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:02:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:02:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:02:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:02:38"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:02:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:02:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:02:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:02"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:07"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:28"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:05:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:05"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:10"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:42"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:47"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:52"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:06:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:07:02"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:07:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:07:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:07:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:07:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:07:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:09:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:09:42"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:09:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:09:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:09:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:10:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:42"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:47"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:52"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:11:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:12:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:14:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:14:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:14:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:14:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:14:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:14:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:14:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:14:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:14:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:14:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:02"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:07"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:17"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:22"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:15:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:16:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:16:05"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:16:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:16:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:16:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:16:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:16:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:16:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:18:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:18:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:18:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:42"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:47"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:52"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:19:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:20:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:21:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:21:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:21:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:23:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:23:25"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:23:30"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:23:35"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:23:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:23:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:23:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:23:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:42"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:47"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:52"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:24:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:25:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:25:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:25:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:25:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:25:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:25:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:25:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:25:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:25:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:27:52"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:27:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:35"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:28:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:17"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:22"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:27"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:38"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:29:59"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:30:04"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:30:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:30:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:30:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:32:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:32:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:32:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:32:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:32:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:32:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:32:59"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:05"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:10"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:15"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:25"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:30"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:33:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:02"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:07"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:17"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:22"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:28"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:34:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:35"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:37:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:06"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:17"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:22"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:27"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:42"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:47"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:38:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:39:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:39:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:39:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:39:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:39:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:39:30"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:41:38"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:41:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:41:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:41:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:41:59"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:04"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:30"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:35"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:42:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:02"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:28"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:43:59"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:44:05"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:46:15"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:46:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:46:25"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:46:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:46:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:46:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:46:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:46:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:46:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:07"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:17"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:28"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:38"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:47:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:48:04"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:48:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:48:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:48:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:48:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:48:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:48:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:48:40"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:50:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:50:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:51:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:51:05"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:51:10"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:51:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:51:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:51:27"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:51:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:51:38"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:51:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:51:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:52:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:52:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:52:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:52:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:52:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:52:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:52:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:52:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:52:47"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:52:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:53:05"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:53:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:53:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:53:22"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:53:27"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:53:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 13:53:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:16:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:16:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:16:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:16:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:16:30"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "The read operation timed out", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:16:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:16:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:16:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:17:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:17:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:17:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:17:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:17:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "The read operation timed out", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:17:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "[Errno 8] nodename nor servname provided, or not known", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:17:45"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "[Errno 8] nodename nor servname provided, or not known", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:17:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "[Errno 8] nodename nor servname provided, or not known", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:17:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:17:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "The read operation timed out", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:18:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:18:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:18:28"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "The read operation timed out", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:18:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:18:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "[Errno 8] nodename nor servname provided, or not known", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:18:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "[Errno 8] nodename nor servname provided, or not known", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:18:57"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "[Errno 8] nodename nor servname provided, or not known", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:19:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:19:07"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:19:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "[Errno 8] nodename nor servname provided, or not known", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:19:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:13"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:18"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:23"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:50"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:30:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:05"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:11"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:21"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:48"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:31:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:32:04"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:32:09"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:32:14"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:32:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:32:25"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:32:30"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:34:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:34:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:34:54"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:05"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:10"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:16"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:35:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:07"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:17"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:22"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:27"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:32"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:37"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:43"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:47"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:53"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:36:58"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:37:03"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:37:08"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/Soul上像开老茶馆.mp4", "title": "Soul上像开老茶馆", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:39:19"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百七十万罚单亲历.mp4", "title": "三百七十万罚单亲历", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:39:24"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三百简历只要两三个.mp4", "title": "三百简历只要两三个", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:39:29"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/三角洲模型怎么卖.mp4", "title": "三角洲模型怎么卖", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:39:34"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/上麦讲你上月做啥.mp4", "title": "上麦讲你上月做啥", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:39:39"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/二百七十万推流从哪来.mp4", "title": "二百七十万推流从哪来", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:39:44"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/什么话题最好起量.mp4", "title": "什么话题很好起量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:39:49"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/今天128场先聊筛选.mp4", "title": "今天128场先聊筛选", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:39:55"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/保镖业务先讲清模式.mp4", "title": "保镖业务先讲清模式", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:00"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分享最赚钱那一个月.mp4", "title": "分享最获得收益那一个月", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:05"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/分他靠自己赚不到的那块.mp4", "title": "分他靠自己赚不到的那块", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:10"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/场景里拍视频就链接.mp4", "title": "场景里拍视频就链接", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:15"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/学历不如可验证实操.mp4", "title": "学历不如可验证实操", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:20"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/开一百多场在干嘛.mp4", "title": "开一百多场在干嘛", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:26"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/性格不对团队白搭.mp4", "title": "性格不对团队白搭", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:31"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/想两万月薪先看月烧多少.mp4", "title": "想两万月薪先看月烧多少", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:36"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我不认一万小时定律.mp4", "title": "我不认一万小时定律", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:41"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:46"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/政商金融矿产华侨.mp4", "title": "政商金融矿产华侨", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:51"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/普通人能做啥值钱.mp4", "title": "普通人能做啥值钱", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:40:56"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/最大产值不是写代码.mp4", "title": "很大产值不是写代码", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:41:01"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/月进房一两万人.mp4", "title": "月进房一两万人", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:41:07"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/现在缺的是流量.mp4", "title": "现在缺的是流量", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:41:12"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/筛对了人能跟十二年.mp4", "title": "筛对了人能跟十二年", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:41:17"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/线上更适合阿米巴.mp4", "title": "线上更适合阿米巴", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:41:22"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/群主和交付师不一样.mp4", "title": "群主和交付师不一样", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:41:27"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/职场课为什么卖不动.mp4", "title": "职场课为什么卖不动", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:41:33"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/说个案例你就懂.mp4", "title": "说个案例你就懂", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:41:38"}
{"platform": "视频号", "video_path": "/private/tmp/soul_channels_127_128_bundle/链接要落到具体事.mp4", "title": "链接要落到具体事", "success": false, "status": "error", "message": "localStorage 缺少 finder_rawrawKeyBuffpost_create 会报 300002。请运行: python3 视频号发布/", "elapsed_sec": 0.0, "timestamp": "2026-03-25 14:41:43"}
{"platform": "视频号", "video_path": "/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "title": "我之前抖音就这么做", "success": true, "status": "published", "message": "✓ API+列表API (列表第8条命中 | kw=我之前抖音就这么做 | createTime=2026-03-25 14:45 | 无tips)", "screenshot": "/tmp/channels_ss/我之前抖音就这么做_5_before_close.png", "elapsed_sec": 47.91404128074646, "timestamp": "2026-03-25 14:45:28"}

View File

@@ -11,8 +11,37 @@ from pathlib import Path
from typing import Optional
RESULT_LOG = Path(__file__).parent / "publish_log.json"
UPLOAD_LIBRARY_LOG = Path(__file__).parent / "upload_library.jsonl"
def _video_signature(video_path: str) -> str:
p = Path(video_path)
try:
st = p.stat()
return f"{p.name}|{st.st_size}"
except Exception:
return p.name
def _load_library_set() -> set[tuple[str, str]]:
out = set()
if not UPLOAD_LIBRARY_LOG.exists():
return out
with open(UPLOAD_LIBRARY_LOG, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if not line:
continue
try:
rec = json.loads(line)
pf = rec.get("platform", "")
sig = rec.get("video_signature", "")
if pf and sig:
out.add((pf, sig))
except json.JSONDecodeError:
continue
return out
@dataclass
class PublishResult:
platform: str
@@ -36,36 +65,59 @@ class PublishResult:
def save_results(results: list[PublishResult]):
"""追加写入 JSON Lines 日志"""
"""追加写入 JSON Lines 日志,并同步上传库去重记录"""
with open(RESULT_LOG, "a", encoding="utf-8") as f:
for r in results:
f.write(json.dumps(r.to_dict(), ensure_ascii=False) + "\n")
# 仅成功条目写入上传库(全平台统一去重)
with open(UPLOAD_LIBRARY_LOG, "a", encoding="utf-8") as lib:
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
for r in results:
if not r.success:
continue
rec = {
"timestamp": now,
"platform": r.platform,
"video_path": r.video_path,
"video_signature": _video_signature(r.video_path),
"status": r.status,
}
lib.write(json.dumps(rec, ensure_ascii=False) + "\n")
def load_published_set() -> set[tuple[str, str]]:
"""加载已成功发布的 (platform, video_filename) 集合,用于去重"""
"""加载已成功发布集合(兼容旧日志 + 上传库)。"""
published = set()
if not RESULT_LOG.exists():
return published
with open(RESULT_LOG, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if not line:
continue
try:
rec = json.loads(line)
if rec.get("success"):
fname = Path(rec.get("video_path", "")).name
published.add((rec["platform"], fname))
except json.JSONDecodeError:
continue
if RESULT_LOG.exists():
with open(RESULT_LOG, "r", encoding="utf-8") as f:
for line in f:
line = line.strip()
if not line:
continue
try:
rec = json.loads(line)
if rec.get("success"):
fname = Path(rec.get("video_path", "")).name
published.add((rec["platform"], fname))
except json.JSONDecodeError:
continue
# 同步上传库签名映射回文件名集合(保障去重不遗漏)
for platform, sig in _load_library_set():
fname = sig.split("|", 1)[0]
if fname:
published.add((platform, fname))
return published
def is_published(platform: str, video_path: str) -> bool:
"""检查某条视频是否已成功发布到某平台(供各平台脚本直接调用)"""
"""检查某条视频是否已成功发布到某平台(全平台上传库去重)。"""
fname = Path(video_path).name
return (platform, fname) in load_published_set()
if (platform, fname) in load_published_set():
return True
sig = _video_signature(video_path)
return (platform, sig) in _load_library_set()
def load_failed_tasks() -> list[dict]:

View File

@@ -7,6 +7,19 @@ import asyncio
from datetime import datetime
def _iter_surfaces(page):
surfaces = [page]
try:
for fr in page.frames:
u = (fr.url or '').lower()
if '/micro/content/post/create' in u or 'finder' in u or 'mmfinder' in u:
surfaces.append(fr)
except Exception:
pass
return surfaces
async def set_scheduled_time(page, scheduled_time: datetime, platform: str = "") -> bool:
"""
在 Playwright 页面上设置定时发布时间。
@@ -20,25 +33,37 @@ async def set_scheduled_time(page, scheduled_time: datetime, platform: str = "")
print(f" [定时] 设置定时发布: {date_str} {time_str}", flush=True)
try:
found = await _click_schedule_toggle(page)
if not found:
# 视频号等页面存在“默认显示时间输入”场景:未找到开关时继续尝试填时间。
print(f" [定时] 未找到定时开关,尝试直接填写日期时间", flush=True)
for surface in _iter_surfaces(page):
found = await _click_schedule_toggle(surface)
if not found:
# 视频号等页面存在“默认显示时间输入”场景:未找到开关时继续尝试填时间。
pass
await asyncio.sleep(1)
await asyncio.sleep(0.6)
ok = await _fill_datetime(page, scheduled_time, date_str, time_str)
if ok and platform == "视频号":
# 视频号页面常出现“控件可点但值未真正落库”的情况,这里做一次显式验收。
ok = await _verify_channels_schedule_value(page, date_str, time_str)
if ok:
print(f" [定时] 已设置定时: {date_str} {time_str}", flush=True)
ok = await _fill_datetime(surface, scheduled_time, date_str, time_str)
if platform == "视频号":
if not ok:
await _force_channels_schedule_controls(surface, date_str, time_str)
ok = True
ok = await _verify_channels_schedule_value(surface, date_str, time_str)
if ok:
print(f" [定时] 已设置定时: {date_str} {time_str}", flush=True)
return True
# 全部 surface 失败
if platform == "视频号":
print(" [定时] 页面定时控件未同步成功,后续将以接口注入为准", flush=True)
else:
print(f" [定时] 日期时间填写失败,降级为立即发布", flush=True)
return ok
return False
except Exception as e:
print(f" [定时] 异常: {str(e)[:60]},降级为立即发布", flush=True)
if platform == "视频号":
print(f" [定时] 页面控件异常: {str(e)[:60]},后续将以接口注入为准", flush=True)
else:
print(f" [定时] 异常: {str(e)[:60]},降级为立即发布", flush=True)
return False
@@ -140,6 +165,60 @@ async def _fill_datetime(page, dt: datetime, date_str: str, time_str: str) -> bo
return await _try_fill_picker_widgets(page, date_str, time_str)
async def _force_channels_schedule_controls(page, date_str: str, time_str: str) -> None:
"""视频号定时控件强制设置:点“定时”并写入发布时间输入框。"""
payload = {"dateStr": date_str, "timeStr": time_str, "combined": f"{date_str} {time_str}"}
await page.evaluate("""({ dateStr, timeStr, combined }) => {
const vis = (el) => !!el && el.offsetParent !== null;
const setVal = (inp, val) => {
const desc = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value');
if (desc && desc.set) desc.set.call(inp, val); else inp.value = val;
inp.dispatchEvent(new Event('input', { bubbles: true }));
inp.dispatchEvent(new Event('change', { bubbles: true }));
inp.dispatchEvent(new Event('blur', { bubbles: true }));
};
// 1) 先确保“定时”被选中
const nodes = Array.from(document.querySelectorAll('label,span,div,li,button,input[type="radio"]')).filter(vis);
for (const n of nodes) {
const t = (n.textContent || '').trim();
if (t === '定时' || t.includes('定时发表') || t.includes('定时发布')) {
try { n.click(); } catch (e) {}
}
}
// 行级兜底:包含“定时发表”的区域,优先点“定时”文案和第二个 radio
const row = nodes.find(n => (n.textContent || '').includes('定时发表'));
if (row) {
const root = row.closest('div,li,section,form') || row.parentElement || document.body;
const radios = Array.from(root.querySelectorAll('input[type="radio"]')).filter(vis);
if (radios.length >= 2) {
try { radios[1].click(); } catch (e) {}
}
const timedNode = Array.from(root.querySelectorAll('label,span,div,li,button')).find(n => {
const t = (n.textContent || '').trim();
return t === '定时' || /定时/.test(t);
});
if (timedNode && vis(timedNode)) { try { timedNode.click(); } catch (e) {} }
}
// 2) 写发布时间输入框
const inputs = Array.from(document.querySelectorAll('input')).filter(vis);
const targets = [];
for (const i of inputs) {
const ph = (i.placeholder || '').toLowerCase();
const cls = (i.className || '').toLowerCase();
if (ph.includes('发布时间') || ph.includes('日期') || ph.includes('时间') || ph.includes('选择') || cls.includes('date') || cls.includes('time') || cls.includes('picker')) {
targets.push(i);
}
}
if (targets.length) {
const last = targets[targets.length - 1];
try { last.click(); } catch (e) {}
setVal(last, combined);
}
}""", payload)
async def _verify_channels_schedule_value(page, date_str: str, time_str: str) -> bool:
"""校验视频号“定时”已选中且发布时间字段包含目标时间。"""
payload = {"dateStr": date_str, "timeStr": time_str}
@@ -231,24 +310,36 @@ async def _try_fill_time(page, dt: datetime, time_str: str) -> bool:
'input[class*="time"]:not([class*="timestamp"])',
]
# 视频号的时间选择通常在下方,优先点击最下面那个可见输入框。
for sel in time_selectors:
loc = page.locator(sel).first
loc = page.locator(sel)
try:
if await loc.count() > 0:
await loc.click(force=True, timeout=1200)
await loc.fill(time_str)
await asyncio.sleep(0.3)
return True
cnt = await loc.count()
except Exception:
cnt = 0
if cnt <= 0:
continue
for idx in range(cnt - 1, -1, -1):
item = loc.nth(idx)
try:
if await item.is_visible():
await item.click(force=True, timeout=1200)
await item.fill(time_str)
await asyncio.sleep(0.3)
return True
except Exception:
continue
filled = await page.evaluate("""(timeStr) => {
const inputs = document.querySelectorAll('input');
for (const inp of inputs) {
const visibleInputs = [...inputs].filter(inp => inp.offsetParent !== null);
visibleInputs.sort((a, b) => b.getBoundingClientRect().top - a.getBoundingClientRect().top);
for (const inp of visibleInputs) {
const ph = (inp.placeholder || '').toLowerCase();
const cls = (inp.className || '').toLowerCase();
if ((ph.includes('时间') || ph.includes('time') || cls.includes('time'))
&& !cls.includes('timestamp') && inp.offsetParent !== null) {
inp.click();
const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set;
nativeSet.call(inp, timeStr);
inp.dispatchEvent(new Event('input', {bubbles: true}));
@@ -334,6 +425,7 @@ async def _try_fill_near_publish_time(page, date_str: str, time_str: str) -> boo
let dateDone = false;
let timeDone = false;
visibleInputs.sort((a, b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top);
for (const inp of visibleInputs) {
const ph = (inp.placeholder || '').toLowerCase();
const cls = (inp.className || '').toLowerCase();
@@ -343,7 +435,14 @@ async def _try_fill_near_publish_time(page, date_str: str, time_str: str) -> boo
dateDone = true;
continue;
}
}
// 时间优先点最下面那个,避免点到上方日期框或假输入框。
for (const inp of [...visibleInputs].sort((a, b) => b.getBoundingClientRect().top - a.getBoundingClientRect().top)) {
const ph = (inp.placeholder || '').toLowerCase();
const cls = (inp.className || '').toLowerCase();
const tp = (inp.type || '').toLowerCase();
if (!timeDone && (tp === 'time' || ph.includes('时间') || ph.includes('time') || ph.includes('') || cls.includes('time'))) {
inp.click();
setValue(inp, timeStr);
timeDone = true;
}

View File

@@ -0,0 +1,36 @@
{"timestamp": "2026-03-24 20:14:21", "platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/今天128场先聊筛选.mp4", "video_signature": "今天128场先聊筛选.mp4|4751510", "status": "reviewing"}
{"timestamp": "2026-03-24 20:14:21", "platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/分享最赚钱那一个月.mp4", "video_signature": "分享最赚钱那一个月.mp4|4377153", "status": "reviewing"}
{"timestamp": "2026-03-24 20:14:21", "platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/开一百多场在干嘛.mp4", "video_signature": "开一百多场在干嘛.mp4|4698439", "status": "reviewing"}
{"timestamp": "2026-03-24 20:14:21", "platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我不认一万小时定律.mp4", "video_signature": "我不认一万小时定律.mp4|4666790", "status": "reviewing"}
{"timestamp": "2026-03-24 20:14:21", "platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "video_signature": "我之前抖音就这么做.mp4|5229367", "status": "reviewing"}
{"timestamp": "2026-03-24 20:14:21", "platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/普通人能做啥值钱.mp4", "video_signature": "普通人能做啥值钱.mp4|5354370", "status": "reviewing"}
{"timestamp": "2026-03-24 20:14:21", "platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/说个案例你就懂.mp4", "video_signature": "说个案例你就懂.mp4|4594013", "status": "reviewing"}
{"timestamp": "2026-03-24 20:14:21", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/今天128场先聊筛选.mp4", "video_signature": "今天128场先聊筛选.mp4|4751510", "status": "likely_published"}
{"timestamp": "2026-03-24 20:14:21", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/分享最赚钱那一个月.mp4", "video_signature": "分享最赚钱那一个月.mp4|4377153", "status": "likely_published"}
{"timestamp": "2026-03-24 20:14:21", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/开一百多场在干嘛.mp4", "video_signature": "开一百多场在干嘛.mp4|4698439", "status": "likely_published"}
{"timestamp": "2026-03-24 20:14:21", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我不认一万小时定律.mp4", "video_signature": "我不认一万小时定律.mp4|4666790", "status": "likely_published"}
{"timestamp": "2026-03-24 20:48:16", "platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "video_signature": "七千店复制拿投资月流水五十万.mp4|9583735", "status": "reviewing"}
{"timestamp": "2026-03-24 20:59:22", "platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "video_signature": "月进房一两万人.mp4|3966708", "status": "reviewing"}
{"timestamp": "2026-03-24 20:59:22", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "video_signature": "我之前抖音就这么做.mp4|5229367", "status": "likely_published"}
{"timestamp": "2026-03-24 20:59:22", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/普通人能做啥值钱.mp4", "video_signature": "普通人能做啥值钱.mp4|5354370", "status": "likely_published"}
{"timestamp": "2026-03-24 20:59:22", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "video_signature": "月进房一两万人.mp4|3966708", "status": "likely_published"}
{"timestamp": "2026-03-24 20:59:22", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/说个案例你就懂.mp4", "video_signature": "说个案例你就懂.mp4|4594013", "status": "likely_published"}
{"timestamp": "2026-03-24 21:00:01", "platform": "B站", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "video_signature": "月进房一两万人.mp4|3966708", "status": "reviewing"}
{"timestamp": "2026-03-24 21:00:01", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/我之前抖音就这么做.mp4", "video_signature": "我之前抖音就这么做.mp4|5229367", "status": "likely_published"}
{"timestamp": "2026-03-24 21:00:01", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/普通人能做啥值钱.mp4", "video_signature": "普通人能做啥值钱.mp4|5354370", "status": "likely_published"}
{"timestamp": "2026-03-24 21:00:01", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/月进房一两万人.mp4", "video_signature": "月进房一两万人.mp4|3966708", "status": "likely_published"}
{"timestamp": "2026-03-24 21:00:01", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第128场_20260319_output/成片/说个案例你就懂.mp4", "video_signature": "说个案例你就懂.mp4|4594013", "status": "likely_published"}
{"timestamp": "2026-03-24 21:00:01", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/第129场_20260320_output/成片/七千店复制拿投资月流水五十万.mp4", "video_signature": "七千店复制拿投资月流水五十万.mp4|9583735", "status": "likely_published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/AI最大的缺点是上下文太短这样来解决.mp4", "video_signature": "AI最大的缺点是上下文太短这样来解决.mp4|7521601", "status": "published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/AI每天剪1000个视频 M4电脑24T素材库全网分发.mp4", "video_signature": "AI每天剪1000个视频 M4电脑24T素材库全网分发.mp4|27929301", "status": "likely_published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/Soul派对变现全链路 发视频就有钱,后端全解决.mp4", "video_signature": "Soul派对变现全链路 发视频就有钱,后端全解决.mp4|21135131", "status": "likely_published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/从0到切片发布 AI自动完成每天副业30条视频.mp4", "video_signature": "从0到切片发布 AI自动完成每天副业30条视频.mp4|15182878", "status": "likely_published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/做副业的基本条件 苹果电脑和特殊访问工具.mp4", "video_signature": "做副业的基本条件 苹果电脑和特殊访问工具.mp4|19575651", "status": "likely_published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/切片分发全自动化 从视频到发布一键完成.mp4", "video_signature": "切片分发全自动化 从视频到发布一键完成.mp4|30731220", "status": "likely_published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/创业团队4人平分25有啥危险 先跑钱再谈股权.mp4", "video_signature": "创业团队4人平分25有啥危险 先跑钱再谈股权.mp4|21423166", "status": "likely_published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/坚持到120场是什么感觉 方向越确定执行越坚决.mp4", "video_signature": "坚持到120场是什么感觉 方向越确定执行越坚决.mp4|19367933", "status": "likely_published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/帮人装AI一单300到1000块传统行业也能做.mp4", "video_signature": "帮人装AI一单300到1000块传统行业也能做.mp4|21608518", "status": "published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/深度AI模型对比 哪个才是真正的AI不是语言模型.mp4", "video_signature": "深度AI模型对比 哪个才是真正的AI不是语言模型.mp4|18471791", "status": "published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/疗愈师配AI助手能收多少钱 一个小团队5万到10万.mp4", "video_signature": "疗愈师配AI助手能收多少钱 一个小团队5万到10万.mp4|24461141", "status": "likely_published"}
{"timestamp": "2026-03-24 21:38:24", "platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 120场 20260320_output/成片_大师版/赚钱没那么复杂,自信心才是核心问题.mp4", "video_signature": "赚钱没那么复杂,自信心才是核心问题.mp4|22996736", "status": "likely_published"}
{"timestamp": "2026-03-25 14:45:28", "platform": "视频号", "video_path": "/tmp/soul_channels_127_128_bundle/我之前抖音就这么做.mp4", "video_signature": "我之前抖音就这么做.mp4|5229367", "status": "published"}

View File

@@ -21,7 +21,7 @@ from content_filter import filter_for_platform
BRAND_TAG = "#卡若创业派对"
MINI_PROGRAM = "#小程序 卡若创业派对"
# 视频号描述末尾固定话题(发布强制标签)
CHANNELS_FIXED_TAGS = ("#小程序", "#卡若创业派对", "#Ai创业", "#私域流量")
CHANNELS_FIXED_TAGS = ("#小程序", "#卡若创业派对", "#Ai创业", "#私域流量")
PLATFORM_CATEGORIES = {
"B站": {"tid": 160, "name": "生活 > 日常"},

View File

@@ -0,0 +1,83 @@
#!/usr/bin/env python3
"""
新网站自动化脚本模板CLI + F12 SDK 结合版)
流程建议:
1) 先定义 endpoint 规则(相当于 F12 里你要盯的接口)
2) 再定义 inject 规则(如定时字段、发布方式字段)
3) CLI 负责“检查/发布/重试”SDK 负责“抓包/注入/回放证据”
"""
from __future__ import annotations
import asyncio
from dataclasses import dataclass
from datetime import datetime
from pathlib import Path
from playwright.async_api import async_playwright
from web_f12_sdk import EndpointRule, InjectPatchRule, F12ApiCapture, WebF12Sdk
@dataclass
class PlatformProfile:
endpoint_rules: list[EndpointRule]
inject_rules: list[InjectPatchRule]
def build_profile(scheduled_time=None) -> PlatformProfile:
schedule_ts = int(scheduled_time.timestamp()) if isinstance(scheduled_time, datetime) else 0
endpoint_rules = [
EndpointRule(name="auth_check", contains_any=["/auth/check"]),
EndpointRule(name="content_list", contains_any=["/content/list"]),
EndpointRule(name="content_create", contains_any=["/content/create"], methods=["POST"]),
]
inject_rules: list[InjectPatchRule] = []
if schedule_ts > 0:
def _patch(payload: dict) -> dict:
payload["scheduleTime"] = schedule_ts
payload["publishType"] = "timed"
return payload
inject_rules.append(
InjectPatchRule(
endpoint=EndpointRule(
name="content_create",
contains_any=["/content/create"],
methods=["POST"],
),
patch=_patch,
)
)
return PlatformProfile(endpoint_rules=endpoint_rules, inject_rules=inject_rules)
async def demo_run(video_path: str, scheduled_time=None) -> None:
profile = build_profile(scheduled_time)
capture = F12ApiCapture(output_file=str(Path("/tmp/web_f12_template.jsonl")))
sdk = WebF12Sdk(
endpoint_rules=profile.endpoint_rules,
inject_rules=profile.inject_rules,
capture=capture,
)
async with async_playwright() as pw:
browser = await pw.chromium.launch(headless=True)
ctx = await browser.new_context()
page = await ctx.new_page()
await sdk.attach_capture(page)
await sdk.attach_injector(page)
# TODO: 在此处填写你的网站发布流程(登录、上传、点击发布)
await asyncio.sleep(1)
await browser.close()
print("F12摘要:", capture.summary(), "patch_hits:", sdk.patch_hits, "video:", video_path)
if __name__ == "__main__":
asyncio.run(demo_run("/tmp/demo.mp4"))

View File

@@ -0,0 +1,224 @@
#!/usr/bin/env python3
"""
Web 平台 F12 接口抽象层SDK 风格)
目标:
1) 统一请求/响应抓包(等价浏览器 F12 Network
2) 统一接口匹配规则(哪些是关键接口)
3) 统一请求体注入能力(如定时字段、签名字段)
4) 统一结果输出(便于多平台复用)
"""
from __future__ import annotations
import json
from dataclasses import dataclass, field
from datetime import datetime
from pathlib import Path
from typing import Callable, Optional
PatchFunc = Callable[[dict], dict]
@dataclass
class EndpointRule:
"""关键接口规则url 包含任一关键词即命中。"""
name: str
contains_any: list[str]
methods: list[str] = field(default_factory=lambda: ["GET", "POST"])
def match(self, method: str, url: str) -> bool:
m = (method or "").upper()
if self.methods and m not in [x.upper() for x in self.methods]:
return False
u = (url or "").lower()
return any((k or "").lower() in u for k in self.contains_any)
@dataclass
class InjectPatchRule:
"""请求体注入规则:命中 endpoint 后对 json body 执行 patch。"""
endpoint: EndpointRule
patch: PatchFunc
@dataclass
class CaptureEvent:
ts: str
event: str # request | response | route_patch
method: str
url: str
status: int = 0
endpoint: str = ""
headers: dict = field(default_factory=dict)
post_data: str = ""
body: dict | str | None = None
@dataclass
class F12ApiCapture:
"""统一抓包器:可落盘 jsonl可按 endpoint 聚合。"""
output_file: str = ""
max_clip: int = 200000
events: list[CaptureEvent] = field(default_factory=list)
endpoint_hits: dict[str, int] = field(default_factory=dict)
@staticmethod
def _sanitize_headers(headers: dict) -> dict:
out = {}
for k, v in (headers or {}).items():
lk = (k or "").lower()
if lk == "cookie":
out[k] = "<masked-cookie>"
elif lk == "authorization":
out[k] = "<masked-auth>"
else:
out[k] = v
return out
def _clip(self, s: str) -> str:
s = "" if s is None else str(s)
if len(s) <= self.max_clip:
return s
return s[: self.max_clip] + "...<truncated>"
def _append(self, evt: CaptureEvent) -> None:
self.events.append(evt)
if evt.endpoint:
self.endpoint_hits[evt.endpoint] = self.endpoint_hits.get(evt.endpoint, 0) + 1
if not self.output_file:
return
try:
Path(self.output_file).parent.mkdir(parents=True, exist_ok=True)
with open(self.output_file, "a", encoding="utf-8") as f:
f.write(json.dumps(evt.__dict__, ensure_ascii=False) + "\n")
except Exception:
pass
def mark(self, *, event: str, method: str, url: str, endpoint: str = "", status: int = 0, headers: dict | None = None, post_data: str = "", body=None) -> None:
self._append(
CaptureEvent(
ts=datetime.now().isoformat(),
event=event,
method=method,
url=url,
status=status,
endpoint=endpoint,
headers=self._sanitize_headers(headers or {}),
post_data=self._clip(post_data),
body=body,
)
)
def summary(self) -> dict:
return {
"events": len(self.events),
"endpoint_hits": dict(sorted(self.endpoint_hits.items(), key=lambda x: x[0])),
}
class WebF12Sdk:
"""
平台级 F12 SDK
- attach_capture(page): 接管 request/response
- attach_injector(page): 接管 route patch
"""
def __init__(
self,
*,
endpoint_rules: list[EndpointRule],
capture: F12ApiCapture,
inject_rules: Optional[list[InjectPatchRule]] = None,
) -> None:
self.endpoint_rules = endpoint_rules
self.capture = capture
self.inject_rules = inject_rules or []
self.patch_hits: dict[str, int] = {}
def _match_endpoint(self, method: str, url: str) -> str:
for r in self.endpoint_rules:
if r.match(method, url):
return r.name
return ""
async def attach_capture(self, page) -> None:
async def _on_request(request):
ep = self._match_endpoint(request.method, request.url)
if not ep:
return
self.capture.mark(
event="request",
method=request.method,
url=request.url,
endpoint=ep,
headers=request.headers or {},
post_data=request.post_data or "",
)
async def _on_response(response):
req = response.request
ep = self._match_endpoint(req.method if req else "", response.url)
if not ep:
return
body = None
try:
body = await response.json()
except Exception:
try:
body = self.capture._clip(await response.text())
except Exception:
body = ""
self.capture.mark(
event="response",
method=req.method if req else "",
url=response.url,
status=response.status,
endpoint=ep,
headers=req.headers if req else {},
post_data=req.post_data if req else "",
body=body,
)
page.on("request", _on_request)
page.on("response", _on_response)
async def attach_injector(self, page) -> None:
"""
只对 inject_rules 命中的请求执行 route patch。
为了稳妥,按 rule 单独 route避免对全量请求做复杂判断。
"""
for r in self.inject_rules:
pattern = r.endpoint.contains_any[0] if r.endpoint.contains_any else ""
if not pattern:
continue
route_pattern = f"**/*{pattern}*"
async def _handler(route, request, _rule=r):
try:
raw = request.post_data or ""
data = json.loads(raw) if raw else None
if not isinstance(data, dict):
await route.continue_()
return
patched = _rule.patch(data)
ep = _rule.endpoint.name
self.patch_hits[ep] = self.patch_hits.get(ep, 0) + 1
body_txt = json.dumps(patched, ensure_ascii=False)
self.capture.mark(
event="route_patch",
method=request.method,
url=request.url,
endpoint=ep,
headers=request.headers or {},
post_data=body_txt,
)
await route.continue_(post_data=body_txt)
except Exception:
await route.continue_()
await page.route(route_pattern, _handler)

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,87 @@
#!/usr/bin/env python3
"""
知乎发布 F12 抽象配置CLI + F12 SDK
"""
from __future__ import annotations
from datetime import datetime
from web_f12_sdk import EndpointRule, InjectPatchRule
def to_schedule_ts(scheduled_time) -> int:
if not scheduled_time:
return 0
if isinstance(scheduled_time, datetime):
return int(scheduled_time.timestamp())
return int(scheduled_time)
def build_zhihu_profile(scheduled_time=None):
schedule_ts = to_schedule_ts(scheduled_time)
endpoint_rules = [
EndpointRule(name="me", contains_any=["/api/v4/me"]),
# 分片/直传 URL 各版本不一,尽量放宽便于判定「上传已完成」
EndpointRule(
name="upload",
contains_any=[
"/upload",
"/api/creator/content/video/upload",
"zhihu.com/zvideo",
"zhihu.com/video",
"multimedia.zhihu.com",
"creator.zhihu.com",
],
),
EndpointRule(
name="video_publish",
contains_any=[
"/api/creator/content/video",
"/api/creator/content/publish",
"/api/v4/creator/content",
],
methods=["POST"],
),
EndpointRule(name="content_list", contains_any=["/api/creator/content", "/api/v4/creator/content"]),
]
inject_rules: list[InjectPatchRule] = []
if schedule_ts > 0:
def _patch(payload: dict) -> dict:
# 兼容不同站点命名
candidates = [
"publish_time",
"publishTime",
"scheduled_time",
"scheduledTime",
"publish_at",
"publishAt",
"timing_ts",
]
for k in candidates:
if k in payload:
payload[k] = int(schedule_ts)
# 若无现成字段,也补常见字段供后端兼容
payload.setdefault("publish_time", int(schedule_ts))
payload.setdefault("publish_at", int(schedule_ts))
payload.setdefault("is_timed_publish", True)
payload.setdefault("publish_type", "timed")
return payload
inject_rules.append(
InjectPatchRule(
endpoint=EndpointRule(
name="video_publish",
contains_any=[
"/api/creator/content/video",
"/api/creator/content/publish",
"/api/v4/creator/content",
],
methods=["POST"],
),
patch=_patch,
)
)
return endpoint_rules, inject_rules

View File

@@ -0,0 +1,53 @@
#!/usr/bin/env python3
"""知乎 Cookie 获取Playwright 登录后保存 storage_state。"""
import asyncio
import sys
from pathlib import Path
from playwright.async_api import async_playwright
COOKIE_FILE = Path(__file__).parent / "zhihu_storage_state.json"
LOGIN_URL = "https://www.zhihu.com/signin"
PROFILE_PLATFORM = "知乎"
UA = (
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36"
)
sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent / "多平台分发" / "脚本"))
from browser_profile import get_browser_profile_dir
async def main():
profile_dir = get_browser_profile_dir(PROFILE_PLATFORM)
print("即将弹出浏览器,请登录知乎(支持扫码/密码/验证码)。")
print(f"固定浏览器目录: {profile_dir}")
print("登录成功进入创作中心后,在 Inspector 点绿色 ▶ 继续。\n")
async with async_playwright() as pw:
context = await pw.chromium.launch_persistent_context(
str(profile_dir),
headless=False,
user_agent=UA,
viewport={"width": 1366, "height": 900},
)
await context.add_init_script(
"Object.defineProperty(navigator,'webdriver',{get:()=>undefined})"
)
page = context.pages[0] if context.pages else await context.new_page()
await page.goto(LOGIN_URL, timeout=60000)
print("等待你完成登录...")
await page.pause()
await context.storage_state(path=str(COOKIE_FILE))
await context.close()
print(f"\n[✓] 知乎 Cookie 已保存: {COOKIE_FILE}")
if COOKIE_FILE.exists():
print(f" 文件大小: {COOKIE_FILE.stat().st_size} bytes")
if __name__ == "__main__":
asyncio.run(main())

View File

@@ -0,0 +1,640 @@
#!/usr/bin/env python3
"""
知乎视频发布CLI + F12 SDK
- 支持 Cookie 预检
- 支持定时UI优先 + F12注入兜底
- 支持发布结果写入统一 publish_log.json
"""
from __future__ import annotations
import asyncio
import json
import sys
import time
from datetime import datetime
from pathlib import Path
SCRIPT_DIR = Path(__file__).parent
COOKIE_FILE = SCRIPT_DIR / "zhihu_storage_state.json"
VIDEO_DIR = Path("/Users/karuo/Movies/soul视频/第129场_20260320_output/成片")
sys.path.insert(0, str(SCRIPT_DIR.parent.parent / "多平台分发" / "脚本"))
from publish_result import PublishResult
from video_metadata import VideoMeta
from web_f12_sdk import F12ApiCapture, WebF12Sdk
from zhihu_f12_profile import build_zhihu_profile
from browser_profile import get_browser_profile_dir
UA = (
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36"
)
def _cookie_str_from_file() -> str:
if not COOKIE_FILE.exists():
return ""
state = json.loads(COOKIE_FILE.read_text(encoding="utf-8"))
return "; ".join(f"{c['name']}={c['value']}" for c in state.get("cookies", []))
def verify_session_cookie() -> tuple[bool, str]:
if not COOKIE_FILE.exists():
return False, "Cookie 文件不存在"
cookie = _cookie_str_from_file()
if not cookie.strip():
return False, "Cookie 文件为空"
try:
import httpx
r = httpx.get(
"https://www.zhihu.com/api/v4/me",
headers={"Cookie": cookie, "User-Agent": UA},
timeout=10,
)
if r.status_code == 200:
data = r.json()
name = data.get("name", "?")
return True, f"登录有效: {name}"
return False, f"状态码: {r.status_code}"
except Exception as e:
return False, f"预检异常: {str(e)[:120]}"
async def _set_scheduled_time_ui(page, scheduled_time: datetime) -> bool:
"""
UI 定时尝试(不同版本知乎创作中心 UI 选择器不稳定,做多重兜底)。
"""
dt_text = scheduled_time.strftime("%Y-%m-%d %H:%M")
# 点击定时入口
triggers = [
'text=定时发布',
'text=预约发布',
'label:has-text("定时")',
'[class*="schedule"]',
]
for sel in triggers:
loc = page.locator(sel).first
try:
if await loc.count() > 0 and await loc.is_visible():
await loc.click(force=True)
break
except Exception:
continue
# 填写时间输入
inputs = [
'input[type="datetime-local"]',
'input[placeholder*="时间"]',
'input[placeholder*="发布"]',
'input[placeholder*="日期"]',
]
for sel in inputs:
loc = page.locator(sel).first
try:
if await loc.count() == 0 or not await loc.is_visible():
continue
if sel == 'input[type="datetime-local"]':
await loc.fill(scheduled_time.strftime("%Y-%m-%dT%H:%M"))
else:
await loc.click(force=True)
await page.keyboard.press("Meta+A")
await page.keyboard.type(dt_text, delay=15)
await asyncio.sleep(0.4)
return True
except Exception:
continue
return False
async def _dismiss_home_popup(page) -> None:
"""关闭知乎创作中心首页活动弹窗/遮罩。"""
try:
await page.evaluate("""() => {
const vis = (el) => !!el && el.offsetParent !== null;
const closeBtns = [
...document.querySelectorAll('button,span,div')
].filter(vis).filter(el => {
const t = (el.textContent || '').trim();
const cls = (el.className || '').toString();
return t === '×' || t === '' || t === '关闭' || cls.includes('close');
});
for (const b of closeBtns.slice(0, 8)) {
try { b.click(); } catch (e) {}
}
const masks = document.querySelectorAll('[class*="mask"], [class*="modal"], [class*="dialog"]');
for (const m of masks) {
if (m && m.offsetParent !== null) m.style.pointerEvents = 'none';
}
}""")
except Exception:
pass
def _capture_upload_http_ok(sdk: WebF12Sdk) -> bool:
"""F12 已抓到上传相关接口的成功响应(无头模式下 DOM 文案常滞后)。"""
for evt in reversed(sdk.capture.events[-240:]):
if evt.event != "response" or evt.endpoint != "upload":
continue
if evt.status in (200, 201, 204, 206):
return True
return False
async def _dom_video_editor_ready(page) -> bool:
"""页面是否已进入「可填标题/封面」的视频编辑态(比单一关键词稳)。"""
return await page.evaluate("""() => {
const t = (document.body.innerText || '');
const textOk = ['上传完成','已上传','转码完成','添加封面','设置封面','视频封面',
'重新上传','上传进度','100%','选择封面','编辑封面'].some(s => t.includes(s));
if (textOk) return true;
const v = document.querySelector('video');
if (v && (v.readyState >= 2 || (v.videoWidth || 0) > 0)) return true;
return false;
}""")
async def _handle_risk_challenge(page, *, allow_manual: bool, headless: bool) -> bool:
"""
检测知乎风控页:
- allow_manual=True 时给用户手工过验证机会,再继续流程
- 返回 True 表示可继续False 表示仍被拦截
"""
txt = await page.evaluate("document.body.innerText")
is_risk = ("网络环境存在异常" in txt) or ("/account/unhuman" in page.url)
if not is_risk:
return True
await page.screenshot(path="/tmp/zhihu_risk_block.png")
if not allow_manual:
return False
print(" [知乎风控] 检测到 unhuman 验证页,请在当前已打开的浏览器里完成验证(约 60 秒内)。", flush=True)
# 不依赖 Playwright Inspector很多环境没有绿色「继续」按钮
await asyncio.sleep(60 if not headless else 15)
txt2 = await page.evaluate("document.body.innerText")
return not (("网络环境存在异常" in txt2) or ("/account/unhuman" in page.url))
async def _set_video_file(page, video_path: str) -> bool:
"""知乎上传兜底:先 input[type=file],再 filechooser。"""
inp = page.locator('input[type="file"]').first
if await inp.count() > 0:
try:
await inp.set_input_files(video_path)
return True
except Exception:
pass
# filechooser 兜底(很多站点上传按钮不暴露 input
for trigger in ['text=发视频', 'text=上传视频', 'button:has-text("发视频")', 'button:has-text("上传")']:
loc = page.locator(trigger).first
try:
if await loc.count() == 0 or not await loc.is_visible():
continue
async with page.expect_file_chooser(timeout=2500) as fc_info:
await loc.click(force=True)
chooser = await fc_info.value
await chooser.set_files(video_path)
return True
except Exception:
continue
return False
async def _wait_manual_enter_video_publish(page, *, headless: bool) -> bool:
"""
人工接管一次:当自动入口失败时,允许用户手动点到“发视频页”,
然后脚本继续自动上传与发布。
"""
print(" [手动接管] 请在当前浏览器手动进入知乎“发视频”页面(约 45 秒内)。", flush=True)
await asyncio.sleep(45 if not headless else 20)
# 只要出现上传相关文本或 file input就认为进入成功
try:
txt = await page.evaluate("document.body.innerText")
if ("上传" in txt) or ("视频" in txt):
return True
except Exception:
pass
try:
return await page.locator('input[type="file"]').count() > 0
except Exception:
return False
async def publish_one(
video_path: str,
title: str,
idx: int = 1,
total: int = 1,
skip_dedup: bool = False,
scheduled_time: datetime | None = None,
*,
headless: bool = False,
allow_manual_risk: bool = True,
allow_manual_entry: bool = True,
) -> PublishResult:
from playwright.async_api import async_playwright
from publish_result import is_published
t0 = time.time()
vp = Path(video_path)
if not vp.exists():
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=False,
status="error",
message="视频文件不存在",
error_code="FILE_NOT_FOUND",
)
if not skip_dedup and is_published("知乎", video_path):
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=True,
status="skipped",
message="去重跳过(已发布)",
)
if not COOKIE_FILE.exists():
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=False,
status="error",
message="Cookie 不存在,请先运行 zhihu_login.py",
error_code="NO_COOKIE",
)
endpoint_rules, inject_rules = build_zhihu_profile(scheduled_time)
capture = F12ApiCapture(
output_file=str(Path("/tmp/zhihu_netlogs") / f"{vp.stem}_{datetime.now():%Y%m%d_%H%M%S}.jsonl")
)
sdk = WebF12Sdk(endpoint_rules=endpoint_rules, inject_rules=inject_rules, capture=capture)
try:
async with async_playwright() as pw:
profile_dir = get_browser_profile_dir("知乎")
ctx = await pw.chromium.launch_persistent_context(
str(profile_dir),
headless=headless,
user_agent=UA,
viewport={"width": 1366, "height": 900},
)
await ctx.add_init_script(
"Object.defineProperty(navigator,'webdriver',{get:()=>undefined})"
)
page = await ctx.new_page()
await sdk.attach_capture(page)
await sdk.attach_injector(page)
# 1) 进入知乎创作中心并打开“发视频”入口(不同版本 URL 兼容)
candidate_urls = [
"https://www.zhihu.com/creator/content/video/new",
"https://www.zhihu.com/creator/content/publish",
"https://www.zhihu.com/creator",
]
for u in candidate_urls:
try:
await page.goto(u, wait_until="domcontentloaded", timeout=40000)
await asyncio.sleep(2)
await _dismiss_home_popup(page)
body_try = await page.evaluate("document.body.innerText")
if "404" not in body_try:
break
except Exception:
continue
# 若还没进入发布页,尝试通过“+ / 发视频 / 发布视频”按钮进入
open_publish_selectors = [
'button:has-text("发视频")',
'button:has-text("发布视频")',
'text=发视频',
'text=发布视频',
'button:has-text("+")',
'[aria-label*="发布"]',
]
for sel in open_publish_selectors:
loc = page.locator(sel).first
try:
if await loc.count() > 0 and await loc.is_visible():
await loc.click(force=True)
await asyncio.sleep(1.2)
await _dismiss_home_popup(page)
break
except Exception:
continue
# 兜底:从左侧“发布内容”进入,再点击“发视频”
left_publish = page.locator('text=发布内容').first
try:
if await left_publish.count() > 0 and await left_publish.is_visible():
await left_publish.click(force=True)
await asyncio.sleep(1.0)
await _dismiss_home_popup(page)
except Exception:
pass
for sel in ['text=发视频', 'text=发布视频', 'button:has-text("发视频")']:
loc = page.locator(sel).first
try:
if await loc.count() > 0 and await loc.is_visible():
await loc.click(force=True)
await asyncio.sleep(1.0)
await _dismiss_home_popup(page)
break
except Exception:
continue
# 知乎首页常见链路:先点“发布”按钮,再点下拉里的“发视频”
try:
pub_menu_btn = page.locator('button:has-text("发布")').first
if await pub_menu_btn.count() > 0 and await pub_menu_btn.is_visible():
await pub_menu_btn.click(force=True)
await asyncio.sleep(0.6)
video_item = page.locator('text=发视频').first
if await video_item.count() > 0 and await video_item.is_visible():
await video_item.click(force=True)
await asyncio.sleep(1.0)
await _dismiss_home_popup(page)
except Exception:
pass
# 新版知乎:右上角“创作(+)”按钮,点开后选“发视频”
try:
create_btn = page.locator('button[aria-label="创作"]').first
if await create_btn.count() > 0 and await create_btn.is_visible():
await create_btn.click(force=True)
await asyncio.sleep(0.6)
for sel in ['text=发视频', 'text=发布视频', '[role="menuitem"]:has-text("发视频")']:
it = page.locator(sel).first
if await it.count() > 0 and await it.is_visible():
await it.click(force=True)
await asyncio.sleep(1.0)
await _dismiss_home_popup(page)
break
except Exception:
pass
txt = await page.evaluate("document.body.innerText")
ok_risk = await _handle_risk_challenge(
page, allow_manual=allow_manual_risk, headless=headless
)
if not ok_risk:
await page.screenshot(path="/tmp/zhihu_risk_block.png")
await ctx.storage_state(path=str(COOKIE_FILE))
await ctx.close()
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=False,
status="error",
message="知乎风控拦截unhuman验证未通过",
error_code="ZHIHU_RISK_BLOCK",
screenshot="/tmp/zhihu_risk_block.png",
elapsed_sec=time.time() - t0,
)
if "登录" in txt and "创作" not in txt:
await ctx.close()
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=False,
status="error",
message="未登录知乎创作中心",
error_code="NOT_LOGGED_IN",
elapsed_sec=time.time() - t0,
)
# 2) 上传视频
if not await _set_video_file(page, video_path):
if allow_manual_entry:
entered = await _wait_manual_enter_video_publish(page, headless=headless)
if entered and await _set_video_file(page, video_path):
pass
else:
await page.screenshot(path="/tmp/zhihu_no_upload_input.png")
await ctx.close()
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=False,
status="error",
message="未进入发视频页或未找到上传控件(手动接管后仍失败)",
error_code="NO_UPLOAD_INPUT",
screenshot="/tmp/zhihu_no_upload_input.png",
elapsed_sec=time.time() - t0,
)
else:
await page.screenshot(path="/tmp/zhihu_no_upload_input.png")
await ctx.close()
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=False,
status="error",
message="未找到上传控件",
error_code="NO_UPLOAD_INPUT",
screenshot="/tmp/zhihu_no_upload_input.png",
elapsed_sec=time.time() - t0,
)
# 3) 等上传完成
# 知乎大文件/高峰期转码较慢,默认等待上限提高到 15 分钟;
# 同时只要检测到“上传中/处理中”就继续等待,降低误判超时。
uploaded = False
net_ok_rounds = 0
for _ in range(450):
if await _dom_video_editor_ready(page):
uploaded = True
break
if _capture_upload_http_ok(sdk):
net_ok_rounds += 1
# 抓到成功分片/直传响应后,再给前端 610s 渲染标题区
if net_ok_rounds >= 3 or await _dom_video_editor_ready(page):
await asyncio.sleep(6)
uploaded = await _dom_video_editor_ready(page) or net_ok_rounds >= 5
if uploaded:
break
else:
net_ok_rounds = 0
body = await page.evaluate("document.body.innerText")
# 不能只看“发布”字样(创作首页也有发布按钮),必须命中上传完成/封面等视频页信号
if ("上传完成" in body) or ("封面" in body) or ("重新上传" in body) or ("上传进度" in body):
uploaded = True
break
if ("上传中" in body) or ("处理中" in body) or ("正在上传" in body) or ("转码中" in body):
await asyncio.sleep(2)
continue
await asyncio.sleep(2)
if not uploaded:
await page.screenshot(path="/tmp/zhihu_upload_timeout.png")
await ctx.close()
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=False,
status="error",
message="上传超时",
error_code="UPLOAD_TIMEOUT",
screenshot="/tmp/zhihu_upload_timeout.png",
elapsed_sec=time.time() - t0,
)
# 4) 标题/简介
short_title = title[:30]
title_input = page.locator('input[placeholder*="标题"], textarea[placeholder*="标题"]').first
if await title_input.count() > 0:
try:
if await title_input.is_visible():
await title_input.fill(short_title, timeout=3000)
except Exception:
pass
desc = VideoMeta.from_filename(vp.name).description("B站")[:200]
desc_input = page.locator('textarea[placeholder*="简介"], textarea[placeholder*="描述"], [contenteditable="true"]').first
if await desc_input.count() > 0:
try:
if await desc_input.is_visible():
await desc_input.fill(desc, timeout=3000)
except Exception:
try:
await desc_input.click(force=True, timeout=1500)
await page.keyboard.type(desc, delay=10)
except Exception:
pass
# 5) 定时UI优先 + F12注入兜底
if scheduled_time:
await _set_scheduled_time_ui(page, scheduled_time)
# 6) 点击发布
btn = page.locator('button:has-text("发布"), button:has-text("确认发布"), button:has-text("提交")').first
if await btn.count() == 0:
await page.screenshot(path="/tmp/zhihu_no_publish_btn.png")
await ctx.close()
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=False,
status="error",
message="未找到发布按钮",
error_code="NO_PUBLISH_BUTTON",
screenshot="/tmp/zhihu_no_publish_btn.png",
elapsed_sec=time.time() - t0,
)
clicked = False
try:
if await btn.is_visible():
await btn.click(force=True, timeout=2500)
clicked = True
except Exception:
pass
if not clicked:
try:
clicked = await page.evaluate("""() => {
const vis = (el) => !!el && el.offsetParent !== null;
const btns = [...document.querySelectorAll('button')].filter(vis);
const b = btns.find(x => {
const t = (x.textContent || '').trim();
return t.includes('发布') || t.includes('确认发布') || t.includes('提交');
});
if (b) { b.click(); return true; }
return false;
}""")
except Exception:
clicked = False
if not clicked:
await page.screenshot(path="/tmp/zhihu_publish_click_failed.png")
await ctx.close()
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=False,
status="error",
message="发布按钮不可点击",
error_code="PUBLISH_CLICK_FAILED",
screenshot="/tmp/zhihu_publish_click_failed.png",
elapsed_sec=time.time() - t0,
)
await asyncio.sleep(6)
body_now = await page.evaluate("document.body.innerText")
url_now = page.url
ok_tip = any(x in body_now for x in ("发布成功", "提交成功", "审核中", "已发布", "已提交"))
ok_redirect = ("creator/content" in url_now and "video/new" not in url_now)
await ctx.storage_state(path=str(COOKIE_FILE))
await ctx.close()
success = bool(ok_tip or ok_redirect or sdk.patch_hits.get("video_publish", 0) > 0)
status = "reviewing" if success else "error"
msg = (
f"发布完成F12摘要={capture.summary()} patch_hits={sdk.patch_hits}"
if success
else f"发布结果未确认F12摘要={capture.summary()} patch_hits={sdk.patch_hits}"
)
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=success,
status=status,
message=msg,
elapsed_sec=time.time() - t0,
)
except Exception as e:
return PublishResult(
platform="知乎",
video_path=video_path,
title=title,
success=False,
status="error",
message=f"异常: {str(e)[:120]}",
elapsed_sec=time.time() - t0,
)
async def main() -> int:
from publish_result import print_summary, save_results
ok, msg = verify_session_cookie()
if not ok:
print(f"[✗] {msg}")
return 1
print(f"[✓] {msg}")
videos = sorted(VIDEO_DIR.glob("*.mp4"))
if not videos:
print("[✗] 未找到视频")
return 1
results = []
for i, vp in enumerate(videos, 1):
title = VideoMeta.from_filename(vp.name).title("B站")
r = await publish_one(str(vp), title, i, len(videos))
results.append(r)
if r.status != "skipped":
save_results([r])
if i < len(videos):
await asyncio.sleep(3)
actual = [r for r in results if r.status != "skipped"]
print_summary(actual)
success_count = sum(1 for r in actual if r.success)
return 0 if success_count == len(actual) else 1
if __name__ == "__main__":
raise SystemExit(asyncio.run(main()))

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,192 @@
#!/usr/bin/env python3
"""知乎网页 CLIcheck / login / publish-one / publish-dir / f12-profile。"""
from __future__ import annotations
import argparse
import asyncio
import inspect
import sys
from datetime import datetime, timedelta
from pathlib import Path
SCRIPT_DIR = Path(__file__).parent
sys.path.insert(0, str(SCRIPT_DIR))
sys.path.insert(0, str(SCRIPT_DIR.parent.parent / "多平台分发" / "脚本"))
from publish_result import print_summary, save_results
from video_metadata import VideoMeta
from schedule_generator import generate_schedule
import zhihu_publish as zhihu
from zhihu_f12_profile import build_zhihu_profile, to_schedule_ts
def cmd_check(_args) -> int:
ok, msg = zhihu.verify_session_cookie()
print(msg, flush=True)
return 0 if ok else 1
def cmd_f12_profile(args) -> int:
scheduled = None
if args.schedule_at:
scheduled = datetime.fromisoformat(args.schedule_at.strip().replace("Z", "+00:00"))
endpoint_rules, inject_rules = build_zhihu_profile(scheduled)
print("=== 知乎 F12 抽象配置 ===")
for r in endpoint_rules:
print(f"- {r.name}: contains_any={r.contains_any}, methods={r.methods}")
print(f"注入规则数: {len(inject_rules)}")
if inject_rules:
print(f"定时注入 Unix: {to_schedule_ts(scheduled)}")
return 0
async def cmd_login(_args) -> int:
import zhihu_login
await zhihu_login.main()
return 0
async def cmd_publish_one(args) -> int:
ok, msg = zhihu.verify_session_cookie()
if not ok:
print(f"[✗] {msg}")
return 1
vp = Path(args.video).expanduser().resolve()
if not vp.is_file():
print(f"[✗] 文件不存在: {vp}")
return 1
title = VideoMeta.from_filename(vp.name).title("B站")
if args.immediate:
scheduled = None
elif args.schedule_at:
scheduled = datetime.fromisoformat(args.schedule_at.strip().replace("Z", "+00:00"))
else:
scheduled = datetime.now() + timedelta(minutes=args.schedule_in_min)
r = await zhihu.publish_one(
str(vp),
title,
idx=1,
total=1,
skip_dedup=args.no_dedup,
scheduled_time=scheduled,
headless=bool(getattr(args, "headless", False)),
allow_manual_risk=True,
allow_manual_entry=True,
)
if r.status != "skipped":
save_results([r])
print(r.log_line(), flush=True)
return 0 if r.success else 1
async def cmd_publish_dir(args) -> int:
ok, msg = zhihu.verify_session_cookie()
if not ok:
print(f"[✗] {msg}")
return 1
video_dir = Path(args.video_dir).expanduser()
videos = sorted(video_dir.glob("*.mp4"))
if args.offset:
videos = videos[args.offset:]
if args.limit > 0:
videos = videos[: args.limit]
if not videos:
print(f"[✗] 未找到视频: {video_dir}")
return 1
schedules = generate_schedule(
len(videos),
min_gap=args.min_gap,
max_gap=args.max_gap,
first_delay=args.start_after_min,
)
results = []
for i, (vp, sch) in enumerate(zip(videos, schedules), 1):
title = VideoMeta.from_filename(vp.name).title("B站")
scheduled = None if args.immediate else sch
r = await zhihu.publish_one(
str(vp),
title,
idx=i,
total=len(videos),
skip_dedup=args.no_dedup,
scheduled_time=scheduled,
headless=bool(getattr(args, "headless", False)),
allow_manual_risk=True,
allow_manual_entry=True,
)
results.append(r)
if r.status != "skipped":
save_results([r])
if i < len(videos):
await asyncio.sleep(args.gap_sec)
actual = [r for r in results if r.status != "skipped"]
print_summary(actual)
success_count = sum(1 for r in actual if r.success)
return 0 if success_count == len(actual) else 1
def build_parser() -> argparse.ArgumentParser:
p = argparse.ArgumentParser(description="知乎网页发布 CLI")
sub = p.add_subparsers(dest="cmd", required=True)
p_check = sub.add_parser("check", help="检查知乎 Cookie/API 登录态")
p_check.set_defaults(func=cmd_check)
p_login = sub.add_parser("login", help="打开浏览器手工登录知乎并保存 Cookie")
p_login.set_defaults(func=cmd_login)
p_f12 = sub.add_parser("f12-profile", help="输出知乎 F12 接口抽象配置")
p_f12.add_argument("--schedule-at", default="", help="ISO 时间,演示定时注入值")
p_f12.set_defaults(func=cmd_f12_profile)
p_one = sub.add_parser("publish-one", help="发布单条视频(支持定时)")
p_one.add_argument("--video", required=True)
p_one.add_argument("--schedule-in-min", type=int, default=15)
p_one.add_argument("--schedule-at", default="")
p_one.add_argument("--immediate", action="store_true")
p_one.add_argument(
"--headless",
action="store_true",
help="无界面模式(知乎上传在无头下易被限流或不上传,默认建议可视)",
)
p_one.add_argument("--no-dedup", action="store_true")
p_one.set_defaults(func=cmd_publish_one)
p_dir = sub.add_parser("publish-dir", help="批量发布目录内 mp4")
p_dir.add_argument("--video-dir", required=True)
p_dir.add_argument("--offset", type=int, default=0)
p_dir.add_argument("--limit", type=int, default=0)
p_dir.add_argument("--start-after-min", type=int, default=15)
p_dir.add_argument("--min-gap", type=int, default=10)
p_dir.add_argument("--max-gap", type=int, default=25)
p_dir.add_argument("--gap-sec", type=int, default=3)
p_dir.add_argument("--immediate", action="store_true")
p_dir.add_argument(
"--headless",
action="store_true",
help="无界面批量发布(默认可视,更利于知乎上传)",
)
p_dir.add_argument("--no-dedup", action="store_true")
p_dir.set_defaults(func=cmd_publish_dir)
return p
def main() -> int:
parser = build_parser()
args = parser.parse_args()
if inspect.iscoroutinefunction(args.func):
return asyncio.run(args.func(args))
return args.func(args)
if __name__ == "__main__":
raise SystemExit(main())

View File

@@ -1,10 +1,10 @@
---
name: Soul竖屏切片
description: Soul 派对视频→竖屏成片;高光**单主题完整**15min/条,每场约 812 条)、去穿插话题;封面底**约 10% 轻模糊**(非全糊)。字幕用**得意黑描边白字**(无底色)、纠错+关键词金黄高亮、逐字渐显;**表情贴片默认开启**流程裁剪检查→soul_enhance。MLX→visual_enhance v8 可选。
description: Soul 派对视频→竖屏成片;高光**单主题完整**15min/条,每场约 812 条)、去穿插话题;**前3秒两种风格**(优先:嘉宾第一人称处境+反差;备选:房主刺激性观点);**收尾丝滑**(片尾约 2.85s 不剪静音 + cta_ending 信息钩子引流下一条);**全链路强制简体中文+标点**(繁体自动转简)。封面底**约 10% 轻模糊**(非全糊)。字幕用**得意黑描边白字**(无底色)、纠错+关键词金黄高亮、逐字渐显;**表情贴片默认开启**流程裁剪检查→soul_enhance。
triggers: Soul竖屏切片、视频切片、热点切片、竖屏成片、派对切片、裁剪检查、重新截图、全画面标定、竖屏裁剪、全画面成片、letterbox、画面显示全、白边、飞书录屏、LTX、AI生成视频、Retake重剪、字幕优化、字幕同步、逐字字幕、上麦项目、月营收、融资、前三秒钩子
owner: 木叶
group: 木
version: "2.10"
version: "2.12"
updated: "2026-03-24"
---
@@ -28,16 +28,45 @@ updated: "2026-03-24"
---
## 二、视频结构:提问→回答 + 前3秒高光 + 去语助词
## 二、视频结构:前3秒钩子 + 提问→回答 + 丝滑收尾 + 去语助词
- **上麦案例项目与钱优先占满前3秒高于泛提问**
当片段里是**对方在讲自己的项目/业务**(做什么、服务谁、阶段),且口播中出现 **月收入/营收/融资/投资/到账/定价/预算/工资档位/烧多少钱** 等**可量化钱**或**项目身份**信息时:`hook_3sec` **优先**写成一句 **「项目一句话 + 钱/阶段信号」**优质上麦案例逻辑让用户前3秒知道「这人是谁、项目多硬、钱的故事是什么」。
**在此之后**再考虑「主持人提问」作 hook若前3秒用项目+钱已足够抓人,可将 `question` 保留为片中互动句,**不必**把泛提问顶掉项目钩子。仅当片段**没有**清晰项目/钱信息时,才回到「有提问用提问、无提问用金句」的旧规则。
- **每个话题前均优先提问→回答(与上条叠加时的裁决)**:默认先看有没有人提问;**但若本段核心是对方分享项目**,则 **hook = 项目+钱摘要** 优先,**正片**再展开主持人追问与回答禁止前3秒与「对方在讲的事」脱节。
- **成片链路**前3秒展示问题或 hook→ 正片展开 → **整片去除语助词**(提问与回答部分均由 soul_enhance 清理)。
- **节奏与高光**:竖屏段内全程**高光清晰、节奏清楚**(剪去拖沓静音与跑题可在 enhance 链路的静音裁剪中体现;**话题边界以 highlights 起止为准,剪辑阶段就要裁干净**)。
- **单主题、完整、有趣****一条成片只服务一个主题**;口播里若**临时插进其他话题**,在 `highlights` 对应时间段上**剪掉无关段**(或拆成另一条高光),保证**有头有尾、逻辑闭环**;选题要**有传播点**(反差、数字、痛点、金句),忌又长又平。
- **高光**:按「约 3 秒开场」剪,每段 **30 秒5 分钟≤300 秒)**;若有提问须填 `question`,且 `hook_3sec` 与之一致或同气质。
### 2.1 前3秒钩子两种风格v2.12 规则,必须二选一)
`hook_3sec` 是封面文字 + 视频最开头约3秒要展示的内容**必须先吸住眼球**。两种风格按优先级选:
**风格一(优先):以「参与者(非房主)的问题或处境描述」开头**
- 适用场景:片段里有嘉宾/参与者讲自己的项目、遭遇、问题、处境
- 写法:**第一人称「我」**,用嘉宾口吻写出处境+反差/数字/出乎意料的结果
- 例:「我入职第五天就被老板炒掉了,但后来我把客户全带走了。」
-「我00后逃婚之后去卖核桃就这个名字让人一听就记住了。」
- 核心:让观众代入嘉宾,产生「这人经历了什么?」的好奇心
**风格二(备选):以「房主(卡若)的刺激性观点/金句」开头**
- 适用场景:片段以卡若主导分析、复盘、观点输出为主,嘉宾没有强烈反差处境
- 写法:**直接抛出反常识/颠覆认知/带数字的判断句**,不说「我认为」
- 例:「电销这条路已经死了,砸再多人进去也没用。」
-「AI时代用对工具的人和不用的人差距已经不是十倍了是一万倍。」
- 核心:让观众觉得「这话说得够猛,想听下去」
**判断规则**:片段里嘉宾/上麦者有自述处境 → 用风格一;以卡若观点为主驱动 → 用风格二。有可量化钱/项目数据时风格一里必须带上「四个月赚了五十万」「月入X万」等
### 2.2 收尾规则v2.12 强制)
- **最后几秒必须有人声**`soul_enhance` 已设 `SILENCE_TAIL_PRESERVE_SEC=2.85`,片尾静音区不裁除。
- **`cta_ending` 要丝滑引流下一条**:不能写成纯广告,要有**信息钩子**(下一条讲什么)或**认知收口**(一句总结)+ **轻引导**(关注/下一条/接着看)。
- 好的收尾范例:「七年复购靠的就是两个字,下一条讲更狠的销售打法。」
- 好的收尾范例:「圈子越小,靠谱两个字越值钱。关注我,下一场更精彩。」
- **禁止**:硬广式「扫码加微信领资料」风格的结尾放在正片字幕里(可放 CTA 底条)。
### 2.3 其他结构规则
- **成片链路**前3秒展示 hook → 正片展开提问+回答 → **整片去语助词** → 丝滑收尾。
- **节奏与高光**:话题边界以 highlights 起止为准,剪辑阶段就要裁干净。
- **单主题、完整、有趣**:一条成片只服务一个主题;临时插进的跑题段剪掉或拆成另一条高光。
- **每段时长**30秒5分钟≤300秒`hook_3sec``question` 气质一致。
- **全文简体**`hook_3sec``question``cta_ending``title` 全部用简体中文写,有标点符号,不出现繁体。
详见:`参考资料/视频结构_提问回答与高光.md``参考资料/高光识别提示词.md`
@@ -63,6 +92,11 @@ updated: "2026-03-24"
| **关键词** | 金黄 `(255,230,80)` 高亮,同字号同基线 |
| **背景** | `bg_color=None`,不绘制半透明底条 |
### 全程简体中文 + 片尾有声v2.11 强制)
- **语言**:从 `transcript.srt` 解析、逐词路径、标点补强、封面 `hook_3sec` / `question` / 主标题引用、片尾 `cta_ending` 等,**一律经 `_to_simplified`OpenCC t2s + 兜底映射)**,成片与收录进烧录层的文案**不出现繁体残留**`highlights.json` 里仍可手写繁体,渲染时转简)。
- **片尾完整性**`soul_enhance.py` 在去静音前对 `silencedetect` 结果做 **`filter_silences_keep_tail_audio`**:最后 **`SILENCE_TAIL_PRESERVE_SEC`(默认约 2.85s** 内的静音**不参与切除**,避免「最后几秒被剪成完全无声」。若原片结尾本身无对白,仍可能偏静,需在剪辑/高光时段上保证收尾句落在片尾窗内。
### 贴片库与表情库v2.6→v2.10 默认开启)
成片**默认开启**表情贴片(`--stickers` 默认 True关闭时加 `--no-stickers`

View File

@@ -54,12 +54,24 @@ FONT_SMILEY = str(FONTS_DIR / "SmileySans-Oblique.ttf")
FONT_HEAVY = str(FONTS_DIR / "SourceHanSansSC-Heavy.otf")
FONT_BOLD = str(FONTS_DIR / "SourceHanSansSC-Bold.otf")
FALLBACK_FONT = "/System/Library/Fonts/STHeiti Medium.ttc"
# 成片字幕macOS 系统中文黑体(苹方 → 冬青黑体 → 华文黑体)
_FONT_APPLE_SUBTITLE_CANDIDATES = (
"/System/Library/Fonts/PingFang.ttc",
"/System/Library/Fonts/Hiragino Sans GB.ttc",
"/System/Library/Fonts/STHeiti Medium.ttc",
)
FONT_APPLE_SUBTITLE = next(
(p for p in _FONT_APPLE_SUBTITLE_CANDIDATES if os.path.exists(p)),
FONT_BOLD,
)
# 视频增强参数
SPEED_FACTOR = 1.10 # 加速10%
SILENCE_THRESHOLD = -38 # 静音阈值(dB),略放宽以多检出停顿
SILENCE_MIN_DURATION = 0.32 # 短于此前值,中间「断点」切得更干净
SILENCE_TRIM_MARGIN = 0.06 # 保留段与静音接缝留白(秒),略小则多剪
# 片尾若干秒不参与「去静音」切除,避免成片最后几秒被剪成完全无声(需保留收尾人声)
SILENCE_TAIL_PRESERVE_SEC = 2.85
# Soul 竖屏裁剪(与 soul_vertical_crop 一致,成片直出用)
# 默认与 analyze_feishu_ui_crop.py20% 帧、扩边到桌面白 + 横向 scale典型输出一致他场次请先跑分析再 --crop-vf。
@@ -120,14 +132,14 @@ def build_typewriter_subtitle_images(
out_w,
out_h,
subtitle_overlay_start,
min_step_sec=0.05,
min_step_sec=0.03,
max_steps_per_line=28,
):
"""
词/逐字渐显:
- 若字幕带 word_timeswhisper word-level SRT按词的真实开始时间逐词追加与人声严格同步
- 否则按字符数等分句子时长(兜底)。
subtitle_overlay_start最早显示字幕的时间轴须 ≥ 封面结束(默认与封面紧接,无额外留白)
逐字渐显(跟语速)
- 若字幕带 word_times:每个 ASR 词的时间段内再按字权重切分,一字一帧,整体对齐口播
- 否则整句时长按字权重逐字切分(兜底)。
subtitle_overlay_start最早显示字幕的时间轴须 ≥ 封面结束。
"""
sub_images = []
img_idx = 0
@@ -140,29 +152,58 @@ def build_typewriter_subtitle_images(
word_times = sub.get("word_times")
# ── 路径 Aword-level 时间轴(精准逐词) ────────────────────────────
if word_times and len(word_times) > 1:
# ── 路径 Aword-level:词边界内再按字拆时间 ─────────────────────────
if word_times and len(word_times) >= 1:
accumulated = ""
for wi, wt in enumerate(word_times):
w_start = max(float(wt["start"]), subtitle_overlay_start)
if wi + 1 < len(word_times):
w_end = float(word_times[wi + 1]["start"])
else:
w_end = e
w_end = max(w_start + min_step_sec, w_end)
accumulated += wt["word"]
clean = _normalize_subtitle_text_strict(
improve_subtitle_punctuation(_improve_subtitle_text(accumulated))
)
if not (clean or "").strip():
raw_w = _to_simplified((wt.get("word") or "").strip())
if not raw_w:
continue
img_path = os.path.join(temp_dir, f"sub_{img_idx:04d}.png")
create_subtitle_image(clean, out_w, out_h, img_path)
sub_images.append({"path": img_path, "start": w_start, "end": w_end})
img_idx += 1
word_t0 = max(float(wt["start"]), subtitle_overlay_start, s)
if wi + 1 < len(word_times):
word_t1 = float(word_times[wi + 1]["start"])
else:
word_t1 = e
we = wt.get("end")
if we is not None:
we = float(we)
if we > word_t0 + 0.02:
word_t1 = min(word_t1, max(we, word_t0 + min_step_sec))
word_t1 = min(word_t1, e)
word_t1 = max(word_t1, word_t0 + min_step_sec)
dur_w = word_t1 - word_t0
chars_w = list(raw_w)
if not chars_w:
continue
weights = [_subtitle_char_weight(c) for c in chars_w]
total_ww = sum(max(w, 0.01) for w in weights)
prev_tw = word_t0
for ci, ch in enumerate(chars_w):
accumulated += ch
frac_end = (
sum(max(weights[j], 0.01) for j in range(ci + 1)) / total_ww
if total_ww > 0
else (ci + 1) / len(chars_w)
)
t1 = word_t0 + dur_w * frac_end
if ci == len(chars_w) - 1:
t1 = word_t1
t0 = prev_tw
t1 = max(t1, t0 + min_step_sec * 0.25)
clean = _normalize_subtitle_text_strict(
improve_subtitle_punctuation(_improve_subtitle_text(accumulated))
)
if not (clean or "").strip():
prev_tw = t1
continue
img_path = os.path.join(temp_dir, f"sub_{img_idx:04d}.png")
create_subtitle_image(clean, out_w, out_h, img_path)
sub_images.append({"path": img_path, "start": t0, "end": t1})
img_idx += 1
prev_tw = t1
continue
# ── 路径 B按字符数等分(兜底) ─────────────────────────────────────
# ── 路径 B无词轴:整句按字权重切时间(一字一帧)────────────────────
safe_text = _normalize_subtitle_text_strict(
improve_subtitle_punctuation(_improve_subtitle_text(sub["text"]))
)
@@ -177,29 +218,19 @@ def build_typewriter_subtitle_images(
sub_images.append({"path": img_path, "start": s, "end": e})
img_idx += 1
continue
num_steps = min(max_steps_per_line, n)
num_steps = max(2, num_steps)
step_dur = dur / num_steps
if step_dur < min_step_sec:
num_steps = max(2, int(dur / min_step_sec))
step_dur = dur / num_steps
weights = [_subtitle_char_weight(ch) for ch in chars]
total_w = sum(max(w, 0.01) for w in weights)
cumulative = []
acc_w = 0.0
for w in weights:
acc_w += max(w, 0.01)
cumulative.append(acc_w)
prev_t = s
for step in range(1, num_steps + 1):
end_char = max(1, int(round(n * step / num_steps)))
end_char = min(end_char, n)
partial = "".join(chars[:end_char])
ratio_end = cumulative[end_char - 1] / total_w if total_w > 0 else (step / num_steps)
for ci in range(n):
partial = "".join(chars[: ci + 1])
frac_end = (
sum(max(weights[j], 0.01) for j in range(ci + 1)) / total_w
if total_w > 0
else (ci + 1) / n
)
t1 = s + dur * frac_end if ci < n - 1 else e
t0 = prev_t
t1 = s + dur * ratio_end if step < num_steps else e
if t1 <= t0 + 0.001:
continue
t1 = max(t1, t0 + min_step_sec * 0.25)
partial = _normalize_subtitle_text_strict(partial)
if not partial:
continue
@@ -413,20 +444,27 @@ STYLE = {
'vertical_fill': (252, 252, 250),
},
'subtitle': {
'font_size': 46,
'font_path': FONT_SMILEY,
'color': (255, 255, 255),
'outline_color': (10, 10, 10),
'outline_width': 4,
'keyword_color': (255, 230, 80),
'keyword_outline': (10, 10, 10),
'font_size': 48,
'font_path': FONT_APPLE_SUBTITLE,
'color': (252, 252, 254),
'outline_color': (0, 0, 0),
'outline_width': 0,
'keyword_color': (255, 220, 120),
'keyword_outline': (40, 28, 0),
'keyword_outline_width': 0,
'keyword_size_add': 0,
'bg_color': None,
# 大号「毛玻璃感」底条:竖条模式下横向拉满(留边),内边距加大;无底条描边
'bg_color': (24, 26, 34, 228),
'border_color': None,
'border_width': 0,
'gloss_alpha': 0,
'shadow_alpha': 0,
'margin_bottom': 70,
'gloss_alpha': 26,
'shadow_alpha': 52,
'bg_padding_v': 28,
'bg_padding_h': 22,
'bg_full_strip': True,
'bg_side_margin': 12,
'bg_corner_radius': 20,
'margin_bottom': 72,
}
}
@@ -456,21 +494,36 @@ def get_font(font_path, size):
continue
return ImageFont.load_default()
def get_font_subtitle(size):
"""成片字幕专用:固定走 macOS 苹方/冬青/华文黑,再回退思源,避免与通用 get_font 混链。"""
for path in list(_FONT_APPLE_SUBTITLE_CANDIDATES) + [FONT_BOLD, FALLBACK_FONT]:
if path and os.path.exists(path):
try:
return ImageFont.truetype(path, size)
except Exception:
continue
return ImageFont.load_default()
def get_text_size(draw, text, font):
"""获取文字尺寸"""
bbox = draw.textbbox((0, 0), text, font=font)
return bbox[2] - bbox[0], bbox[3] - bbox[1]
def draw_text_with_outline(draw, pos, text, font, color, outline_color, outline_width):
"""绘制带描边的文字"""
"""绘制带描边的文字outline_width<=0 时不描边(无字框)。"""
x, y = pos
if not text:
return
ow = int(outline_width or 0)
if ow <= 0:
draw.text((x, y), text, font=font, fill=color)
return
import math
# 8方向描边
for angle in range(0, 360, 45):
dx = int(outline_width * math.cos(math.radians(angle)))
dy = int(outline_width * math.sin(math.radians(angle)))
dx = int(ow * math.cos(math.radians(angle)))
dy = int(ow * math.sin(math.radians(angle)))
draw.text((x + dx, y + dy), text, font=font, fill=outline_color)
# 主体
draw.text((x, y), text, font=font, fill=color)
@@ -537,16 +590,16 @@ def _limit_cover_title_cjk(text: str, max_cjk: int = COVER_TITLE_MAX_CJK) -> str
def pick_cover_hook_text(highlight_info: dict) -> str:
"""高光成片封面:优先 3 秒钩子句(抓眼球),其次核心问句,最后才用短标题。"""
"""高光成片封面:优先 3 秒钩子句(抓眼球),其次核心问句,最后才用短标题。全程简体。"""
if not highlight_info:
return ""
h = (highlight_info.get("hook_3sec") or "").strip()
h = _to_simplified((highlight_info.get("hook_3sec") or "").strip())
if h:
return h
q = highlight_info.get("question")
if q is not None and str(q).strip():
return str(q).strip()
return (highlight_info.get("title") or "").strip()
return _to_simplified(str(q).strip())
return _to_simplified((highlight_info.get("title") or "").strip())
def _limit_cover_hook_display(text: str, max_cjk: int = COVER_HOOK_MAX_CJK) -> str:
@@ -783,13 +836,14 @@ def improve_subtitle_punctuation(text: str) -> str:
2. 感叹、强调语气加感叹号
3. 普通陈述句末加句号(如果长度 >= 5
4. 修正多余标点
全程先走繁体→简体(与成片规范一致)。
"""
t = text.strip()
t = _to_simplified((text or "").strip())
if not t:
return t
# 末尾已有标点则不重复加
if t and t[-1] in ',。?!,.:!?':
return apply_platform_safety(_collapse_cjk_interchar_spaces(t))
return apply_platform_safety(_collapse_cjk_interchar_spaces(_to_simplified(t)))
# 疑问词检测
question_words = ('', '', '', '', '', '什么', '怎么', '为什么',
'', '哪里', '', '', '多少', '是否', '可以吗', '对吗')
@@ -804,7 +858,7 @@ def improve_subtitle_punctuation(text: str) -> str:
t = t + ''
elif len(t) >= 5:
t = t + ''
return apply_platform_safety(_collapse_cjk_interchar_spaces(t))
return apply_platform_safety(_collapse_cjk_interchar_spaces(_to_simplified(t)))
def _detect_clip_pts_offset(clip_path: str) -> float:
"""探测切片实际起始 PTS用于补偿 -ss input seeking 的关键帧偏移。
@@ -925,7 +979,7 @@ def parse_srt_for_clip(srt_path, start_sec, end_sec, delay_sec=None):
for match in matches:
ws = time_to_sec(match[1])
we = time_to_sec(match[2])
text = match[3].strip()
text = _to_simplified(match[3].strip())
if _is_noise_line(text):
continue
if we > start_sec and ws < end_sec + 2:
@@ -981,7 +1035,7 @@ def parse_srt_for_clip(srt_path, start_sec, end_sec, delay_sec=None):
for match in matches:
sub_start = time_to_sec(match[1])
sub_end = time_to_sec(match[2])
text = match[3].strip()
text = _to_simplified(match[3].strip())
# 噪声行提前过滤
if _is_noise_line(text):
@@ -1464,6 +1518,8 @@ def create_cover_image(
def create_subtitle_image(text, width, height, output_path):
"""创建字幕图片(纠错+关键词加大加亮)。竖条画布时居中;全幅横版时偏下居中(为 --vertical-fit-full"""
style = STYLE['subtitle']
# 强制简体:字幕烧录最后一关,无论上游路径如何,所有繁体一律转简体
text = _to_simplified(text or "")
# 成片前再跑一遍纠错/标点,与 parse 阶段互补(逐字帧也走本函数)
text = _normalize_subtitle_text_strict(
improve_subtitle_punctuation(_improve_subtitle_text(text))
@@ -1477,21 +1533,19 @@ def create_subtitle_image(text, width, height, output_path):
draw = ImageDraw.Draw(img)
base_size = style['font_size']
_font_path = style.get('font_path') or FONT_BOLD
_kw_font_path = style.get('font_path') or FONT_HEAVY
if _is_vertical_strip_canvas(width, height):
base_size = min(base_size, 38)
base_size = min(base_size, 42)
elif height == 1080 and width >= 1280:
base_size = min(max(base_size, 46), 56)
font = get_font(_font_path, base_size)
font = get_font_subtitle(base_size)
text_w, text_h = get_text_size(draw, text, font)
margin_x = 120 if width >= 1280 else 80
while text_w > width - margin_x and base_size > 24:
while text_w > width - margin_x and base_size > 22:
base_size -= 2
font = get_font(_font_path, base_size)
font = get_font_subtitle(base_size)
text_w, text_h = get_text_size(draw, text, font)
kw_size = base_size + style.get('keyword_size_add', 0)
kw_font = get_font(_kw_font_path, kw_size) if kw_size != base_size else font
kw_font = get_font_subtitle(kw_size) if kw_size != base_size else font
base_x = (width - text_w) // 2
if _is_vertical_strip_canvas(width, height):
@@ -1508,16 +1562,21 @@ def create_subtitle_image(text, width, height, output_path):
# 背景条bg_color 为 None 时跳过,纯描边模式)
fill = style.get('bg_color')
if fill:
padding = 15
pad_v = int(style.get('bg_padding_v', 20))
pad_h = int(style.get('bg_padding_h', 18))
bg_rect = [
max(0, base_x - padding - 10),
max(0, base_y - padding),
min(width, base_x + text_w + padding + 10),
min(height, base_y + text_h + padding)
max(0, base_x - pad_h),
max(0, base_y - pad_v),
min(width, base_x + text_w + pad_h),
min(height, base_y + text_h + pad_v),
]
if style.get('bg_full_strip') and _is_vertical_strip_canvas(width, height):
sm = int(style.get('bg_side_margin', 12))
bg_rect[0] = sm
bg_rect[2] = width - sm
bg_layer = Image.new('RGBA', (width, height), (0, 0, 0, 0))
bg_draw = ImageDraw.Draw(bg_layer)
r = 14
r = int(style.get('bg_corner_radius', 14))
outline = style.get('border_color')
ow = int(style.get('border_width', 0) or 0)
if outline and ow > 0:
@@ -1566,10 +1625,10 @@ def create_subtitle_image(text, width, height, output_path):
break
if in_keyword:
# 关键词:同色阶描边 + 亮金黄字,字号与正文一致(单行
# 关键词:亮金黄字;描边宽度用 keyword_outline_width默认与正文一致可为 0 无边框
keyword_text = text[char_idx:keyword_end]
kw_outline = style.get('keyword_outline', (60, 40, 0))
kw_ow = style.get('outline_width', 3)
kw_ow = int(style.get('keyword_outline_width', style.get('outline_width', 0)) or 0)
draw_text_with_outline(
draw, (current_x, base_y), keyword_text, kw_font,
style['keyword_color'],
@@ -1605,7 +1664,12 @@ def append_cta_ending_subtitle(
duration,
subtitle_overlay_start,
):
"""片尾 CTA高光 JSON 的 cta_ending固定显示在成片末尾若干秒。"""
"""片尾 CTA叠加在最后一条真实字幕的结尾处(有声段),不延伸到静音区域。
锚点:取 sub_images 里已有字幕的最大 end 时间(即最后一条语音字幕结束时间)作为
CTA 的 end而不是视频总时长 duration。这样 CTA 永远出现在有声音的帧上,
不会产生「字幕悬在无声段」的空洞感。
"""
cta = (highlight_info.get("cta_ending") or "").strip()
if not cta:
return sub_images
@@ -1613,15 +1677,27 @@ def append_cta_ending_subtitle(
if not cta:
return sub_images
dur = float(duration)
if dur < CTA_END_MIN_SEC + subtitle_overlay_start * 0.5:
# 找最后一条真实字幕的结尾时间作为 CTA 的锚点
real_subs = [s for s in sub_images if "sub_cta_ending" not in s.get("path", "")]
if real_subs:
last_sub_end = max(float(s["end"]) for s in real_subs)
# CTA 结束时间 = 最后一条字幕结束,不超过视频时长
anchor_end = min(last_sub_end, dur)
else:
anchor_end = dur
if anchor_end < CTA_END_MIN_SEC + float(subtitle_overlay_start) * 0.5:
return sub_images
span = min(CTA_END_MAX_SEC, max(CTA_END_MIN_SEC, dur * 0.09))
cta_start = max(float(subtitle_overlay_start), dur - span)
if cta_start >= dur - 0.15:
cta_start = max(0.0, dur - CTA_END_MIN_SEC)
span = min(CTA_END_MAX_SEC, max(CTA_END_MIN_SEC, anchor_end * 0.08))
cta_start = max(float(subtitle_overlay_start), anchor_end - span)
if cta_start >= anchor_end - 0.15:
cta_start = max(0.0, anchor_end - CTA_END_MIN_SEC)
img_path = os.path.join(temp_dir, "sub_cta_ending.png")
create_subtitle_image(cta, out_w, out_h, img_path)
sub_images.append({"path": img_path, "start": cta_start, "end": dur})
sub_images.append({"path": img_path, "start": cta_start, "end": anchor_end})
sub_images.sort(key=lambda x: (float(x["start"]), float(x["end"])))
return sub_images
@@ -1655,6 +1731,33 @@ def detect_silence(video_path, threshold=-40, min_duration=0.5):
return silences
def filter_silences_keep_tail_audio(silences, duration, tail_sec=None):
"""片尾 tail_sec 内不把静音段计入「可切除」区间,避免成片最后几秒被剪成完全无声。
silencedetect 可能把收尾人声误判为静音;或长静音延伸到片尾时,原先会把尾段整块剪掉。
本函数在 [duration-tail_sec, duration] 内丢弃/截断静音区间,使 kept_segments 保留该段原音轨。
"""
if tail_sec is None:
tail_sec = float(SILENCE_TAIL_PRESERVE_SEC)
duration = float(duration)
if duration <= 0 or tail_sec <= 0:
return silences
cut = max(0.0, duration - tail_sec)
out = []
for s, e in sorted(silences):
s, e = float(s), float(e)
if s >= cut:
continue
if e <= cut:
out.append((s, e))
else:
e2 = min(e, cut)
if e2 - s > 0.08:
out.append((s, e2))
return out
def create_silence_filter(silences, duration, margin=0.1):
"""创建去除静音的filter表达式"""
if not silences:
@@ -1956,6 +2059,7 @@ def enhance_clip(clip_path, output_path, highlight_info, temp_dir, transcript_pa
# 2. 去静音trim+concat 重编码,并 remap 字幕时间轴(此前仅检测未切除,成片仍带长停顿)
silences = detect_silence(clip_path, SILENCE_THRESHOLD, SILENCE_MIN_DURATION)
silences = filter_silences_keep_tail_audio(silences, original_duration)
kept = kept_segments_from_silences(silences, original_duration, margin=SILENCE_TRIM_MARGIN)
removed_total = original_duration - sum(e - s for s, e in kept)
if trim_silence and removed_total >= MIN_SILENCE_TRIM_TOTAL_SEC:
@@ -1966,7 +2070,8 @@ def enhance_clip(clip_path, output_path, highlight_info, temp_dir, transcript_pa
if subtitles:
remap_subtitles_after_trim(subtitles, kept)
print(
f" ✓ 去静音:约减 {removed_total:.1f}s → 基长 {duration:.1f}s(检出 {len(silences)} 段)",
f" ✓ 去静音:约减 {removed_total:.1f}s → 基长 {duration:.1f}s"
f"(检出 {len(silences)} 段,片尾 {SILENCE_TAIL_PRESERVE_SEC:.1f}s 不剪静音保收尾)",
flush=True,
)
else:
@@ -1974,7 +2079,8 @@ def enhance_clip(clip_path, output_path, highlight_info, temp_dir, transcript_pa
duration = original_duration
else:
print(
f" ✓ 静音 {len(silences)} 段,可剪 {removed_total:.2f}s<{MIN_SILENCE_TRIM_TOTAL_SEC}s 不剪",
f" ✓ 静音 {len(silences)} 段,可剪 {removed_total:.2f}s<{MIN_SILENCE_TRIM_TOTAL_SEC}s 不剪"
f"片尾 {SILENCE_TAIL_PRESERVE_SEC:.1f}s 不剪静音)",
flush=True,
)

View File

@@ -6,11 +6,11 @@ description: >
triggers: 视频号发布、发布到视频号、视频号登录、视频号上传、微信视频号
owner: 木叶
group: 木
version: "3.1"
updated: "2026-03-23"
version: "3.2"
updated: "2026-03-24"
---
# 视频号发布 Skillv3.0
# 视频号发布 Skillv3.2
> **核心能力**:发布链路纯 **httpx****登录**阶段用 Playwright默认持久化 Chromium减少重复扫码
> **实测**120 场 12 条切片全部 API 直发成功,单条 5~9 秒。
@@ -96,8 +96,12 @@ cd /Users/karuo/Documents/个人/卡若AI/03_卡木/木叶_视频内容
# 1. 首次或 Cookie 过期:微信扫码登录
python3 channels_login.py
# 2. 纯 API 批量发布
python3 channels_api_publish.py
# 2. 批量发布10-25 分钟真实间隔)
python3 channels_web_cli.py publish-dir \
--video-dir "<视频目录>" \
--min-gap 10 --max-gap 25 \
--start-after-min 5 --interval-min 15 \
--skip-list-verify --max-attempts 5
```
---
@@ -150,3 +154,164 @@ python3 channels_api_publish.py
- 短视频发布:基于「视频号助手网页」的 **逆向协议**`helper_upload_params` + DFS 分片上传 + `post_create`),封装在 `channels_api_publish.py` 中,供你在本机一键调用;协议细节与风险说明见同目录脚本内注释与《视频号与腾讯相关 API 整理》。
- 官方 API若未来微信开放短视频上传/发布接口,可在本 Skill 中新增「官方 API 模式」,与当前逆向模式并存;直播/橱窗/留资等场景建议在单独的官方 API Skill 中按业务拆分(如「视频号直播数据看板」「视频号橱窗管理」「视频号留资同步」等)。
---
## 七、当前默认执行规范2026-03-24 更新)
- **强制无界面**`channels_web_cli.py` 默认强制 `headless=True`,即使传 `--show` 也忽略(仅打印提示)。
- **定时来源唯一**:计划发布时间只走「计划发布控件 + post_create 注入」,**不再写入描述文本**。
- **间隔策略**:默认 `--min-gap 10 --max-gap 25`,即每条发布定时间隔在 **10~25 分钟**
- **真实提交间隔**:每条视频在排期时间前 2 分钟才开始上传提交(`cmd_publish_dir``asyncio.sleep` 等到目标时刻),避免密集提交触发平台"同质化内容"检测。
- **发布判定**`post_create/post_publish` 命中 + `errCode=0` 作为成功主判据(可选列表核验)。
---
## 八、实战接口与参数清单F12 抓包口径)
> 抓包文件:`/tmp/channels_netlogs/*.jsonl`(每条视频单独一份)。
### 8.1 关键接口(发布链路)
1) 获取上传参数
- `POST /cgi-bin/mmfinderassistant-bin/helper/helper_upload_params`
- 关键返回:`authKey``uin`、上传域参数
2) 分片上传(腾讯 DFS
- `PUT https://finderassistance*.video.qq.com/applyuploaddfs`
- `PUT https://finderassistance*.video.qq.com/uploadpartdfs?PartNumber=N&UploadID=...`
- `POST https://finderassistance*.video.qq.com/completepartuploaddfs?UploadID=...`
3) 正式发布
- `POST /micro/content/cgi-bin/mmfinderassistant-bin/post/post_create`
- 关键 URL 参数:`_aid``_rid``_pageUrl`
4) 发布后核验(可选)
- `POST /cgi-bin/mmfinderassistant-bin/post/post_list`
5) 已发布内容删除(重发前清理)
- `POST /cgi-bin/mmfinderassistant-bin/post/post_delete`
- 最小参数:`{"objectId":"export/..."}`
- 实测:`errCode=0` 即删除成功。
### 8.2 关键请求头(发布必须)
- `cookie`:来自 `channels_storage_state.json`(登录态)
- `finger-print-device-id`设备指纹localStorage
- `x-wechat-uin`:来自 upload params 的 `uin`
- `content-type: application/json`
### 8.3 关键 payload 字段post_create
- `mode`(发布模式)
- `postFlag`
- `reqScene`
- `member`
- `report`
- 文案/话题字段(由描述生成)
- 定时字段(由注入逻辑写入 `scheduled_time` / `create_time` 等)
---
## 九、全流程问题与经验总结2026-03-24 批量重发 78 场)
### 9.1 典型问题
1) **动作成功但不出发布回执**
- 现象:页面动作全通过,却没有 `post_create`
- 根因:拦截弹窗("将此次编辑保留/不保存")吞掉最终提交。
2) **原创弹窗确认后仍未真正发布**
- 现象:点了"声明原创",仍未触发发布接口。
- 根因:部分页面流转下,声明按钮只关闭弹窗,不等于最终提交。
3) **截图导致流程中断**
- 现象:`TargetClosedError`
- 根因:页面切换瞬间截图异常抛错。
4) **密集提交触发"同质化内容"警告**
- 现象:所有视频在 3-5 分钟内全部提交完毕,微信视频号发来"作品优化建议"通知,提示"多次发表情景、文案、元素等近似的同质化内容"。
- 根因:虽然每条设了不同的定时发布时间,但实际上传提交时间全挤在一起,平台检测的是提交时间而非定时时间。
- 修复:`cmd_publish_dir` 改为每条在排期时间前 2 分钟才开始上传。
### 9.2 已落地修复
- 增加"拦截弹窗清理"逻辑,优先点击"不保存"。
- 在"声明原创"后强制再点一次"发表"。
- 若未捕获发布回执,触发"自愈补点击"(声明原创+发表)。
- 截图改为容错模式,截图失败不终止主流程。
- 增加动作级检查点:每一步都记录状态并落图。
- 增加网络抓包落盘:请求/响应/参数全量记录。
- **真实提交间隔**:等到排期时间前 2 分钟才上传(避免密集提交被平台检测)。
- 间隔默认值改为 10~25 分钟(之前 10~120 过宽导致跨度过长)。
### 9.3 运行建议(稳定优先)
- 批量命令:
```bash
python3 channels_web_cli.py publish-dir \
--video-dir "<目录>" \
--min-gap 10 --max-gap 25 \
--start-after-min 5 --interval-min 15 \
--skip-list-verify --max-attempts 5
```
- 遇到 `Cookie 过期`:先 `python3 channels_login.py` 再续跑。
- 若后台再次改版:先看 `/tmp/channels_netlogs/*.jsonl` 中是否仍有 `post_create errCode=0`。
### 9.4 间隔策略演进(三版迭代)
| 版本 | 排期间隔 | 实际提交 | 结果 |
|------|---------|---------|------|
| v1 | 参数被忽略走smart默认 | 连续提交10秒间隔 | 间隔不受控 |
| v2 | 10-120分钟已修 | 连续提交10秒间隔 | 微信"同质化"警告 |
| v3当前 | 10-25分钟 | 等到排期前2分钟才提交 | 正常运行 |
**关键教训**:视频号平台检测的是**实际提交/上传时间**,不是定时发布时间。排期只控制何时公开,但密集上传本身就会触发同质化检测。
## 十、定时失效根因与最终修复2026-03-24
### 10.1 根因结论(实测)
- 仅注入 `postTimingInfo/postInfo.postTime` 不足以保证视频号按定时发布。
- **视频号实际生效字段是 `effectiveTime`unix 秒)**。
- 当 `post_create` 请求体里 `effectiveTime` 未按目标时间设置时,会表现为“看似定时、实际立即发布”。
### 10.2 最终修复
1. 在 `channels_publish.py` 的 `_inject_timing_payload()` 中强制注入:
- `effectiveTime = schedule_ts`
- `postTimingInfo = { timing: 1, postTime: schedule_ts }`(兼容保留)
2. 发布后新增强校验日志:
- `定时注入命中次数`
- `定时字段写入命中`
3. 使用 `post_list` 回查每条内容的 `effectiveTime` 与目标发布时间是否一致。
### 10.3 本次78场复发后台核验结果
- 10/10 成功发布。
- 10/10 在 `post_list` 可见 `effectiveTime`(均为未来时间点)。
- 示例:
- `AI时代用对工具` → `effectiveTime=2026-03-24 18:34:31`
- `这个客户从2018年一直跟我下单` → `effectiveTime=2026-03-24 21:00:29`
### 10.4 F12抓包接口清单本轮实测
- `POST /cgi-bin/mmfinderassistant-bin/helper/helper_upload_params`
- `POST /micro/content/cgi-bin/mmfinderassistant-bin/post/get-finder-post-trace-key`
- `POST /micro/content/cgi-bin/mmfinderassistant-bin/post/post_clip_video`
- `POST /micro/content/cgi-bin/mmfinderassistant-bin/post/post_clip_video_result`
- `POST /micro/content/cgi-bin/mmfinderassistant-bin/post/post_create` (定时核心)
- `POST /micro/content/cgi-bin/mmfinderassistant-bin/post/post_list`
- `POST /micro/content/cgi-bin/mmfinderassistant-bin/post/check_finder_comm_face`
- `POST /micro/content/cgi-bin/mmfinderassistant-bin/helper/helper_search_location`
- `POST /cgi-bin/mmfinderassistant-bin/post/post_delete`
### 10.5 定时成功判定标准(以后固定)
必须同时满足:
1. `post_create` 返回 `errCode=0`
2. 注入日志显示 `定时字段写入命中 >= 1`
3. `post_list` 中对应内容存在且 `effectiveTime` 为目标时间(允许秒级偏差)
任一不满足即判失败,不允许继续批量发下一条。

View File

@@ -105,6 +105,28 @@ def get_local_storage(state: dict) -> dict:
return ls
def pick_finder_raw_from_ls(ls: dict) -> str:
"""从 localStorage 字典中提取 rawKeyBuff 源串(兼容微信改版后的键名)。"""
for k in ("finder_raw", "rawKeyBuff", "finderRaw", "FINDER_RAW"):
v = ls.get(k, "")
if isinstance(v, str) and v.strip():
return v.strip()
if v and str(v).strip():
return str(v).strip()
best = ""
for name, val in ls.items():
if not val:
continue
v = str(val).strip()
if len(v) < 80:
continue
lk = name.lower()
if "rawkey" in lk or "keybuff" in lk or lk == "finderraw":
if len(v) > len(best):
best = v
return best
# ---------------------------------------------------------------------------
# Video helpers
# ---------------------------------------------------------------------------
@@ -706,11 +728,7 @@ async def _ensure_ctx() -> dict:
if not up_params:
raise RuntimeError("获取 upload_params 失败")
finder_raw_val = ls.get("finder_raw") or ""
if isinstance(finder_raw_val, str):
finder_raw_val = finder_raw_val.strip()
else:
finder_raw_val = str(finder_raw_val or "").strip()
finder_raw_val = pick_finder_raw_from_ls(ls)
if not finder_raw_val:
raise RuntimeError(

View File

@@ -0,0 +1,58 @@
#!/usr/bin/env python3
"""
视频号平台的 F12 接口配置(基于 web_f12_sdk
说明:
- 把“视频号特有接口”抽成配置,不把规则散落在业务脚本里。
- 后续新增网站时,复制此文件改 endpoint + patch 即可。
"""
from __future__ import annotations
from datetime import datetime
from web_f12_sdk import EndpointRule, InjectPatchRule
def to_schedule_ts(scheduled_time) -> int:
if not scheduled_time:
return 0
if isinstance(scheduled_time, datetime):
return int(scheduled_time.timestamp())
return int(scheduled_time)
def build_channels_profile(scheduled_time=None) -> tuple[list[EndpointRule], list[InjectPatchRule]]:
schedule_ts = to_schedule_ts(scheduled_time)
endpoint_rules = [
EndpointRule(name="auth_data", contains_any=["/auth/auth_data"]),
EndpointRule(name="post_list", contains_any=["/post/post_list"]),
EndpointRule(name="post_create", contains_any=["/post/post_create"], methods=["POST"]),
EndpointRule(name="post_delete", contains_any=["/post/post_delete"], methods=["POST"]),
EndpointRule(name="dfs_upload", contains_any=["/finder-assistant/"], methods=["POST"]),
]
inject_rules: list[InjectPatchRule] = []
if schedule_ts > 0:
def _patch(payload: dict) -> dict:
payload["effectiveTime"] = int(schedule_ts)
payload["postTimingInfo"] = {"timing": 1, "postTime": int(schedule_ts)}
post_info = payload.get("postInfo")
if isinstance(post_info, dict):
post_info["postTime"] = int(schedule_ts)
post_info["publishType"] = 1
return payload
inject_rules.append(
InjectPatchRule(
endpoint=EndpointRule(
name="post_create",
contains_any=["/post/post_create"],
methods=["POST"],
),
patch=_patch,
)
)
return endpoint_rules, inject_rules

View File

@@ -0,0 +1,197 @@
#!/usr/bin/env python3
"""
视频号红字守护进程
目标:
1. 周期性扫描 post_list 多页,定位目标目录里的视频是否出现“发表失败/上传失败”红字。
2. 命中失败态时,自动调用 publish-one 对该条做定时重发。
3. 通过本地 state 文件限制重试频率,避免无限刷同一条。
"""
from __future__ import annotations
import argparse
import json
import subprocess
import sys
import time
from pathlib import Path
SCRIPT_DIR = Path(__file__).parent
MULTI_SCRIPT_DIR = SCRIPT_DIR.parent.parent / "多平台分发" / "脚本"
if str(MULTI_SCRIPT_DIR) not in sys.path:
sys.path.insert(0, str(MULTI_SCRIPT_DIR))
if str(SCRIPT_DIR) not in sys.path:
sys.path.insert(0, str(SCRIPT_DIR))
from video_metadata import VideoMeta
import channels_publish as channels
STATE_FILE = SCRIPT_DIR / "channels_guardian_state.json"
def _now_s() -> int:
return int(time.time())
def _log(msg: str) -> None:
ts = time.strftime("%Y-%m-%d %H:%M:%S")
print(f"[guardian] {ts} | {msg}", flush=True)
def _load_state() -> dict:
if not STATE_FILE.exists():
return {"videos": {}}
try:
return json.loads(STATE_FILE.read_text(encoding="utf-8"))
except Exception:
return {"videos": {}}
def _save_state(state: dict) -> None:
STATE_FILE.write_text(json.dumps(state, ensure_ascii=False, indent=2), encoding="utf-8")
def _publish_dir_running() -> bool:
try:
out = subprocess.run(
["pgrep", "-f", "channels_web_cli.py publish-dir"],
capture_output=True,
text=True,
check=False,
)
return out.returncode == 0 and bool((out.stdout or "").strip())
except Exception:
return False
def _video_key(vp: Path) -> str:
return str(vp.resolve())
def _video_candidates(vp: Path) -> list[str]:
title = VideoMeta.from_filename(str(vp)).title("视频号")
return channels._title_keywords_for_list_check(title, str(vp))
def _should_retry(video_state: dict, fail_hint: str, cooldown_sec: int, max_retries: int) -> bool:
retries = int(video_state.get("retries", 0))
last_retry_ts = int(video_state.get("last_retry_ts", 0))
last_fail_hint = video_state.get("last_fail_hint", "")
now = _now_s()
if retries >= max_retries:
return False
if last_fail_hint == fail_hint and (now - last_retry_ts) < cooldown_sec:
return False
return True
def _call_retry(vp: Path, schedule_in_min: int) -> int:
cmd = [
"python3",
str(SCRIPT_DIR / "channels_web_cli.py"),
"publish-one",
"--video",
str(vp),
"--no-dedup",
"--skip-list-verify",
"--schedule-in-min",
str(schedule_in_min),
]
_log(f"触发自动重试: {vp.name} | {' '.join(cmd[2:])}")
result = subprocess.run(cmd, cwd=str(SCRIPT_DIR), check=False)
return int(result.returncode)
def run_once(args) -> int:
ok, msg, code = channels.verify_session_cookie()
if not ok:
_log(f"跳过本轮:登录态不可用 | {msg}")
return 2 if code else 1
if _publish_dir_running():
_log("检测到 publish-dir 正在运行,本轮跳过,避免与批量发布抢会话")
return 0
video_dir = Path(args.video_dir).expanduser().resolve()
videos = sorted(video_dir.glob("*.mp4"))
if not videos:
_log(f"未找到视频目录: {video_dir}")
return 1
cookie_str = channels._cookie_str_from_file()
items = channels._gather_post_list(cookie_str, args.max_pages)
state = _load_state()
videos_state = state.setdefault("videos", {})
retried = 0
failures = 0
for vp in videos:
key = _video_key(vp)
info = videos_state.setdefault(key, {})
cands = _video_candidates(vp)
fail_hint = channels._find_publish_failure_row(
items,
cands,
list(channels.REQUIRED_DESC_FRAGMENTS),
)
if not fail_hint:
info["last_seen_ok_ts"] = _now_s()
continue
failures += 1
info["last_fail_hint"] = fail_hint
info["last_fail_ts"] = _now_s()
_log(f"命中红字失败: {vp.name} | {fail_hint}")
if not _should_retry(info, fail_hint, args.retry_cooldown_sec, args.max_retries_per_video):
_log(f"跳过重试(冷却/上限): {vp.name}")
continue
rc = _call_retry(vp, args.schedule_in_min)
info["retries"] = int(info.get("retries", 0)) + 1
info["last_retry_ts"] = _now_s()
info["last_retry_rc"] = rc
retried += 1
_save_state(state)
# 单轮命中多条失败时,顺序重试,留一点缓冲避免接口风控。
time.sleep(args.after_retry_sleep_sec)
state["last_scan_ts"] = _now_s()
state["last_scan_video_dir"] = str(video_dir)
_save_state(state)
_log(f"扫描完成 | videos={len(videos)} failures={failures} retried={retried}")
return 0
def build_parser() -> argparse.ArgumentParser:
p = argparse.ArgumentParser(description="视频号红字守护进程")
p.add_argument("--video-dir", required=True, help="需要守护的成片目录")
p.add_argument("--interval-sec", type=int, default=180, help="守护轮询间隔秒数")
p.add_argument("--max-pages", type=int, default=8, help="每轮最多扫描多少页 post_list")
p.add_argument("--schedule-in-min", type=int, default=25, help="自动重试时延后多少分钟定时发")
p.add_argument("--max-retries-per-video", type=int, default=3, help="单条视频最大自动重试次数")
p.add_argument("--retry-cooldown-sec", type=int, default=900, help="同一失败态重试冷却秒数")
p.add_argument("--after-retry-sleep-sec", type=int, default=15, help="每次重试后等待秒数")
p.add_argument("--once", action="store_true", help="只扫描一轮")
return p
def main() -> int:
args = build_parser().parse_args()
if args.once:
return run_once(args)
_log(f"守护启动 | dir={args.video_dir} interval={args.interval_sec}s")
while True:
try:
run_once(args)
except KeyboardInterrupt:
raise
except Exception as e:
_log(f"异常: {str(e)[:200]}")
time.sleep(max(10, args.interval_sec))
if __name__ == "__main__":
raise SystemExit(main())

View File

@@ -0,0 +1,36 @@
{
"videos": {
"/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/AI时代用对工具的人和不用的人差距已.mp4": {
"last_seen_ok_ts": 1774332838
},
"/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/你跟我说你有能力,但你能保证每次说.mp4": {
"last_seen_ok_ts": 1774332838
},
"/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/当时有三家公司同时竞争,老板最后只.mp4": {
"last_seen_ok_ts": 1774332838
},
"/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我00后逃婚之后去卖核桃就这个名字让.mp4": {
"last_seen_ok_ts": 1774332838
},
"/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我做美团不卖套餐,专帮商家做后段分.mp4": {
"last_seen_ok_ts": 1774332838
},
"/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我入职第五天就被老板炒掉了,但后来.mp4": {
"last_seen_ok_ts": 1774332838
},
"/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我第一次参展什么都没准备,结果直接.mp4": {
"last_seen_ok_ts": 1774332838
},
"/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/我让客户先往账户充两万,再带他们去.mp4": {
"last_seen_ok_ts": 1774332838
},
"/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/电销这条路已经死了,砸再多人进去也.mp4": {
"last_seen_ok_ts": 1774332838
},
"/Users/karuo/Movies/soul视频/第78场_20250120_output/成片/这个客户从2018年一直跟我下单我从没主.mp4": {
"last_seen_ok_ts": 1774332838
}
},
"last_scan_ts": 1774332838,
"last_scan_video_dir": "/Users/karuo/Movies/soul视频/第78场_20250120_output/成片"
}

View File

@@ -1,24 +1,26 @@
"""
视频号 Headless 全自动发布脚本
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
- 完全无窗口headless Playwright
- 默认无窗口headless Playwright;需窗口时加 --headed
- 通过 iframe 内的真实发布表单操作
- 描述与话题与多平台 video_metadata.VideoMeta 一致(与 channels_publish / CLI 同源)
- 自动上传 → 填描述 → 填短标题 → 发表
- 支持去重定时发布
- 以后所有视频号发布统一走这个脚本
- 支持去重定时能力请优先用 channels_web_cli.py带 post_create 注入)
用法:
python channels_headless_publish.py /path/to/video_dir
python channels_headless_publish.py /path/to/video1.mp4 /path/to/video2.mp4
python3 channels_headless_publish.py /path/to/video_dir
python3 channels_headless_publish.py /path/to/video1.mp4
CHANNELS_HEADED=1 python3 channels_headless_publish.py ./dir # 有头调试
"""
import asyncio, json, sys, random, time, argparse
import asyncio, json, sys, random, time, argparse, os
from pathlib import Path
from playwright.async_api import async_playwright
sys.path.insert(0, str(Path(__file__).resolve().parent))
sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent / "多平台分发" / "脚本"))
from publish_result import PublishResult, is_published, save_results
from publish_result import PublishResult, is_published, save_results, print_summary
from video_metadata import VideoMeta
SCRIPT_DIR = Path(__file__).resolve().parent
STORAGE_FILE = SCRIPT_DIR / "channels_storage_state.json"
@@ -26,8 +28,6 @@ UA = (
"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36"
)
DESC_SUFFIX = " #小程序 卡若创业派对"
MINI_PROGRAM_LINK = "#小程序://卡若创业派对/gF4V4Vo4Ws4IiJa"
async def _get_iframe(page, timeout=20):
@@ -43,8 +43,9 @@ async def publish_one(page, video_path: Path, idx: int, total: int,
scheduled_ts: int = 0) -> PublishResult:
stem = video_path.stem
fsize_mb = video_path.stat().st_size / 1024 / 1024
title = f"{stem} #Soul派对 #创业日记{DESC_SUFFIX}"
desc_full = f"{title}\n{MINI_PROGRAM_LINK}"
meta = VideoMeta.from_filename(str(video_path))
title = meta.title("视频号")
desc_full = meta.description("视频号")[:500]
t0 = time.time()
sched_label = ""
@@ -135,7 +136,7 @@ async def publish_one(page, video_path: Path, idx: int, total: int,
try:
se = frame.locator('input[placeholder*="短标题"]').first
if await se.count() > 0:
short = stem[:16] if len(stem) >= 6 else stem + "|创业日记"
short = meta.title_short(16)
await se.fill(short, timeout=3000)
except Exception:
pass
@@ -210,8 +211,9 @@ async def publish_one(page, video_path: Path, idx: int, total: int,
)
async def run(video_paths: list[Path]):
print("=== 视频号 Headless 发布 (无窗口 · iframe) ===\n", flush=True)
async def run(video_paths: list[Path], *, headed: bool):
mode = "有头" if headed else "无头(headless)"
print(f"=== 视频号发布 ({mode} · iframe · 话题=VideoMeta) ===\n", flush=True)
need = [v for v in video_paths if not is_published("视频号", str(v))]
print(f" 视频: {len(video_paths)} 条, 待发布: {len(need)}\n", flush=True)
@@ -221,7 +223,7 @@ async def run(video_paths: list[Path]):
async with async_playwright() as pw:
browser = await pw.chromium.launch(
headless=True,
headless=not headed,
args=["--disable-blink-features=AutomationControlled", "--no-sandbox"],
)
ctx = await browser.new_context(
@@ -271,14 +273,27 @@ async def run(video_paths: list[Path]):
ok = sum(1 for r in actual if r.success)
fail = len(actual) - ok
print(f"\n=== 完成: 成功 {ok}, 失败 {fail} ===", flush=True)
if actual:
print_summary(actual)
return 0 if fail == 0 else 1
def main():
parser = argparse.ArgumentParser(description="视频号 Headless 发布")
parser = argparse.ArgumentParser(description="视频号发布(默认无头,话题同 video_metadata")
parser.add_argument("paths", nargs="+", help="视频文件或目录")
parser.add_argument(
"--headed",
action="store_true",
help="有头模式(弹出浏览器);默认无头。也可设环境 CHANNELS_HEADED=1",
)
args = parser.parse_args()
headed = bool(args.headed) or os.environ.get("CHANNELS_HEADED", "").strip().lower() in ("1", "true", "yes")
if os.environ.get("CHANNELS_FORCE_HEADLESS", "").strip().lower() in ("1", "true", "yes"):
headed = False
if args.headed:
print("[i] CHANNELS_FORCE_HEADLESS=1已忽略 --headed", flush=True)
videos: list[Path] = []
for p in args.paths:
pp = Path(p)
@@ -291,7 +306,7 @@ def main():
print("未找到 mp4 文件", flush=True)
sys.exit(1)
sys.exit(asyncio.run(run(videos)))
sys.exit(asyncio.run(run(videos, headed=headed)))
if __name__ == "__main__":

View File

@@ -92,6 +92,45 @@ async def extract_ls(page, keys):
return {}
async def extract_ls_finder_candidates(page) -> dict:
"""枚举可能与 rawKeyBuff 相关的 localStorage 键(微信改版后 key 名可能变)。"""
try:
return await page.evaluate("""() => {
const out = {};
for (let i = 0; i < localStorage.length; i++) {
const k = localStorage.key(i);
if (!k) continue;
const kl = k.toLowerCase();
if (kl.includes('finder_raw') || kl.includes('rawkey') || kl === 'rawkeybuff'
|| kl.includes('keybuff') || (kl.includes('finder') && kl.includes('raw'))) {
const v = localStorage.getItem(k);
if (v) out[k] = v;
}
}
return out;
}""")
except Exception as e:
print(f" [!] 枚举 localStorage 异常: {e}", flush=True)
return {}
async def navigate_to_trigger_raw_key(page) -> None:
"""
finder_raw 常在「新建发表」页注入;仅首页/列表可能一直没有。
顺序:列表 → 新建发表页,每步后给 JS 预留时间。
"""
urls = [
"https://channels.weixin.qq.com/platform/post/list",
"https://channels.weixin.qq.com/platform/post/create",
]
for u in urls:
try:
await page.goto(u, timeout=45000, wait_until="domcontentloaded")
await asyncio.sleep(10)
except Exception as e:
print(f" [!] 打开 {u} 异常: {e}", flush=True)
def _use_persistent_chromium() -> bool:
if "--no-persistent" in sys.argv:
return False
@@ -308,9 +347,26 @@ async def _assistant_login_flow_save(context, page) -> bool:
try:
_ = page.url
except Exception:
print("[!] 页面或浏览器已关闭,使用此前快照结束。", flush=True)
return snapshot_ready
print("[!] 当前页签不可用,尝试新开页面并进入内容列表以补全 rawKeyBuff…", flush=True)
try:
page = await context.new_page()
await page.goto(
"https://channels.weixin.qq.com/platform/post/list",
timeout=45000,
wait_until="domcontentloaded",
)
await asyncio.sleep(6)
except Exception as ex:
print(f"[!] 无法恢复页面({ex}),使用已落盘快照结束;请勿手动关浏览器直至写入完成。", flush=True)
return snapshot_ready
ls_vals = await extract_ls(page, REQUIRED_LS_KEYS)
if not ls_vals.get("finder_raw"):
cand = await extract_ls_finder_candidates(page)
for ck, cv in cand.items():
if cv and len(str(cv).strip()) > 80:
ls_vals["finder_raw"] = str(cv).strip()
print(f" [i] 候选键 {ck} 写入 finder_raw", flush=True)
break
if ls_vals.get("finder_raw"):
print(f"[✓] rawKeyBuff 已就绪 (等待 {attempt}s)", flush=True)
break
@@ -319,22 +375,24 @@ async def _assistant_login_flow_save(context, page) -> bool:
print(f" 等待 localStorage 写入... ({attempt + 1}s)", flush=True)
if not ls_vals.get("finder_raw"):
print("[i] rawKeyBuff 未出现,尝试访问内容列表页...", flush=True)
print("[i] rawKeyBuff 未出现,依次打开列表页与「新建发表」页以触发注入…", flush=True)
try:
await page.goto(
"https://channels.weixin.qq.com/platform/post/list",
timeout=15000,
wait_until="domcontentloaded",
)
await asyncio.sleep(8)
for _ in range(30):
await navigate_to_trigger_raw_key(page)
for _ in range(90):
try:
_ = page.url
except Exception:
return snapshot_ready
ls_vals = await extract_ls(page, REQUIRED_LS_KEYS)
if not ls_vals.get("finder_raw"):
cand = await extract_ls_finder_candidates(page)
for ck, cv in cand.items():
if cv and len(str(cv).strip()) > 80:
ls_vals["finder_raw"] = str(cv).strip()
print(f" [i] 发表页候选键 {ck} → finder_raw", flush=True)
break
if ls_vals.get("finder_raw"):
print("[✓] 导航后 rawKeyBuff 已就绪", flush=True)
print("[✓] 导航发表流程后 rawKeyBuff 已就绪", flush=True)
break
await asyncio.sleep(1)
except Exception as e:

View File

@@ -1,10 +1,10 @@
{
"sessionid": "BgAAYp%2BkEt3ycCs9BP2CJrkOtV%2B%2BeQX9FRjDSlMrqU9uThUEFhXeav8mGb9zT9eE2sN8gpL06DsUsmtTHMk4n0cX9OhTCbOMuqBwStBm5BA%3D",
"wxuin": "231842620",
"cookie_str": "sessionid=BgAAYp%2BkEt3ycCs9BP2CJrkOtV%2B%2BeQX9FRjDSlMrqU9uThUEFhXeav8mGb9zT9eE2sN8gpL06DsUsmtTHMk4n0cX9OhTCbOMuqBwStBm5BA%3D; wxuin=231842620",
"sessionid": "BgAAzG0NoYgN01OothlaKaYf3OXprDpgm95wuI9vSa97pjzyyn6G%2B%2B552yhe0o7cumV%2Fz5g3xLTWB2vUnumFoQwKWgjISW%2FUwNmmmuoWsBU%3D",
"wxuin": "2332567868",
"cookie_str": "sessionid=BgAAzG0NoYgN01OothlaKaYf3OXprDpgm95wuI9vSa97pjzyyn6G%2B%2B552yhe0o7cumV%2Fz5g3xLTWB2vUnumFoQwKWgjISW%2FUwNmmmuoWsBU%3D; wxuin=2332567868",
"finder_raw": "",
"finder_username": "v2_060000231003b20faec8c5e48919cbd5cb05e53db077dd1924028a806c10cffd891eb5a80ce7@finder",
"finder_uin": "",
"finder_login_token": "",
"url": "https://channels.weixin.qq.com/platform/post/list"
"url": "https://channels.weixin.qq.com/platform/post/create"
}

View File

@@ -3,11 +3,16 @@
卡若AI · 视频号网页 CLI
统一入口(面向后续长期使用):
- publish-dir: 目录逐条发布(支持定时)
- check: Cookie/登录可用性检查
- publish-dir: 目录逐条发布(支持定时);可用 --limit 1 --offset N --gap-sec 分步续跑
- publish-one: 单条发布(逐步上传、修 Cookie/脚本后再跑下一条)
- check: Cookie 文件 + post_list API 检查
- session: 仅 post_list API 探测
- publish_auto.sh: 先 check 再 publish-dir参数透传
说明:
- 默认后台模式headless可通过 --show 打开可视化调试。
- 默认无窗口headless--show 或环境 CHANNELS_HEADED=1 可有头调试。
- 环境 CHANNELS_FORCE_HEADLESS=1 时始终无头(即使传 --show
- 描述与话题与多平台 video_metadata 一致(视频号含固定话题标签)。
- 定时失败会被安全拦截,不会误发立即发布。
"""
from __future__ import annotations
@@ -15,6 +20,7 @@ from __future__ import annotations
import argparse
import asyncio
import inspect
import os
import sys
from datetime import datetime, timedelta
from pathlib import Path
@@ -26,10 +32,67 @@ if str(MULTI_SCRIPT_DIR) not in sys.path:
if str(Path(__file__).parent) not in sys.path:
sys.path.insert(0, str(Path(__file__).parent))
from publish_result import print_summary, save_results # noqa: E402
from publish_result import PublishResult, print_summary, save_results # noqa: E402
from schedule_generator import generate_smart_schedule, generate_schedule # noqa: E402
from video_metadata import VideoMeta # noqa: E402
import channels_publish as channels # noqa: E402
from channels_f12_profile import build_channels_profile, to_schedule_ts # noqa: E402
def _cli_headless(show_flag: bool) -> bool:
"""
默认无窗口headless=True
- --show有头调试
- 环境 CHANNELS_HEADED=1强制有头等同长期调试
- 环境 CHANNELS_FORCE_HEADLESS=1强制无头即使传了 --show防误开窗口
"""
if os.environ.get("CHANNELS_FORCE_HEADLESS", "").strip().lower() in ("1", "true", "yes"):
if show_flag:
print("[i] 已设 CHANNELS_FORCE_HEADLESS仍使用无头模式", flush=True)
return True
if os.environ.get("CHANNELS_HEADED", "").strip().lower() in ("1", "true", "yes"):
if show_flag:
print("[i] CHANNELS_HEADED=1 与 --show 同时存在时以有头为准", flush=True)
return False
return not show_flag
def _print_publish_outcome(r: PublishResult, *, label: str = "发布结果") -> None:
"""终端明确写出一条发布结果,便于复制复盘。"""
ok = "成功" if r.success else "失败"
print(f"\n=== {label} ===", flush=True)
print(f" 判定: {ok}", flush=True)
print(f" 状态: {r.status}", flush=True)
print(f" 平台: {r.platform}", flush=True)
print(f" 标题: {r.title}", flush=True)
print(f" 说明: {r.message or '(无)'}", flush=True)
if getattr(r, "error_code", None):
print(f" 错误码: {r.error_code}", flush=True)
if getattr(r, "elapsed_sec", None) is not None:
print(f" 耗时: {r.elapsed_sec:.1f}s", flush=True)
print(f" 日志行: {r.log_line()}", flush=True)
def _session_check_or_exit() -> int | None:
"""发布前 API 预检;失败返回非 0 退出码。CHANNELS_SKIP_SESSION_CHECK=1 可跳过。"""
if os.environ.get("CHANNELS_SKIP_SESSION_CHECK", "").strip() in ("1", "true", "yes"):
print("[i] 已跳过会话预检CHANNELS_SKIP_SESSION_CHECK", flush=True)
return None
ok, msg, code = channels.verify_session_cookie()
if ok:
print(f"[✓] {msg}", flush=True)
return None
print(f"[✗] 视频号登录态不可用: {msg}", flush=True)
print(
" 请先登录cd 脚本目录后执行\n"
" python3 channels_login.py\n"
" 或静默二维码CHANNELS_SILENT_QR=1 python3 channels_login.py\n"
" 扫 /tmp/channels_qr.png 后再跑本命令。",
flush=True,
)
if code == 300334:
print(" 300334 一般为登录过期,需重新扫码)", flush=True)
return 2
def _build_schedule(
@@ -38,30 +101,46 @@ def _build_schedule(
interval_min: int,
*,
use_legacy_schedule: bool = False,
min_gap: int = 30,
max_gap: int = 120,
min_gap: int = 10,
max_gap: int = 25,
) -> list[datetime]:
if use_legacy_schedule:
smart = generate_schedule(
video_count,
min_gap=min_gap,
max_gap=max_gap,
first_delay=start_after_min,
)
else:
smart = generate_smart_schedule(video_count)
# 始终使用 generate_schedule 并传入 min_gap/max_gap确保间隔参数生效
smart = generate_schedule(
video_count,
min_gap=min_gap,
max_gap=max_gap,
first_delay=start_after_min,
)
min_dt = datetime.now() + timedelta(minutes=start_after_min)
fixed = []
for i, st in enumerate(smart):
fixed.append(st if st > min_dt else min_dt + timedelta(minutes=interval_min * i))
# 强制校验:相邻间隔必须 >= min_gap 分钟
for i in range(1, len(fixed)):
gap_min = (fixed[i] - fixed[i - 1]).total_seconds() / 60
if gap_min < min_gap:
fixed[i] = fixed[i - 1] + timedelta(minutes=min_gap)
return fixed
async def cmd_publish_dir(args) -> int:
if (e := _session_check_or_exit()) is not None:
return e
# 轻量模式默认开启若需F12全量抓包传 CHANNELS_FORCE_F12=1 覆盖
if os.environ.get("CHANNELS_FORCE_F12", "").strip() not in ("1", "true", "yes"):
os.environ["CHANNELS_LIGHT_MODE"] = "1"
else:
os.environ["CHANNELS_LIGHT_MODE"] = "0"
video_dir = Path(args.video_dir).expanduser()
videos = sorted(video_dir.glob("*.mp4"))
if args.offset:
videos = videos[args.offset :]
if args.limit > 0:
videos = videos[: args.limit]
if not videos:
print(f"[✗] 未找到视频: {video_dir}")
print(f"[✗] 未找到视频(或 offset/limit 后为空): {video_dir}")
return 1
schedules = _build_schedule(
@@ -73,17 +152,42 @@ async def cmd_publish_dir(args) -> int:
max_gap=args.max_gap,
)
print(f"{len(videos)} 条,逐条发布(安全定时模式)")
print(
f"{len(videos)} 条,逐条发布(安全定时模式)"
+ (
f" [offset={args.offset}, limit={args.limit}]"
if (args.offset or (args.limit and args.limit > 0))
else ""
)
)
for i, (v, dt) in enumerate(zip(videos, schedules), 1):
print(f" {i}. {v.name} -> {dt:%Y-%m-%d %H:%M}")
results = []
for i, vp in enumerate(videos, 1):
title = VideoMeta.from_filename(str(vp)).title("视频号")
# 快速提交模式:不在本机长时间等待,直接设置平台定时并提交
if i > 1:
print(f" [快速模式] 第{i}条直接提交,平台定时={schedules[i-1]:%H:%M}", flush=True)
r = None
for attempt in range(1, args.max_attempts + 1):
if not vp.is_file():
print(f" [✗] 源文件不存在,跳过重试: {vp.name}", flush=True)
r = PublishResult(
platform="视频号",
video_path=str(vp),
title=title,
success=False,
status="error",
message="源文件不存在(成片勿与 soul_enhance 同时写同一目录)",
error_code="FILE_NOT_FOUND",
)
break
if attempt > 1:
print(f" [重试] 第 {i} 条第 {attempt}/{args.max_attempts} 次尝试")
hl = _cli_headless(bool(args.show))
r = await channels.publish_one(
str(vp),
title,
@@ -91,13 +195,33 @@ async def cmd_publish_dir(args) -> int:
len(videos),
skip_dedup=args.no_dedup,
scheduled_time=schedules[i - 1],
skip_list_verify=args.skip_list_verify,
headless=hl,
)
retryable = (not r.success) and (
(r.error_code in {"SCHEDULE_NOT_SET", "SCHEDULE_SET_ERROR"})
(
r.error_code
in {
"SCHEDULE_NOT_SET",
"SCHEDULE_SET_ERROR",
"SCHEDULE_INJECT_MISS",
"ORIGINAL_NOT_SET",
"ORIGINAL_CONFIRM_REQUIRED",
}
)
or ("上传控件" in (r.message or ""))
or ("set_input_files" in (r.message or ""))
or ("列表API" in (r.message or ""))
or ("红字" in (r.message or ""))
or ("发表失败" in (r.message or ""))
or ("上传失败" in (r.message or ""))
)
if not retryable:
if (r.message or "") and "Cookie" in r.message and "过期" in r.message:
print(
" [!] Cookie 过期:请 `python3 channels_login.py` 扫码后再跑(勿空转重试)。",
flush=True,
)
break
if attempt < args.max_attempts:
await asyncio.sleep(args.retry_wait_sec)
@@ -107,42 +231,185 @@ async def cmd_publish_dir(args) -> int:
results.append(r)
if r.status != "skipped":
save_results([r])
if i < len(videos):
await asyncio.sleep(args.gap_sec)
actual = [r for r in results if r.status != "skipped"]
print_summary(actual)
ok = sum(1 for r in actual if r.success)
if actual:
exit_hint = "0全部成功" if ok == len(actual) else "1存在失败"
print(
f"\n[批次发布结果] 共 {len(actual)} 条,成功 {ok},失败 {len(actual) - ok}"
f"建议进程退出 {exit_hint}",
flush=True,
)
else:
print(
"\n[批次发布结果] 无未跳过的条目(可能全部为 skipped 或未产出结果)",
flush=True,
)
return 0 if ok == len(actual) else 1
def cmd_check(_args) -> int:
if channels.COOKIE_FILE.exists():
print(f"[] Cookie 文件存在: {channels.COOKIE_FILE}")
if not channels.COOKIE_FILE.exists():
print(f"[] Cookie 存在: {channels.COOKIE_FILE}")
return 1
print(f"[✓] Cookie 文件存在: {channels.COOKIE_FILE}")
ok, msg, code = channels.verify_session_cookie()
if ok:
print(f"[✓] API: {msg}")
return 0
print(f"[✗] Cookie 不存在: {channels.COOKIE_FILE}")
print(f"[✗] API: {msg}")
print(" 请运行: python3 channels_login.py或 CHANNELS_SILENT_QR=1")
return 1
def cmd_session(_args) -> int:
ok, msg, _code = channels.verify_session_cookie()
print(msg, flush=True)
return 0 if ok else 1
def cmd_f12_profile(args) -> int:
"""输出视频号 F12 接口抽象配置(给新网站复用参考)。"""
scheduled = None
if args.schedule_at:
scheduled = datetime.fromisoformat(args.schedule_at.strip().replace("Z", "+00:00"))
endpoint_rules, inject_rules = build_channels_profile(scheduled_time=scheduled)
print("=== 视频号 F12 抽象配置 ===")
print("关键接口:")
for r in endpoint_rules:
print(f" - {r.name}: contains_any={r.contains_any}, methods={r.methods}")
print(f"注入规则数: {len(inject_rules)}")
if inject_rules:
ts = to_schedule_ts(scheduled)
print(f" - post_create 注入定时 Unix: {ts}")
print(" - 注入字段: effectiveTime, postTimingInfo.postTime, postInfo.postTime, postInfo.publishType")
print("模板文件:")
print(" - 多平台分发/脚本/web_f12_sdk.py")
print(" - 多平台分发/脚本/web_f12_platform_template.py")
return 0
async def cmd_publish_one(args) -> int:
"""单条上传:适合逐步执行、修问题后再跑下一条。"""
if (e := _session_check_or_exit()) is not None:
return e
vp = Path(args.video).expanduser().resolve()
if not vp.is_file():
print(f"[✗] 文件不存在: {vp}")
return 1
title = VideoMeta.from_filename(str(vp)).title("视频号")
scheduled = None
if args.immediate:
scheduled = None
elif args.schedule_at:
s = args.schedule_at.strip().replace("Z", "+00:00")
scheduled = datetime.fromisoformat(s)
else:
scheduled = datetime.now() + timedelta(minutes=args.schedule_in_min)
when = "立即" if scheduled is None else scheduled.strftime("%Y-%m-%d %H:%M")
print(f"[publish-one] {vp.name} | 定时: {when}", flush=True)
hl = _cli_headless(bool(args.show))
r = await channels.publish_one(
str(vp),
title,
1,
1,
skip_dedup=args.no_dedup,
scheduled_time=scheduled,
skip_list_verify=args.skip_list_verify,
headless=hl,
)
if r.status != "skipped":
save_results([r])
_print_publish_outcome(r, label="单条发布结果")
return 0 if r.success else 1
def build_parser() -> argparse.ArgumentParser:
p = argparse.ArgumentParser(description="卡若AI · 视频号网页 CLI")
sub = p.add_subparsers(dest="cmd", required=True)
p_check = sub.add_parser("check", help="检查视频号登录态文件")
p_check = sub.add_parser("check", help="检查 Cookie 文件 + post_list API 是否可用")
p_check.set_defaults(func=cmd_check)
p_sess = sub.add_parser("session", help="仅探测 post_list API与 check 中 API 部分相同)")
p_sess.set_defaults(func=cmd_session)
p_f12 = sub.add_parser("f12-profile", help="输出视频号 F12 接口抽象(供 CLI/新网站复用)")
p_f12.add_argument(
"--schedule-at",
default="",
help="可选ISO 时间;用于演示 post_create 定时字段注入值",
)
p_f12.set_defaults(func=cmd_f12_profile)
p_pub = sub.add_parser("publish-dir", help="目录逐条定时发布到视频号")
p_pub.add_argument("--video-dir", required=True, help="视频目录(*.mp4")
p_pub.add_argument(
"--limit",
type=int,
default=0,
help="只处理前 N 条0=不限制,适合逐步跑)",
)
p_pub.add_argument(
"--offset",
type=int,
default=0,
help="跳过前 N 个 mp4与 sort 后顺序一致,用于续跑)",
)
p_pub.add_argument("--start-after-min", type=int, default=12, help="首条至少延后多少分钟")
p_pub.add_argument("--interval-min", type=int, default=55, help="兜底条间隔(分钟)")
p_pub.add_argument("--legacy-schedule", action="store_true", help="使用固定间隔区间排期")
p_pub.add_argument("--min-gap", type=int, default=10, help="最小间隔(分钟)")
p_pub.add_argument("--max-gap", type=int, default=120, help="最大间隔(分钟)")
p_pub.add_argument("--max-gap", type=int, default=25, help="最大间隔(分钟)")
p_pub.add_argument("--gap-sec", type=int, default=10, help="两条任务之间等待秒数")
p_pub.add_argument("--max-attempts", type=int, default=5, help="单条最大自动重试次数")
p_pub.add_argument("--retry-wait-sec", type=int, default=8, help="重试等待秒数")
p_pub.add_argument("--no-dedup", action="store_true", help="不做去重检查")
p_pub.add_argument(
"--skip-list-verify",
action="store_true",
help="PUBLISH 接口返回成功后不再拉 post_list 核验(避免后台描述与标签字段不一致导致误判失败)",
)
p_pub.add_argument(
"--show",
action="store_true",
help="有头模式(弹出 Chromium。默认无头也可设 CHANNELS_HEADED=1",
)
p_pub.set_defaults(func=cmd_publish_dir)
p_one = sub.add_parser("publish-one", help="单条发布(逐步上传/排错)")
p_one.add_argument("--video", required=True, help="单个 mp4 路径")
p_one.add_argument(
"--schedule-in-min",
type=int,
default=12,
help="无 --schedule-at 且非 --immediate 时:从现在起延后多少分钟定时发(默认 12",
)
p_one.add_argument(
"--schedule-at",
default="",
help="绝对定时 ISO如 2026-03-25T14:30:00覆盖 schedule-in-min",
)
p_one.add_argument(
"--immediate",
action="store_true",
help="不定时,立即发表(慎用)",
)
p_one.add_argument("--no-dedup", action="store_true", help="不做去重检查")
p_one.add_argument("--skip-list-verify", action="store_true", help="同 publish-dir")
p_one.add_argument(
"--show",
action="store_true",
help="有头调试(默认无头)",
)
p_one.set_defaults(func=cmd_publish_one)
return p

View File

@@ -0,0 +1,33 @@
#!/usr/bin/env bash
# 静默出码 → 轮询 check 直到 API 正常 → 全自动 publish-dir参数透传
# 用法: ./login_wait_and_publish.sh --video-dir "/path/成片" --no-dedup [--gap-sec 12]
set -u
DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$DIR" || exit 1
if python3 channels_web_cli.py check; then
echo "[✓] 会话已可用,直接发布"
exec python3 channels_web_cli.py publish-dir "$@"
fi
echo "[i] API 不可用,后台启动静默登录(二维码 /tmp/channels_qr.png请用微信扫码…"
CHANNELS_SILENT_QR=1 python3 channels_login.py >> /tmp/channels_login_bg.log 2>&1 &
LOGINPID=$!
cleanup() { kill "$LOGINPID" 2>/dev/null || true; }
trap cleanup EXIT
# 最长约 6 分钟(与 channels_login 内扫码等待对齐)
for i in $(seq 1 24); do
sleep 15
if python3 channels_web_cli.py check; then
echo "[✓] 会话已可用(轮询第 ${i} 次)"
cleanup
trap - EXIT
exec python3 channels_web_cli.py publish-dir "$@"
fi
echo "[i] 仍等待扫码… ${i}/24每 15s 检测)"
done
echo "[✗] 超时仍未登录:请查看 /tmp/channels_qr.png 与 /tmp/channels_login_bg.log"
exit 1

View File

@@ -0,0 +1,13 @@
#!/usr/bin/env bash
# 全自动上传:先 API 预检,通过后再执行 publish-dir参数原样透传
set -euo pipefail
DIR="$(cd "$(dirname "$0")" && pwd)"
cd "$DIR"
if ! python3 channels_web_cli.py check; then
echo ""
echo "[!] 请先登录视频号后再运行本脚本,例如:"
echo " CHANNELS_SILENT_QR=1 python3 channels_login.py"
echo " 打开 /tmp/channels_qr.png 用微信扫码"
exit 1
fi
exec python3 channels_web_cli.py publish-dir "$@"

View File

@@ -4,8 +4,8 @@ description: 卡若AI 全栈开发(火炬)— 知己及类似项目经验 +
triggers: 全栈开发/知己项目/分销/存客宝/RAG/向量化/Next.js/知识库/卡若AI官网/官网开发/全站开发/开发文档/110/开发模板/官网全站/v0前端/v0生成/毛玻璃/前端规格/神射手/毛狐狸/前端标准/实施计划/两阶段评审/橙色锁/配色/API调用/使用手册/埋点/点击统计/用户行为/行为统计/数据统计/点击锚点/锚点/trackClick
owner: 火炬
group: 火
version: "2.6"
updated: "2026-03-22"
version: "2.7"
updated: "2026-03-26"
---
# 全栈开发(火炬)
@@ -25,7 +25,7 @@ updated: "2026-03-22"
- **110 目录**:需求 | 架构 | 原型 | 前端 | 接口 | 后端 | 数据库 | 部署 | 手册 | 项目管理。
- **入口**:第一次用先读 `1、需求/卡若AI项目使用说明.md`(或该项目等价说明),再读 `10、项目管理/开发文档使用指引(卡若交互式).md`
- **手册**:使用手册**一律按卡若AI 使用手册结构**书写书籍式README 总目录 + 篇/章多文件 + 附录),并**图文并茂**。配图放 `9、手册/images/`,在章节内引用,并在 `images/README.md` 登记。详见 `开发模板/9、手册/使用手册生成规范_卡若AI结构.md`;入口可保留 `9、手册/使用手册(带图).md` 作导航或单页摘要。
- **复盘**:迭代结尾用 `10、项目管理/迭代复盘模板.md`(卡若复盘格式,含 Human 3.0 反思与总结)。
- **复盘**:迭代结尾用 `10、项目管理/迭代复盘模板.md`**对话内复盘**一律遵守 `运营中枢/参考资料/卡若复盘格式_固定规则.md`(🎯 极简三行 + **➡️/📊 达成率复述** + **🧠 Human 3.0 复盘快扫** + **☯ 奇门 Q门 3.0 项目盘**)。八门起盘步骤见 **`04_卡火/火炬_全栈消息/项目开发占卜术/SKILL.md`**F01c · 演门测机)。
### 1.2 执行流程(调研 → 计划 → 执行 → 评审 → 复盘)
@@ -283,6 +283,7 @@ scripts/
| **神射手 开发文档 4、前端** | 神射手项目内前端规范、核心组件代码、截图索引 |
| **Superpowers与全栈开发对比与优化建议** | `运营中枢/参考资料/Superpowers与全栈开发对比与优化建议.md` — 计划粒度、TDD、两阶段评审、分支收尾等优化方向 |
| **埋点统计与点击锚点Soul 沉淀)** | 三层架构 + module/action/target 锚点约定 + `10、项目管理` 登记表Soul 参考 `一场soul的创业实验-永平`;见本 Skill **§1.10**2026-03-22 扩充) |
| **火炬「项目开发占卜术」SkillF01c · 演门测机)** | **奇门 Q门 3.0** 八门健康度 + **☯ 复盘叠层**;与 `卡若复盘格式_固定规则.md` 强制对齐;迭代收尾/起盘必交叉引用 |
---

View File

@@ -0,0 +1,55 @@
---
name: 项目开发占卜术
description: 火炬 · 项目开发「起盘」— 用奇门 Q门 3.0 八门框架做迭代健康度与风险扫描(非玄学,可验收百分比);与卡若复盘 ☯ 块强制对齐触发词项目开发占卜术、开发占卜、Q门3.0、奇门项目盘、八门复盘、起盘、盘势、门迫。
triggers: 项目开发占卜术、开发占卜、Q门3.0、奇门项目盘、八门复盘、起盘、盘势、门迫、火炬占卜、项目盘
owner: 火炬
group: 火
version: "1.0"
updated: "2026-03-26"
memory_palace_path: 卡若记忆宫殿/火殿/火炬厢/演门测机
memory_palace_slot: 以八门扫项目健康,百分比对齐复盘与落地表
---
# 项目开发占卜术(火炬 · 演门测机)
> **本质**:用 **奇门 Q门 3.0** 的**八门隐喻**做**项目维度的完成度/风险快照**,输出 **可对照验收的百分比 + 交通灯**,与 `运营中枢/参考资料/卡若复盘格式_固定规则.md` 中的 **☯ 奇门 Q门 3.0(项目盘)** **逐字对齐**。
> **禁止**:当作命理预测;所有门线必须是**本迭代/本仓库/本对话可验证事实**的归纳。
---
## 一、何时激活
用户或上下文出现:**项目开发占卜术、开发占卜、Q门3.0、奇门项目盘、八门复盘、起盘、盘势**,或 **全栈/前端/测试** 迭代收尾要求「按占卜术复盘」时,读本 Skill 并执行 **第二节起盘清单**
---
## 二、起盘清单Agent 执行顺序)
1. **读状态**`开发文档/10、项目管理/开发进度.md`或等价、本回合已改文件、CI/测试结果、未关 Issue/待办。
2. **定主目标**:用一句话对应 🎯 块「目标」,便于 **达成率 XX%****盘势总完成度** 同源或脚注加权。
3. **八门打分YY% + 🟢🟡🔴)**:按下列映射逐门**一句判词**,禁止空洞满分。
- **开门**:发布、验收、对外接口是否可交付。
- **休门**:技术债、可维护性、是否需要专门「还债」迭代。
- **生门**:新功能/增长项是否真实落地(非空 PR
- **伤门**:缺陷、返工、事故;**健康=伤损受控**(可 80%+ 表示少伤)。
- **杜门**:阻塞、依赖、等人/等账号/等审批。
- **景门**:文档、演示、日志、可观测、对接口头是否一致。
- **死门**:僵死代码、废弃路由、冻结需求是否拖累。
- **惊门**:风险、合规、告警、未知项(依赖未锁版本等)。
4. **写复盘**:在对话末尾 **完整卡若复盘块**,且 **☯ 块** 插在 **➡️ 🎯 块后达成率复述** 之后、**📌 过程** 之前;含 **➡️ ☯ 块后盘势复述**。
5. **回写(可选)**:若项目有 `10、项目管理/迭代复盘模板.md`,将八门摘要追加到当次迭代段落,便于下次起盘对比。
---
## 三、与「全栈开发」关系
- **全栈开发** Skill 负责 110、计划、评审、代码落地**本 Skill** 负责 **收尾复盘时的八门盘 + 百分比口径统一**
- 两 Skill **同时命中**时:先按全栈流程交付,再用本 Skill **起盘写 ☯**
---
## 四、引用
- 复盘母体:`运营中枢/参考资料/卡若复盘格式_固定规则.md`(含 ☯ 模板全文)。
- Cursor 规则:`.cursor/rules/karuo-ai.mdc`(强制复盘 + 开发类 ☯)。
- 登记:`SKILL_REGISTRY.md` **F01c**

View File

@@ -43,14 +43,14 @@
- **细粒度拆解**,执行计划带精确路径/命令/预期
- **技能联动**:执行前检查联动子技能
- **至少两轮验证**;不通过则回溯→搜索→再执行
- **复盘块齐全**(🎯📌💡📝▶),可带数据与引用
- **复盘块齐全**(🎯📌💡📝▶)+ **叠层**(➡️ 达成率双复述、🧠 Human 3.0 复盘快扫、开发类 ☯ 项目盘、📊 结束复述),可带数据与引用;细则见 `运营中枢/参考资料/卡若复盘格式_固定规则.md`
- **可拆任务 16 线程并行**:划界归域→独立处理→汇总。详见 `运营中枢/参考资料/多线程并行处理规范.md`
## 五、执行流程(强制)
**第一步:先思考,在对话中以详细文字展示拆解与计划**
- 必须先深度思考再动手。在对话里用**详细文字**展示:① 思考结果 ② 任务拆解1,2,3…细粒度 ③ 执行计划(带路径/命令/预期)。展示完再执行。禁止不展示直接动手。
- **例外**:用户明确要求「直接做 / 不要罗列 / 别讲写了什么」时,**可跳过本步长文**,先改代码与验证,正文极简;**第四步 Mongo 留存 + 复盘五块仍必须**。
- **例外**:用户明确要求「直接做 / 不要罗列 / 别讲写了什么」时,**可跳过本步长文**,先改代码与验证,正文极简;**第四步 Mongo 留存 + 完整复盘(主块+叠层)仍必须**。
- 执行前检查联动子技能;可拆任务启用 16 线程并行。
**第二步:执行**
@@ -61,7 +61,7 @@
**第四步Mongo 对话留存 + 强制复盘**
- **先**完成 Mongo 留存闭环(将本轮 Cursor 对话写入 `karuo_site`,不重复键):执行 `python3 01_卡资/金仓_存储备份/聊天记录管理/脚本/realtime_chat_sync.py`;细则与顺序见 `运营中枢/参考资料/卡若AI_Mongo对话留存闭环.md``.cursor/rules/karuo-ai.mdc`
- **再**用复盘形式收尾(🎯📌💡📝▶ 五),带日期+时间YYYY-MM-DD HH:mm目标行≤30字。格式见 `运营中枢/参考资料/卡若复盘格式_固定规则.md`
- **再**用复盘形式收尾(🎯📌💡📝▶ 五主块 + ➡️🧠☯📊 等叠层),带日期+时间YYYY-MM-DD HH:mm🎯 内目标一句即可。格式见 `运营中枢/参考资料/卡若复盘格式_固定规则.md`
## 六、记忆
@@ -77,7 +77,7 @@
|:---|:---|
| 技能查找 | 热技能速查→未命中读 SKILL_REGISTRY.md→读 SKILL.md 执行 |
| 常规操作 | 优先命令行 + 复用现成流程,不提问 |
| 复盘 | 所有回复强制用完整复盘(🎯📌💡📝▶) |
| 复盘 | 所有回复强制用完整复盘(🎯📌💡📝▶ + ➡️🧠 Human 3.0 + 开发类 ☯ + 📊 |
| 沉淀 | 写入 `水溪_整理归档/经验库/待沉淀/` |
| 对话后优化 | 经验沉淀 + 技能变更更新 SKILL_REGISTRY + 使用手册。见 `运营中枢/使用手册/对话沉淀与优化规则.md` |
| 基因胶囊 | 读 `土砖_技能复制/基因胶囊/SKILL.md` |

View File

@@ -1,8 +1,8 @@
# 卡若AI 技能注册表Skill Registry
> **一张表查所有技能**。任何 AI 拿到这张表,就能按关键词找到对应技能的 SKILL.md 路径并执行。
> 77 技能 + 3 卡路Cursor入口 | 15 成员 | 5 负责人
> 版本5.14 | 更新2026-03-23
> 78 技能 + 3 卡路Cursor入口 | 15 成员 | 5 负责人
> 版本5.16 | 更新2026-03-26
>
> **技能配置、安装、删除、掌管人登记** → 见 **`运营中枢/工作台/01_技能控制台.md`**。
@@ -72,7 +72,7 @@
| G13 | 数据库管理 | 金仓 | MySQL、清理数据库 | `01_卡资/金仓_存储备份/数据库管理/SKILL.md` | 数据库维护与优化 |
| G14 | 文件整理 | 金仓 | 整理文件、外置硬盘 | `01_卡资/金仓_存储备份/文件整理/SKILL.md` | 大规模文件分类与整理 |
| G15 | 存客宝 | 金盾 | **存客宝、cunkebao、私域、获客、工作手机、场景获客、流量池、触客宝、touchkebao、AI数字员工、分销渠道、微信管理、存客宝API、存客宝数据库** | `01_卡资/金盾_数据安全/存客宝/SKILL.md` | 存客宝全栈管理200+API、数据库、设备、微信、AI、触客宝、门店、分销 |
| G16 | 远程环境一键部署 | 金盾 | 远程部署、装Clash | `01_卡资/金盾_数据安全/远程环境一键部署/SKILL.md` | 远程服务器环境配置 |
| G16 | 远程环境一键部署 | 金盾 | 远程部署、装Clash、装飞书、装龙虾、OpenClaw部署、飞书机器人部署、飞书不回复、龙猫不回复 | `01_卡资/金盾_数据安全/远程环境一键部署/SKILL.md` | 跨平台一键部署 Feishu + OpenClaw含飞书不回复排查闭环支持本地与远程 |
| G17 | 数据库管理(安全) | 金盾 | 数据库、备份数据 | `01_卡资/金盾_数据安全/数据库管理/SKILL.md` | 数据库安全与备份 |
| G18 | 微信管理(安全) | 金盾 | 微信数据库解析 | `01_卡资/金盾_数据安全/微信管理/SKILL.md` | 微信数据库解密与分析 |
| G19 | 存客宝副本管理 | 金盾 | 存客宝副本、cunkebao_副本、存客宝开发文档、副本代码管理 | 副本项目内 `cunkebao_副本/.cursor/skills/存客宝副本管理/SKILL.md`(以副本为主,路径见下) | 存客宝副本代码与开发文档管理Skill 已迁入副本项目内 |
@@ -132,6 +132,7 @@
| F01 | 全栈开发 | 火炬 | 知己、RAG、分销、**卡若AI官网、官网开发、全站开发、开发文档、110**、**埋点、点击统计、用户行为、行为统计、数据统计、点击锚点、锚点、trackClick** | `04_卡火/火炬_全栈消息/全栈开发/SKILL.md` | 全栈项目 + 官网/全站与开发文档 110**§1.10 埋点与点击锚点全站强制** |
| F01a | 前端开发 | 火炬 | **前端开发、毛玻璃、神射手风格、毛狐狸风格、前端标准、苹果毛玻璃**、**埋点、点击锚点、trackClick、用户行为** | `04_卡火/火炬_全栈消息/前端开发/SKILL.md` | 毛玻璃 + 前端标准;**§五 用户行为与点击锚点**;详规见全栈 §1.10 |
| F01b | 全栈测试 | 火炬 | **全栈测试、功能测试、回归测试、深度测试、E2E测试、API测试、发布测试、测试验收** | `04_卡火/火炬_全栈消息/全栈开发/全栈测试/SKILL.md` | 功能开发后系统化验收:前端/后端/数据库/脚本/发布引擎五维测试;**每完成一个功能必须调用** |
| F01c | **项目开发占卜术**(间名 **演门测机** | 火炬 | **项目开发占卜术、开发占卜、Q门3.0、奇门项目盘、八门复盘、起盘、盘势、门迫** | `04_卡火/火炬_全栈消息/项目开发占卜术/SKILL.md` | 奇门 Q门 3.0 八门框架扫项目健康度;**复盘 ☯ 块**与 `卡若复盘格式_固定规则.md` 强制对齐 |
| F02 | 消息中枢 | 火炬 | WhatsApp、Telegram | `04_卡火/火炬_全栈消息/消息中枢/SKILL.md` | 多平台消息聚合 |
| F02a | **艾叶 IM Bridge** | 火炬 | **艾叶、IM、聊天对接、消息网关、微信对接、企业微信对接、飞书对接、WhatsApp对接、网页聊天、IM桥接、通道配置、艾叶IM** | `04_卡火/火炬_全栈消息/艾叶/SKILL.md` | 多平台 IM 网关:个人微信/企业微信/飞书/WhatsApp/网页→卡若AI 对话 |
| F03 | 读书笔记 | 火炬 | 拆解这本书、五行拆书 | `04_卡火/火炬_全栈消息/读书笔记/SKILL.md` | 五行框架拆书 |

View File

@@ -8,48 +8,70 @@
**卡若AI 所有对话的 AI 回复一律采用「复盘形式」**,只有一种格式:完整复盘,每轮/每步均以完整复盘块收尾。
## 13.2 五块结构(每块必带图标)
**权威全文**`运营中枢/参考资料/卡若复盘格式_固定规则.md`**v3.1+**:🎯 极简三行;**➡️ / 📊** 达成率双复述;**🧠 Human 3.0(复盘快扫)** 每轮必填;项目开发类再加 **☯ 奇门 Q门 3.0**)。
书写时**每块标题必须带图标 + 粗体**,例如:**🎯 目标·结果·达成率**、**📌 过程**、**💡 反思**、**📝 总结**、**▶ 下一步执行**。
## 13.2 主块与叠层(每块必带图标)
| 顺序 | 图标 | 块标题 | 内容 | 要求 |
|:---:|:---:|:---|:---|:---|
| 1 | 🎯 | **目标·结果·达成率** | 做什么、结果如何、达成百分比 | 整行 ≤30 字 |
| 2 | 📌 | **过程** | 1、2、3 分点简述执行过程 | 不用表格 |
| 3 | 💡 | **反思** | 可复用点、改进点 | 13 点 |
| 4 | 📝 | **总结** | 一两句结论或经验 | 简洁 |
| 5 | ▶ | **下一步执行** | 结合项目目标的后续动作 | 关联未完成项 |
**五个主块**:书写时**每块标题必须带图标 + 粗体**,例如:**🎯 目标·结果·达成率**、**📌 过程**、**💡 反思**、**📝 总结**、**▶ 下一步执行**。
**叠层(插在主块之间,顺序固定)**
1. **➡️ 🎯 块后达成率复述**:与 🎯 内 **达成率** 同数值。
2. **🧠 Human 3.0(复盘快扫)****本质 / 边界 / 挑战 / 证据** 各一句边界与挑战可无则写「无」与火组「智能追问」Skill 中 Human 3.0 + CRITIC 对齐。
3. **☯ 奇门 Q门 3.0(项目盘)****写代码/改仓库/部署等项目类**写满八门;**非开发类**一行说明「八门不起」且盘势与 🎯 同源。
4. **📊 复盘结束达成率复述**:写在 **▶** 之后,与 🎯 **达成率** 同数值。
**主块内容要点**
- **🎯**:仅三行 — **目标**(一句)、**结果**(一句)、**达成率****XX%**)。
- **📌**1、2、3 分点简述过程;复盘块内不用表格。
- **💡**13 点反思。
- **📝**:一两句总结。
- **▶**:下一步;无则写「无」。
## 13.3 格式要求
- **标题**`[卡若复盘]YYYY-MM-DD HH:mm`,日期时间必填
- **日期时间**用 Markdown 粗体,不用 HTML 标签
- **复盘块内不用表格**
- 每块用小图标标识(🎯📌💡📝▶)
- **标题**`**[卡若复盘]YYYY-MM-DD HH:mm**`,日期时间必填
- **日期时间**用 Markdown 粗体,不用 HTML 标签
- **复盘块内不用表格**
- 主块图标固定 🎯📌💡📝▶;叠层 ➡️🧠☯📊 按 `卡若复盘格式_固定规则.md` 插入
## 13.4 示例(每块带图标 + 粗体
## 13.4 示例(非开发类 · 含叠层
```markdown
**[卡若复盘]2026-03-12 10:30**
**[卡若复盘]2026-03-26 14:00**
**🎯 目标·结果·达成率**
完善使用手册架构 · 已完成6篇24章 · 100%
- **目标**把使用手册第13章与最新复盘规范对齐。
- **结果**:已改写本章并指向固定规则全文。
- **达成率****100%**
**➡️ 🎯 块后达成率复述****100%**
**🧠 Human 3.0(复盘快扫)**
- **本质**:读者要的是可执行的复盘骨架,不是冗长 OKR。
- **边界**:未改其他章节正文,仅本章。
- **挑战**:无。
- **证据**:本章文件已保存且与 `卡若复盘格式_固定规则.md` 一致。
**☯ 奇门 Q门 3.0(项目盘)**:本回合非项目盘,八门不起;盘势与 🎯 达成率同源 **100%**
**📌 过程**
1. 分析现有手册结构,确认缺失内容
2. 设计6篇24章目录结构
3. 逐章编写并建立导航链接
1. 读固定规则 v3.1 与旧版第13章 diff。
2. 重写主块+叠层说明与示例。
3. 保存本文件。
**💡 反思**
1. 多文件结构比单文件更易维护
2. 每章独立可以按需更新而不影响其他章节
1. 手册示例应与「固定规则」同源,避免双口径。
2. 示例里保留非开发类 ☯ 一行简写,降低日常负担。
**📝 总结**
使用手册从 v1.0 升级到 v2.0 书籍结构,覆盖全部功能
第13章已与 v3.1 复盘规范对齐,细节以固定规则为准
**▶ 下一步执行**
- 持续按对话沉淀规则更新手册
- 有新技能时同步更新对应章节
无。
**📊 复盘结束达成率复述****100%**
```
## 13.5 可选扩展块

View File

@@ -16,7 +16,7 @@
2. **(可选)** 若本轮明确知道对话 ID可指定
`python3 .../realtime_chat_sync.py --current-conversation-id <UUID>`
3. 再写 **强制复盘**(🎯📌💡📝▶),见 `卡若复盘格式_固定规则.md`。
3. 再写 **强制复盘**(🎯📌💡📝▶ 五主块 + ➡️🧠 Human 3.0 + 开发类 ☯ + 📊),见 `卡若复盘格式_固定规则.md`。
---

View File

@@ -1,16 +1,17 @@
# 卡若复盘格式(固定规则)
> **强制规则。** 卡若AI 内**复盘格式永远只有一种**:完整复盘。**每一轮回复、每一个步骤结束**,均以**完整复盘块**收尾,不得使用简版或省略。**复盘块标题除日期外必须带时间**YYYY-MM-DD HH:mm。**复盘块内不用表格**,各块以**小图标 + 小标题**识别。
> **强制规则。** 卡若AI 内**复盘格式永远只有一种**:完整复盘。**每一轮回复、每一个步骤结束**,均以**完整复盘块**收尾,不得使用简版或省略。**复盘块标题除日期外必须带时间**YYYY-MM-DD HH:mm。**复盘块内不用表格**,各块以**小图标 + 小标题**识别。
> **v3.12026-03-26****🎯** 改为**极简三行**(目标 / 结果 / 达成率%);在「➡️ 🎯 块后达成率复述」之后**强制**增加 **🧠 Human 3.0(复盘快扫)**与火组「智能追问」Skill 中 **Human 3.0 + CRITIC** 同源,做**倒带自检**);项目开发类在 🧠 之后仍叠 **☯ 奇门 Q门 3.0(项目盘)**。详细提问法可参考 `04_卡火/火眼_智能追问/智能追问/参考资料/Human3.0提问法.md`。
---
## 五块与图标(必按此写)
复盘由 **5 块** 组成,**每块必须有对应图标 + 小标题**,顺序固定
复盘由 **5 个主块** 组成,**每块必须有对应图标 + 小标题**,顺序固定**叠层**(➡️、🧠、☯)写在主块之间,顺序见「顺序总览」。
| 顺序 | 图标 | 块标题 | 说明 |
|:---:|:---:|:---|:---|
| 1 | 🎯 | **目标·结果·达成率** | 目标+结果+达成率 XX%,整行 ≤30 字 |
| 1 | 🎯 | **目标·结果·达成率** | **仅三行****目标**(一句)·**结果**(一句)·**达成率****XX%**)。不强制 OKR 长文、**不强制**信号灯/置信度(若需一眼健康度可在 💡 用一句带过)。 |
| 2 | 📌 | **过程** | 1、2、3 分点简述做了什么 |
| 3 | 💡 | **反思** | 13 点:做得好的 / 可改进的 |
| 4 | 📝 | **总结** | 一两句结论或可复用经验 |
@@ -20,17 +21,43 @@
---
## 顺序总览(复盘块内 · 从上到下)
1. 标题行 **[卡若复盘]YYYY-MM-DD HH:mm**
2. **🎯 目标·结果·达成率**(三行极简)
3. **➡️ 🎯 块后达成率复述XX%**(与 🎯 内 **达成率** 数值**完全一致**
4. **🧠 Human 3.0(复盘快扫)**(每轮必填,四条;见下模板)
5. **☯ 奇门 Q门 3.0(项目盘)**(项目开发类写满骨架;非开发类一行简写)
6. **📌 过程** → **💡 反思** → **📝 总结** → **▶ 下一步执行**
7. **📊 复盘结束达成率复述XX%**(与 🎯 内 **达成率** 数值**完全一致**
---
## 格式(唯一 · 必填 · 带图标)
复盘**只有这一种格式**。每块**一个图标 + 小标题**便于识别;**目标·结果·达成率**整行 ≤30 字;过程/反思之间可插入流程图或图片。**禁止在复盘块内使用表格**。
复盘**只有这一种格式**。**禁止在复盘块内使用表格**。过程/反思之间可插入流程图或图片(非表格)
**复制用完整模板(标题与五块均带图标)**
**复制用完整模板:**
```markdown
**[卡若复盘]YYYY-MM-DD HH:mm**
**🎯 目标·结果·达成率**
(整行 ≤30 字:目标+结果+达成率 XX%。多任务可拆为 1 2 3 三句,每句仍 ≤30 字。)
- **目标**:(本回合要达成什么,一句。)
- **结果**:(实际交付或状态,一句。)
- **达成率****XX%**
**➡️ 🎯 块后达成率复述****XX%**
**🧠 Human 3.0(复盘快扫)**
- **本质**:本轮真正对齐的需求或验收点。(一句,对应追问框架里「目标澄清」的复盘版。)
- **边界**:本轮明确**未做**或推到下一步的范围。(无则写 **无**。)
- **挑战**:仍可能不成立的**前提/假设**。(无则写 **无**;对应 CRITIC 的 Refute。
- **证据**:凭什么认为结果成立。(一句;如已跑测试/构建、已改某路径等,对应 Identify。
**☯ 奇门 Q门 3.0(项目盘)**
- **项目开发类**(写代码 / 改仓库 / 开发文档 110 / 部署 / 技术方案落地 / 命中火炬「全栈开发」「前端开发」「全栈测试」「项目开发占卜术」等):须按下方「奇门 Q门 3.0 叠层」**完整骨架**书写。
- **非开发类**:单独一行 — **☯ 奇门 Q门 3.0(项目盘)**:本回合非项目盘,八门不起;**盘势**与 🎯 **达成率**同源 **XX%**(须与上文一致)。
**📌 过程**
1. 第一步做了什么。(一句)
@@ -47,8 +74,49 @@
**▶ 下一步执行**
结合本对话与项目/卡若AI 整体目标,给出与当前任务、未完成项相关联的下一步规划;以实现目标为核心。必须包含本对话未完成或待跟进的文档/任务;无则写「无」。
**📊 复盘结束达成率复述****XX%**
```
---
## 奇门 Q门 3.0 叠层(与卡若复盘合体 · 项目开发类强制)
> **定位**:在 **🎯 达成率** 与 **🧠 Human 3.0** 之外,用 **八门** 做「项目盘」健康度扫描;**不是玄学断卦**,而是**可验收的八维完成度**与火炬「项目开发占卜术」Skill 对齐。
> **插入位置(固定)**:写在 **🧠 Human 3.0(复盘快扫)** 的**下一行**、**📌 过程**的**上一行****复盘块内仍禁止表格**,八门用**分行列表**。
### 何时必须写满八门
- **必须写满**:本回合主要涉及 **写代码 / 改仓库 / 开发文档 110 / 部署 / 技术方案落地**(命中 `全栈开发` / `前端开发` / `全栈测试` / **项目开发占卜术** 等火组开发技能)。
- **一行简写**:非开发类对话 — **☯** 行说明「八门不起」且 **盘势** 与 🎯 **达成率** 同源 **XX%**(须一致)。
### ☯ 块标题与骨架(复制用 · 无表格)
```markdown
**☯ 奇门 Q门 3.0(项目盘)**
- **盘势总完成度(数值)****XX%**(与 🎯「达成率」**一致**,或**一句说明**加权差异。)
- **盘势评估(信号灯)****🟢/🟡/🔴** + **一句**(八门是否整体在轨、有无死门/杜门拖尾。)
- **八门健康**(八行,每行格式固定;**每门须含百分比 YY%** + **🟢🟡🔴 之一** + **一句判词**
1. **开门**(对外·发布·验收):**YY%** · **🟢/🟡/🔴** · (一句)
2. **休门**(休整·技术债·可维护性):**YY%** · **🟢/🟡/🔴** · (一句)
3. **生门**(新功能·增长·交付增量):**YY%** · **🟢/🟡/🔴** · (一句)
4. **伤门**(缺陷·事故·返工):**YY%** · **🟢/🟡/🔴** · (一句;伤门越低越好时,说明「伤损已控」即可)
5. **杜门**(阻塞·依赖·等待):**YY%** · **🟢/🟡/🔴** · (一句)
6. **景门**(可见性·文档·演示·可观测):**YY%** · **🟢/🟡/🔴** · (一句)
7. **死门**(僵死代码·废弃路径·冻结需求):**YY%** · **🟢/🟡/🔴** · (一句;死门越低越好)
8. **惊门**(风险·合规·告警·未知):**YY%** · **🟢/🟡/🔴** · (一句)
**➡️ ☯ 块后盘势复述****XX%**(须与上条「盘势总完成度(数值)」**完全一致**。)
```
### 口径说明
- **百分比**:每门 **YY%** 表示该维度**当前迭代/本回合语境下**的「健康或完成度」主观估计,须与 **📌 过程** 可对照;**禁止**八门全写 100% 却无过程支撑。
- **与 🎯 关系****盘势总完成度** 默认 **等于** 🎯 **达成率**;若不等,必须在 ☯ 块首句脚注 **加权理由**
- **判责**:☯ 块**不替代** 🎯🧠📌💡📝▶;细节、命令、路径仍落在 📌 与 ▶。
---
**可选(仅当本对话涉及扫描任务时写):**
```
@@ -84,7 +152,7 @@
- ⚠️ 注意 · 🔴 重要 · 💡 提示
- 步骤前可用 ① ② ③ 或 1. 2. 3.
复盘块内**固定用图标识别各块**:🎯 目标·结果·达成率 · 📌 过程 · 💡 反思 · 📝 总结 · ▶ 下一步;其余段落按需选用,不喧宾夺主。
复盘块内**固定用图标识别各块**:🎯 · 📌 · 💡 · 📝 · ▶;叠层为 ➡️、🧠、☯、📊;其余段落按需选用,不喧宾夺主。
**日期时间与块标题的显示(强制避免 HTML 露标)**
在 Cursor、飞书、多数 Markdown 等场景下,**不要使用 HTML 标签**(如 `<span style="color:...">`),否则会显示为纯文本、露出标签。**一律用 Markdown 粗体**标出日期时间和各块小标题,保证任何环境都能正确显示:
@@ -99,19 +167,25 @@
## 书写要求(无表格,按条带图标)
- **📅 日期与时间**
每次复盘块标题**必须**写**具体日期**和**具体时间**(当次回复时的真实日期与时间,如 **2026-03-01 15:20**),不能写占位符;格式为 **YYYY-MM-DD HH:mm**,日期、时间都要写上去
每次复盘块标题**必须**写**具体日期**和**具体时间**(当次回复时的真实日期与时间,如 **2026-03-01 15:20**),不能写占位符;格式为 **YYYY-MM-DD HH:mm**
- **🏷️ 每块有图标**
🎯 目标·结果·达成率 · 📌 过程 · 💡 反思 · 📝 总结 · ▶ 下一步;每块用小图标做识别,不用表格。
主块:🎯 · 📌 · 💡 · 📝 · ▶叠层达成率复述×2、🧠 Human 3.0、☯(项目盘)、📊(结束达成率);不用表格。
- **🎯 目标·结果·达成率**
整行 ≤30 字(多任务可三句,每句仍 ≤30 字);同一行内写完目标、结果、达成率 XX%
- **🎯 目标·结果·达成率(极简)**
**仅三行****目标**、**结果**、**达成率XX%**。写完 🎯 后,**必须**单独一行 **➡️ 🎯 块后达成率复述XX%**(与达成率一致)
- **🧠 Human 3.0(复盘快扫)**
**每轮必填**,紧接在 **➡️ 🎯 块后达成率复述** 之后、**☯ 或 📌** 之前;四条:**本质 / 边界 / 挑战 / 证据**,每条一句(边界与挑战可无则写 **无**)。与 `04_卡火/火眼_智能追问/智能追问/SKILL.md` 中 Human 3.0「澄清—挑战假设—证据」精神一致。
- **☯ 奇门 Q门 3.0(项目盘)**
**项目开发类对话强制**写满八门骨架;**非开发类**一行简写「八门不起」且盘势与 🎯 同源。**➡️ ☯ 块后盘势复述** 与盘势总完成度一致。
- **📌 过程 / 💡 反思**
1 2 3 简短分行;中间可加流程图、示意图、图片。反思 13 点,每点一句;简洁、可执行、不空泛。
- **▶ 下一步执行**
结合**本对话与项目/卡若AI 整体目标**,给出与当前任务、未完成项**相关联**的下一步规划;**以实现目标为核心**;含未完成/待跟进文档或任务,无则写「无」。
结合**本对话与项目/卡若AI 整体目标**,给出与当前任务、未完成项**相关联**的下一步规划;**以实现目标为核心**;含未完成/待跟进文档或任务,无则写「无」。**▶ 写完后**必须再单独一行 **📊 复盘结束达成率复述XX%**(与 🎯 达成率一致)。
- **🚫 禁止**
不省略复盘、不写「见上文」;复盘标题不得缺时间;**复盘块内不用表格**。
@@ -120,7 +194,7 @@
## 强制执行
- **卡若AI 内所有对话**AI 的回复**一律用复盘形式**。**复盘格式永远只有一种**:本文件中的完整复盘块(含 🎯📌💡📝▶ 五块,每块带小图标识别**禁止在复盘块内使用表格**;复盘标题**除日期外必须带时间YYYY-MM-DD HH:mm**目标·结果·达成率整行 ≤30 字、必须含百分比;下一步须结合对话与项目目标、关联未完成项、以实现目标为核心。
- **卡若AI 内所有对话**AI 的回复**一律用复盘形式**。**复盘格式永远只有一种**:本文件中的完整复盘块(含 🎯📌💡📝▶ 五主块 + 叠层 **➡️ 🧠 ☯(按场景)📊****禁止在复盘块内使用表格**;复盘标题**除日期外必须带时间YYYY-MM-DD HH:mm****🎯 仅三行 + 达成率 XX%****➡️ 🎯 块后达成率复述** 与 **📊 复盘结束达成率复述** 两处百分比须与 🎯 **达成率**一致;**🧠 Human 3.0(复盘快扫)每轮必填**(本质/边界/挑战/证据);**项目开发类须叠加 ☯**(八门 + **➡️ ☯ 块后盘势复述**;下一步须结合对话与项目目标、关联未完成项、以实现目标为核心。
- **唯一格式**:仅此一种;`.cursor/rules/karuo-ai.mdc` 与交互流程均引用本文件。
---
@@ -130,3 +204,4 @@
- 规则:`.cursor/rules/karuo-ai.mdc` → 对话结束时强制本格式。
- 交互流程:`卡若AI交互流程与强制执行条件.md` § 五 与本文件一致。
- 执行流程:`卡若AI执行流程与对话全流程.md` 步骤 7 与本文件一致。
- Human 3.0 详本:`04_卡火/火眼_智能追问/智能追问/SKILL.md``.../参考资料/Human3.0提问法.md`

View File

@@ -1,8 +1,8 @@
# 技能控制台
> **控制台**:技能配置、安装、删除、登记与掌管人一览。所有 Skill 的配置说明、参数、安装/删除流程统一由此入口管理。
> 64 技能 | 14 成员 | 5 负责人 | 与 `SKILL_REGISTRY.md` 一一对应
> 版本1.3 | 更新2026-03-23
> 技能数以 `SKILL_REGISTRY.md` 头注为准 | 14 成员 | 5 负责人 | 与 `SKILL_REGISTRY.md` 一一对应
> 版本1.4 | 更新2026-03-26
---

View File

@@ -435,3 +435,4 @@
| 2026-03-23 20:13:01 | 🔄 卡若AI 同步 2026-03-23 20:12 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 |
| 2026-03-23 20:44:48 | 🔄 卡若AI 同步 2026-03-23 20:44 | 更新:金仓、水溪整理归档、运营中枢工作台 | 排除 >20MB: 11 个 |
| 2026-03-23 20:44:56 | 🔄 卡若AI 同步 2026-03-23 20:44 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 11 个 |
| 2026-03-24 09:50:31 | 🔄 卡若AI 同步 2026-03-24 09:49 | 更新:金仓、水桥平台对接、卡木、运营中枢工作台 | 排除 >20MB: 11 个 |

View File

@@ -438,3 +438,4 @@
| 2026-03-23 20:13:01 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-23 20:12 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-23 20:44:48 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-23 20:44 | 更新:金仓、水溪整理归档、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-23 20:44:56 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-23 20:44 | 更新:金仓、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
| 2026-03-24 09:50:31 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-24 09:49 | 更新:金仓、水桥平台对接、卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |

View File

@@ -135,4 +135,30 @@
---
## 十一、2026-03-24 更新:飞书「龙猫」应用新建与阿猫龙虾落地
| 项目 | 说明 |
|------|------|
| **新建应用** | 已在飞书开放平台新建企业自建应用 **龙猫**App ID`cli_a948fbf8b1b81ceb`。 |
| **当前阻塞** | 该新应用的 **App Secret** 仍为掩码态,未拿到明文前不能切换到该 App ID否则龙虾飞书通道会认证失败。 |
| **阿猫龙虾现状** | `~/.openclaw/openclaw.json` 已收敛为 `feishu.accounts.longmao` 单账号,默认账号为 `longmao``botName=龙猫`,私聊/群聊策略均为 `open`。 |
| **已验证** | `openclaw channels status --probe --json` 显示 `feishu.running=true``probe.ok=true`,当前在用可用应用 `cli_a48818290ef8100d`。 |
| **兼容策略** | 为保证业务不中断,先维持可用 App 运行;拿到新应用 Secret 后再原子切换到 `cli_a948fbf8b1b81ceb`。 |
---
## 十二、2026-03-25 更新:飞书「能发不收 / 龙虾不回」根因与修复
| 项目 | 说明 |
|------|------|
| **现象** | 飞书侧可对龙猫发消息,但龙虾长时间无自动回复;网关日志曾大量出现 `[ws] timeout`、偶发 `getaddrinfo ENOTFOUND open.feishu.cn`;模型侧曾出现 `403 Your request was blocked`Cloudflare **error code: 1010**)。 |
| **根因 ①(模型)** | `api123.icu`**Node/OpenClaw 默认 HTTP 指纹** 拦截;对 **curl** 放行。复现:本机 `urllib` 默认 UA → 403改为 `User-Agent: curl/8.7.1` → 200。 |
| **修复 ①** | 在 `~/.openclaw/openclaw.json``models.providers.api123-icu` 增加 `headers.User-Agent`(值为 `curl/8.7.1` 或等价 curl UA并重启网关。 |
| **根因 ②(上下文)** | 飞书群会话 `1186cd2b-…` 单轮上报 **~10.7 万 input tokens**,随后多轮 `assistant.content` 为空output 0用户侧表现为「完全不回」。 |
| **修复 ②** | 已备份并删除该群的 `sessions.json` 条目与对应 `*.jsonl`(备份后缀 `20260325_131134`),并设置 `agents.defaults.contextTokens: 120000` 作为窗口上限,迫使后续请求处于可控上下文。 |
| **根因 ③(链路)** | 飞书 **长连接 WebSocket** 曾长时间无法 `ws client ready`(与网络/DNS/代理切换相关);修复模型与上下文后需保证网关日志出现 `ws client ready`。 |
| **验收** | 阿猫在目标群再发一句短消息(如「测回复」);网关日志应出现 `received message``dispatch complete`;飞书侧应收到龙虾回复。 |
---
*文档生成卡若AI 工作台。*