🔄 卡若AI 同步 2026-03-26 05:02 | 更新:Cursor规则、总索引与入口、金仓、金盾、水桥平台对接、水溪整理归档、卡木、火炬、运营中枢、运营中枢参考资料等 | 排除 >20MB: 12 个
This commit is contained in:
@@ -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% 与 🎯 达成率一致)。**项目开发类**(写代码/改仓库/开发文档 1~10/部署/命中火炬「全栈开发」「前端开发」「全栈测试」「项目开发占卜术」等)须在 **🧠 之后、📌 之前** 增加 **☯ 奇门 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`
|
||||
- **数据库**:一律用唯一 MongoDB(27017,库名 `karuo_site`);卡若 AI 调用以此库为主(记忆条目、对话记录、消息内容)
|
||||
|
||||
14
.cursor/skills/project-dev-qimen/SKILL.md
Normal file
14
.cursor/skills/project-dev-qimen/SKILL.md
Normal 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
1
.gitignore
vendored
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
]
|
||||
}
|
||||
17
01_卡资(金)/金仓_存储备份/聊天记录管理/脚本/run_chat_index_check_daily.sh
Executable file
17
01_卡资(金)/金仓_存储备份/聊天记录管理/脚本/run_chat_index_check_daily.sh
Executable 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
|
||||
14
01_卡资(金)/金仓_存储备份/聊天记录管理/脚本/run_chat_sync_incremental.sh
Executable file
14
01_卡资(金)/金仓_存储备份/聊天记录管理/脚本/run_chat_sync_incremental.sh
Executable 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
|
||||
@@ -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 一键部署 |
|
||||
|
||||
@@ -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
|
||||
|
||||
================================================
|
||||
|
||||
95
01_卡资(金)/金盾_数据安全/远程环境一键部署/package/deploy_linux.sh
Executable file
95
01_卡资(金)/金盾_数据安全/远程环境一键部署/package/deploy_linux.sh
Executable 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)"
|
||||
@@ -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)"
|
||||
|
||||
@@ -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)"
|
||||
|
||||
@@ -20,7 +20,7 @@ updated: "2026-03-14"
|
||||
|
||||
| 子类 | 触发词示例 | 说明 |
|
||||
|:---|:---|:---|
|
||||
| **写作** | 写Soul文章、写授文章、Soul派对写文章、第9章写文章、写soul场次、soul文章规则 | 按派对 TXT 写第9章单场文章,**先读** `写作/写作规范.md`:人称用「我」不用「房主」、每句空一行、大白话;**6:3:1 内容比例**(60% 核心 / 30% 次要 / 10% 其它);**约 50% 处插入核心干货块**(3~5 条可执行、紧扣主题);**数值与场景必须具体**;**约 20% 处 + 结尾各一句分享句**;联系管理/切片/副业隐晦植入 |
|
||||
| **写作** | 写Soul文章、写授文章、Soul派对写文章、第9章写文章、写soul场次、soul文章规则 | 按派对 TXT 写第9章单场文章,**先读** `写作/写作规范.md`:人称用「我」不用「房主」、每句空一行、大白话;**默认 3:7**(约 30% 核心主题 + 约 70% 子题拆分)+ **标题/文件名/开篇同一刺点**;单主题可选用 6:3:1;**约 50% 处插入要点块**(3~6 条);**数值与场景必须具体**;**约 20% 处 + 结尾各一句分享句**;联系管理/切片/副业隐晦植入 |
|
||||
| **上传** | Soul文章上传、Soul派对文章、第9章上传、soul上传、写soul文章、文章写好上传 | **仅在你明确说上传时才执行**。上传到小程序;**飞书群推送默认不执行**,只有你说「发飞书」「推飞书」「同步飞书群」时才发。推送内容:前 6% 正文(一句一行、行间空一行)+ 海报图,不发小程序链接,见 `上传/README.md` |
|
||||
| **运营报表** | 运营报表、派对填表、派对截图填表发群、派对纪要、106场、107场、本月运营数据 | 派对效果数据→飞书表格→智能纪要→飞书群,见飞书管理下运营报表 Skill |
|
||||
|
||||
|
||||
@@ -22,8 +22,11 @@
|
||||
| `---` 分割线 | 易错乱 |
|
||||
| `→` 箭头 | 用「到」等中文替代 |
|
||||
| `##` 小标题 | 用「一、二、三」或数字,或纯空行分段 |
|
||||
| `@`、`#` 社交标记 | 易被当乱码或误解析;人名、话题直接写汉字 |
|
||||
| 连续多行空行 | 易挤出大片空白;段落之间一行空白即可 |
|
||||
|
||||
- 每句空一行;小节用空行分段;标题不含章节号(如「9.15」)时,上传命令的 `--title` 用「主题|副标题」即可。
|
||||
- 书稿可保留口语排版;上传前书稿宜与上表一致,`content_upload.py` 内会对 `---` 做转换并建议书稿自行去掉 `**`。
|
||||
- 小节用空行分段;标题不含章节号(如「9.15」)时,上传命令的 `--title` 用「主题|副标题」即可。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -30,9 +30,11 @@
|
||||
|
||||
## 三、主题与结构
|
||||
|
||||
- **一个观点**:每节只表达一个核心观点,主题清晰
|
||||
- **6:3:1 内容比例(强制)**:全文内容按比例分配——**60% 第一重要**(核心主题,紧扣本节标题)、**30% 第二重要**(支撑、案例、延伸)、**10% 其它**(点缀、过渡、一笔带过)。成稿后自查:核心是否占六成、次要三成、其它一成。
|
||||
- **中间核心干货块(强制)**:约 50% 处插入**一段浓缩要点**,3~5 条可执行、紧扣本节主题,单独成段、用 `---` 与其他段分隔;**不要出现「干货」二字**,直接写金句式要点,每条约 20~40 字。
|
||||
- **核心命题**:每节有**一个核心主题**(如物业盘活、视频号中枢等),主题清晰;核心之下允许拆**多个子主题**,不必压成单观点长文。
|
||||
- **刺点三对齐(强制)**:**正文第一行标题**(`# 第X场|短句`)、**磁盘文件名**、**开篇刺激性观点**(首句或紧接开篇数据前的金句)必须是**同一刺点**——一句能挑人、能站队的判断,不抒情、不空泛。
|
||||
- **3:7 内容比例(强制,场次默认)**:**约 30%** 写**核心主题本身**(只保留骨架:定义、关键条件、主线逻辑,不堆长案例);**约 70%** **往下拆子主题**(平台差异、执行 SOP、财税与合规边界、风险、人设、招商细节、当天场子对照等)。子题可用「子题一、子题二」或隐于叙述,不强制标号。成稿后自查:核心是否控在约三成、展开是否约占七成。
|
||||
- **6:3:1(备选)**:若某节**单一主题、不分拆**,可采用旧比例 **60% 核心 / 30% 支撑 / 10% 其它**,在文首或文末注明「本节单主题结构」即可。
|
||||
- **中间核心干货块(强制)**:约 50% 处插入**一段浓缩要点**,3~6 条可执行、紧扣本节(可覆盖核心+子题),单独成段、用 `---` 与其他段分隔;**不要出现「干货」二字**,直接写金句式要点,每条约 20~40 字。
|
||||
- **有数据**:用具体数值验证(场观、人数、时长、营收等);**数值与场景必须具体**,不写笼统表述,有提到的算法、成本、比例都要带具体数字写进去(如 Soul 推流 75 曝光进 1 人、3 万曝光/天、投流 1000 曝光 6~10 块等)
|
||||
- **与目录一致**:小节名称、内容与全书结构、其他小节风格统一
|
||||
- **时间**:以文档/聊天记录时间为准
|
||||
@@ -98,6 +100,6 @@
|
||||
- 对话、细节、观点分行,避免大段堆砌
|
||||
- 用 `---` 做段落分隔(与全书一致)
|
||||
- **分享句**:全文约 20% 处一句(≤50 字)、结尾一句(≤50 字、围绕主题);**不用「干货」二字及「干货:」等格式**,直接一句金句
|
||||
- **6:3:1 + 核心干货**:内容比例 60% 核心 / 30% 次要 / 10% 其它;约 50% 处插入核心干货块(3~5 条、紧扣主题、可执行),见第三节
|
||||
- **文件名(强制)**:第9章场次可用「第X场.md」或「第X场-短句.md」体现刺激性观点/效率;短句**不含空格、逗号、全角符号**(如 `第114场-有AI差1万倍.md`、`第115场-可控的事先做.md`),标题同步放在正文第一行,否则部分编辑器会报错。
|
||||
- **3:7 + 刺点对齐 + 核心干货**:默认 **约 30% 核心主题 + 约 70% 子题拆分**;标题、文件名、开篇同一刺点;约 50% 处插入要点块(3~6 条),见第三节。单主题场次可选用 6:3:1。
|
||||
- **文件名(强制)**:第9章场次文件名与正文第一行标题**同一刺点**;可用「第X场|短句.md」或「第X场-短句.md」。若用连字符形式,短句**不含空格、逗号、全角符号**(如 `第114场-有AI差1万倍.md`);用竖线「|」时与标题完全一致即可。
|
||||
- 写作与改写第9章场次时,**必须先读本规范**,并**先阅读运营报表**,报表上有数字的(时长、场观、进房等)都写进开篇数据段、写清楚;以后写 Soul 派对场次文章都用这套
|
||||
|
||||
153
02_卡人(水)/水桥_平台对接/智能纪要/output/开发团队会议纪要_智能纪要图_20260324.html
Normal file
153
02_卡人(水)/水桥_平台对接/智能纪要/output/开发团队会议纪要_智能纪要图_20260324.html
Normal 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>
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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;无总热度/礼物展示填0;Soul推流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'),
|
||||
],
|
||||
}
|
||||
|
||||
# 小程序当日运营数据:日期号 → {访问次数, 访客, 交易金额},填表时自动写入对应日期列
|
||||
|
||||
@@ -1 +1 @@
|
||||
2026-03-23
|
||||
2026-03-25
|
||||
@@ -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
@@ -7,24 +7,25 @@ description: >
|
||||
triggers: 多平台分发、一键分发、全平台发布、批量分发、视频分发
|
||||
owner: 木叶
|
||||
group: 木
|
||||
version: "4.5"
|
||||
updated: "2026-03-23"
|
||||
version: "4.6"
|
||||
updated: "2026-03-25"
|
||||
---
|
||||
|
||||
# 多平台分发 Skill(v4.5)
|
||||
# 多平台分发 Skill(v4.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
90
03_卡木(木)/木叶_视频内容/多平台分发/脚本/channels_full_chain.py
Normal file
90
03_卡木(木)/木叶_视频内容/多平台分发/脚本/channels_full_chain.py
Normal 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())
|
||||
@@ -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_state(legacy 或 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 双路径对齐:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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到5000,100部真人剧的成本做100部AI剧.mp4", "title": "AI一部剧3000到5000,100部真人剧的成本做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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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_raw(rawKeyBuff),post_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"}
|
||||
|
||||
@@ -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]:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
36
03_卡木(木)/木叶_视频内容/多平台分发/脚本/upload_library.jsonl
Normal file
36
03_卡木(木)/木叶_视频内容/多平台分发/脚本/upload_library.jsonl
Normal 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"}
|
||||
@@ -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": "生活 > 日常"},
|
||||
|
||||
83
03_卡木(木)/木叶_视频内容/多平台分发/脚本/web_f12_platform_template.py
Normal file
83
03_卡木(木)/木叶_视频内容/多平台分发/脚本/web_f12_platform_template.py
Normal 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"))
|
||||
224
03_卡木(木)/木叶_视频内容/多平台分发/脚本/web_f12_sdk.py
Normal file
224
03_卡木(木)/木叶_视频内容/多平台分发/脚本/web_f12_sdk.py
Normal 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
File diff suppressed because one or more lines are too long
87
03_卡木(木)/木叶_视频内容/知乎发布/脚本/zhihu_f12_profile.py
Normal file
87
03_卡木(木)/木叶_视频内容/知乎发布/脚本/zhihu_f12_profile.py
Normal 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
|
||||
53
03_卡木(木)/木叶_视频内容/知乎发布/脚本/zhihu_login.py
Normal file
53
03_卡木(木)/木叶_视频内容/知乎发布/脚本/zhihu_login.py
Normal 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())
|
||||
640
03_卡木(木)/木叶_视频内容/知乎发布/脚本/zhihu_publish.py
Normal file
640
03_卡木(木)/木叶_视频内容/知乎发布/脚本/zhihu_publish.py
Normal 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
|
||||
# 抓到成功分片/直传响应后,再给前端 6~10s 渲染标题区
|
||||
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()))
|
||||
1
03_卡木(木)/木叶_视频内容/知乎发布/脚本/zhihu_storage_state.json
Normal file
1
03_卡木(木)/木叶_视频内容/知乎发布/脚本/zhihu_storage_state.json
Normal file
File diff suppressed because one or more lines are too long
192
03_卡木(木)/木叶_视频内容/知乎发布/脚本/zhihu_web_cli.py
Normal file
192
03_卡木(木)/木叶_视频内容/知乎发布/脚本/zhihu_web_cli.py
Normal file
@@ -0,0 +1,192 @@
|
||||
#!/usr/bin/env python3
|
||||
"""知乎网页 CLI:check / 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())
|
||||
@@ -1,10 +1,10 @@
|
||||
---
|
||||
name: Soul竖屏切片
|
||||
description: Soul 派对视频→竖屏成片;高光**单主题完整**(1~5min/条,每场约 8~12 条)、去穿插话题;封面底**约 10% 轻模糊**(非全糊)。字幕用**得意黑描边白字**(无底色)、纠错+关键词金黄高亮、逐字渐显;**表情贴片默认开启**;流程:裁剪检查→soul_enhance。MLX→visual_enhance v8 可选。
|
||||
description: Soul 派对视频→竖屏成片;高光**单主题完整**(1~5min/条,每场约 8~12 条)、去穿插话题;**前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`。
|
||||
|
||||
@@ -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.py(20% 帧、扩边到桌面白 + 横向 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_times(whisper 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")
|
||||
|
||||
# ── 路径 A:word-level 时间轴(精准逐词) ────────────────────────────
|
||||
if word_times and len(word_times) > 1:
|
||||
# ── 路径 A:word-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,
|
||||
)
|
||||
|
||||
|
||||
@@ -6,11 +6,11 @@ description: >
|
||||
triggers: 视频号发布、发布到视频号、视频号登录、视频号上传、微信视频号
|
||||
owner: 木叶
|
||||
group: 木
|
||||
version: "3.1"
|
||||
updated: "2026-03-23"
|
||||
version: "3.2"
|
||||
updated: "2026-03-24"
|
||||
---
|
||||
|
||||
# 视频号发布 Skill(v3.0)
|
||||
# 视频号发布 Skill(v3.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` 为目标时间(允许秒级偏差)
|
||||
|
||||
任一不满足即判失败,不允许继续批量发下一条。
|
||||
|
||||
@@ -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(
|
||||
|
||||
58
03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_f12_profile.py
Normal file
58
03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_f12_profile.py
Normal 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
|
||||
197
03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_guardian.py
Normal file
197
03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_guardian.py
Normal 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())
|
||||
36
03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_guardian_state.json
Normal file
36
03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_guardian_state.json
Normal 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/成片"
|
||||
}
|
||||
@@ -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__":
|
||||
|
||||
@@ -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:
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because one or more lines are too long
@@ -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"
|
||||
}
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
33
03_卡木(木)/木叶_视频内容/视频号发布/脚本/login_wait_and_publish.sh
Executable file
33
03_卡木(木)/木叶_视频内容/视频号发布/脚本/login_wait_and_publish.sh
Executable 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
|
||||
13
03_卡木(木)/木叶_视频内容/视频号发布/脚本/publish_auto.sh
Executable file
13
03_卡木(木)/木叶_视频内容/视频号发布/脚本/publish_auto.sh
Executable 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 "$@"
|
||||
@@ -4,8 +4,8 @@ description: 卡若AI 全栈开发(火炬)— 知己及类似项目经验 +
|
||||
triggers: 全栈开发/知己项目/分销/存客宝/RAG/向量化/Next.js/知识库/卡若AI官网/官网开发/全站开发/开发文档/1~10/开发模板/官网全站/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"
|
||||
- **1~10 目录**:需求 | 架构 | 原型 | 前端 | 接口 | 后端 | 数据库 | 部署 | 手册 | 项目管理。
|
||||
- **入口**:第一次用先读 `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 扩充) |
|
||||
| **火炬「项目开发占卜术」Skill(F01c · 演门测机)** | **奇门 Q门 3.0** 八门健康度 + **☯ 复盘叠层**;与 `卡若复盘格式_固定规则.md` 强制对齐;迭代收尾/起盘必交叉引用 |
|
||||
|
||||
---
|
||||
|
||||
|
||||
55
04_卡火(火)/火炬_全栈消息/项目开发占卜术/SKILL.md
Normal file
55
04_卡火(火)/火炬_全栈消息/项目开发占卜术/SKILL.md
Normal 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 负责 1~10、计划、评审、代码落地;**本 Skill** 负责 **收尾复盘时的八门盘 + 百分比口径统一**。
|
||||
- 两 Skill **同时命中**时:先按全栈流程交付,再用本 Skill **起盘写 ☯**。
|
||||
|
||||
---
|
||||
|
||||
## 四、引用
|
||||
|
||||
- 复盘母体:`运营中枢/参考资料/卡若复盘格式_固定规则.md`(含 ☯ 模板全文)。
|
||||
- Cursor 规则:`.cursor/rules/karuo-ai.mdc`(强制复盘 + 开发类 ☯)。
|
||||
- 登记:`SKILL_REGISTRY.md` **F01c**。
|
||||
@@ -43,14 +43,14 @@
|
||||
- **细粒度拆解**,执行计划带精确路径/命令/预期
|
||||
- **技能联动**:执行前检查联动子技能
|
||||
- **至少两轮验证**;不通过则回溯→搜索→再执行
|
||||
- **复盘五块齐全**(🎯📌💡📝▶),可带数据与引用
|
||||
- **复盘主块齐全**(🎯📌💡📝▶)+ **叠层**(➡️ 达成率双复述、🧠 Human 3.0 复盘快扫、开发类 ☯ 项目盘、📊 结束复述),可带数据与引用;细则见 `运营中枢/参考资料/卡若复盘格式_固定规则.md`
|
||||
- **可拆任务 1~6 线程并行**:划界归域→独立处理→汇总。详见 `运营中枢/参考资料/多线程并行处理规范.md`
|
||||
|
||||
## 五、执行流程(强制)
|
||||
|
||||
**第一步:先思考,在对话中以详细文字展示拆解与计划**
|
||||
- 必须先深度思考再动手。在对话里用**详细文字**展示:① 思考结果 ② 任务拆解(1,2,3…细粒度) ③ 执行计划(带路径/命令/预期)。展示完再执行。禁止不展示直接动手。
|
||||
- **例外**:用户明确要求「直接做 / 不要罗列 / 别讲写了什么」时,**可跳过本步长文**,先改代码与验证,正文极简;**第四步 Mongo 留存 + 复盘五块仍必须**。
|
||||
- **例外**:用户明确要求「直接做 / 不要罗列 / 别讲写了什么」时,**可跳过本步长文**,先改代码与验证,正文极简;**第四步 Mongo 留存 + 完整复盘(主块+叠层)仍必须**。
|
||||
- 执行前检查联动子技能;可拆任务启用 1~6 线程并行。
|
||||
|
||||
**第二步:执行**
|
||||
@@ -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` |
|
||||
|
||||
@@ -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官网、官网开发、全站开发、开发文档、1~10**、**埋点、点击统计、用户行为、行为统计、数据统计、点击锚点、锚点、trackClick** | `04_卡火(火)/火炬_全栈消息/全栈开发/SKILL.md` | 全栈项目 + 官网/全站与开发文档 1~10;**§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` | 五行框架拆书 |
|
||||
|
||||
@@ -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 | 💡 | **反思** | 可复用点、改进点 | 1~3 点 |
|
||||
| 4 | 📝 | **总结** | 一两句结论或经验 | 简洁 |
|
||||
| 5 | ▶ | **下一步执行** | 结合项目目标的后续动作 | 关联未完成项 |
|
||||
**五个主块**:书写时**每块标题必须带图标 + 粗体**,例如:**🎯 目标·结果·达成率**、**📌 过程**、**💡 反思**、**📝 总结**、**▶ 下一步执行**。
|
||||
|
||||
**叠层(插在主块之间,顺序固定)**:
|
||||
|
||||
1. **➡️ 🎯 块后达成率复述**:与 🎯 内 **达成率** 同数值。
|
||||
2. **🧠 Human 3.0(复盘快扫)**:**本质 / 边界 / 挑战 / 证据** 各一句(边界与挑战可无则写「无」);与火组「智能追问」Skill 中 Human 3.0 + CRITIC 对齐。
|
||||
3. **☯ 奇门 Q门 3.0(项目盘)**:**写代码/改仓库/部署等项目类**写满八门;**非开发类**一行说明「八门不起」且盘势与 🎯 同源。
|
||||
4. **📊 复盘结束达成率复述**:写在 **▶** 之后,与 🎯 **达成率** 同数值。
|
||||
|
||||
**主块内容要点**:
|
||||
|
||||
- **🎯**:仅三行 — **目标**(一句)、**结果**(一句)、**达成率**(**XX%**)。
|
||||
- **📌**:1、2、3 分点简述过程;复盘块内不用表格。
|
||||
- **💡**:1~3 点反思。
|
||||
- **📝**:一两句总结。
|
||||
- **▶**:下一步;无则写「无」。
|
||||
|
||||
## 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 可选扩展块
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
2. **(可选)** 若本轮明确知道对话 ID,可指定:
|
||||
`python3 .../realtime_chat_sync.py --current-conversation-id <UUID>`
|
||||
|
||||
3. 再写 **强制复盘**(🎯📌💡📝▶),见 `卡若复盘格式_固定规则.md`。
|
||||
3. 再写 **强制复盘**(🎯📌💡📝▶ 五主块 + ➡️🧠 Human 3.0 + 开发类 ☯ + 📊),见 `卡若复盘格式_固定规则.md`。
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -1,16 +1,17 @@
|
||||
# 卡若复盘格式(固定规则)
|
||||
|
||||
> **强制规则。** 卡若AI 内**复盘格式永远只有一种**:完整复盘。**每一轮回复、每一个步骤结束**,均以**完整复盘块**收尾,不得使用简版或省略。**复盘块标题除日期外必须带时间**(YYYY-MM-DD HH:mm)。**复盘块内不用表格**,各块以**小图标 + 小标题**识别。
|
||||
> **强制规则。** 卡若AI 内**复盘格式永远只有一种**:完整复盘。**每一轮回复、每一个步骤结束**,均以**完整复盘块**收尾,不得使用简版或省略。**复盘块标题除日期外必须带时间**(YYYY-MM-DD HH:mm)。**复盘块内不用表格**,各块以**小图标 + 小标题**识别。
|
||||
> **v3.1(2026-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 | 💡 | **反思** | 1~3 点:做得好的 / 可改进的 |
|
||||
| 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(项目盘)**
|
||||
- **项目开发类**(写代码 / 改仓库 / 开发文档 1~10 / 部署 / 技术方案落地 / 命中火炬「全栈开发」「前端开发」「全栈测试」「项目开发占卜术」等):须按下方「奇门 Q门 3.0 叠层」**完整骨架**书写。
|
||||
- **非开发类**:单独一行 — **☯ 奇门 Q门 3.0(项目盘)**:本回合非项目盘,八门不起;**盘势**与 🎯 **达成率**同源 **XX%**(须与上文一致)。
|
||||
|
||||
**📌 过程**
|
||||
1. 第一步做了什么。(一句)
|
||||
@@ -47,8 +74,49 @@
|
||||
|
||||
**▶ 下一步执行**
|
||||
结合本对话与项目/卡若AI 整体目标,给出与当前任务、未完成项相关联的下一步规划;以实现目标为核心。必须包含本对话未完成或待跟进的文档/任务;无则写「无」。
|
||||
|
||||
**📊 复盘结束达成率复述**:**XX%**
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 奇门 Q门 3.0 叠层(与卡若复盘合体 · 项目开发类强制)
|
||||
|
||||
> **定位**:在 **🎯 达成率** 与 **🧠 Human 3.0** 之外,用 **八门** 做「项目盘」健康度扫描;**不是玄学断卦**,而是**可验收的八维完成度**,与火炬「项目开发占卜术」Skill 对齐。
|
||||
> **插入位置(固定)**:写在 **🧠 Human 3.0(复盘快扫)** 的**下一行**、**📌 过程**的**上一行**;**复盘块内仍禁止表格**,八门用**分行列表**。
|
||||
|
||||
### 何时必须写满八门
|
||||
|
||||
- **必须写满**:本回合主要涉及 **写代码 / 改仓库 / 开发文档 1~10 / 部署 / 技术方案落地**(命中 `全栈开发` / `前端开发` / `全栈测试` / **项目开发占卜术** 等火组开发技能)。
|
||||
- **一行简写**:非开发类对话 — **☯** 行说明「八门不起」且 **盘势** 与 🎯 **达成率** 同源 **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 简短分行;中间可加流程图、示意图、图片。反思 1~3 点,每点一句;简洁、可执行、不空泛。
|
||||
|
||||
- **▶ 下一步执行**
|
||||
结合**本对话与项目/卡若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`。
|
||||
|
||||
@@ -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
|
||||
|
||||
---
|
||||
|
||||
|
||||
@@ -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 个 |
|
||||
|
||||
@@ -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) |
|
||||
|
||||
@@ -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 工作台。*
|
||||
|
||||
Reference in New Issue
Block a user