🔄 卡若AI 同步 2026-03-10 20:55 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个
This commit is contained in:
@@ -313,9 +313,15 @@ async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1,
|
||||
|
||||
|
||||
async def main():
|
||||
if not COOKIE_FILE.exists():
|
||||
print("[✗] Cookie 不存在,请先运行 bilibili_login.py")
|
||||
from cookie_manager import check_cookie_valid
|
||||
|
||||
print("=== 账号预检 ===", flush=True)
|
||||
ok, info = check_cookie_valid("B站")
|
||||
print(f" B站: {info}", flush=True)
|
||||
if not ok:
|
||||
print("[✗] 账号预检不通过,终止发布", flush=True)
|
||||
return 1
|
||||
print()
|
||||
|
||||
videos = sorted(VIDEO_DIR.glob("*.mp4"))
|
||||
if not videos:
|
||||
|
||||
@@ -7,11 +7,11 @@ description: >
|
||||
triggers: 多平台分发、一键分发、全平台发布、批量分发、视频分发
|
||||
owner: 木叶
|
||||
group: 木
|
||||
version: "3.0"
|
||||
version: "3.1"
|
||||
updated: "2026-03-10"
|
||||
---
|
||||
|
||||
# 多平台分发 Skill(v3.0)
|
||||
# 多平台分发 Skill(v3.1)
|
||||
|
||||
> **核心能力**:一条命令将成片目录下的所有视频同时发布到 5 个主流平台。
|
||||
> **平台覆盖**:抖音、B站、视频号、小红书、快手。
|
||||
@@ -24,11 +24,11 @@ updated: "2026-03-10"
|
||||
|
||||
| 平台 | 实现方式 | 定时发布 | Cookie 有效期 | 119 场实测 |
|
||||
|------|----------|----------|---------------|------------|
|
||||
| **抖音** | 纯 API(VOD + bd-ticket-guard) | API timing_ts | ~2-4h | Cookie 过期需重新登录 |
|
||||
| **B站** | bilibili-api-python API 优先 → Playwright 兜底 | API dtime | ~6 个月 | 13/13 成功 |
|
||||
| **视频号** | Playwright headless 自动化 | UI 定时(降级立即) | ~12 个月 | 13/13 成功 |
|
||||
| **小红书** | Playwright headless 自动化 | UI 定时(降级立即) | ~12 个月 | 14/14 成功 |
|
||||
| **快手** | Playwright headless 自动化 | UI 定时成功 | ~21 天 | 12/12 成功(含重试) |
|
||||
| **抖音** | 纯 API(VOD + bd-ticket-guard) | API timing_ts | ~2-4h | 账号封禁,预检拦截 |
|
||||
| **B站** | bilibili-api-python API 优先 → Playwright 兜底 | API dtime | ~6 个月 | 15/15 成功 |
|
||||
| **视频号** | Playwright headless 自动化 | UI 定时(降级立即) | ~24-48h | 15/15 成功 |
|
||||
| **小红书** | Playwright headless v2 自动化 | UI 定时(降级立即) | ~1-3 天 | 15/15 成功(修复后) |
|
||||
| **快手** | Playwright headless 自动化 | UI 定时成功 | ~7-30 天 | 15/15 成功(含重试) |
|
||||
|
||||
---
|
||||
|
||||
@@ -199,7 +199,8 @@ info = get_video_info("/path/to/video.mp4")
|
||||
| `脚本/schedule_helper.py` | Playwright 定时发布 UI 交互辅助 |
|
||||
| `脚本/publish_result.py` | 统一 PublishResult + 日志 + 去重 |
|
||||
| `脚本/title_generator.py` | 智能标题(字典优先 → 文件名自动) |
|
||||
| `脚本/cookie_manager.py` | Cookie 统一管理(有效期检查、防重复) |
|
||||
| `脚本/cookie_manager.py` | Cookie 统一管理(有效期检查、API 预检 5 平台) |
|
||||
| `脚本/content_filter.py` | 敏感词/风控词过滤(政治、金融、医疗、平台词,70+ 替换映射) |
|
||||
| `脚本/video_utils.py` | 视频处理(封面提取、元数据) |
|
||||
|
||||
---
|
||||
@@ -232,6 +233,44 @@ info = get_video_info("/path/to/video.mp4")
|
||||
- **影响**:视频号/小红书/快手 三路 Playwright 并行,部分上传时间从 2s 涨到 5s
|
||||
- **建议**:服务器部署时限制并发数(如最多 3 个 Playwright 同时)
|
||||
|
||||
### 10.6 小红书发布按钮点击不生效(119场)
|
||||
- **现象**:脚本日志声称 15/15 成功,实际只有 4 条到达平台
|
||||
- **根因**:初版 `pub.click(force=True)` 失败率高达 ~70%,且成功判定逻辑过于宽松(默认 status="reviewing")
|
||||
- **修复**:
|
||||
1. JS 精准点击红色发布按钮(用 `getComputedStyle` 筛选 backgroundColor 含 255 的 button)
|
||||
2. Playwright `force-click` 兜底
|
||||
3. 处理二次确认弹窗
|
||||
4. 未检测到明确成功信号时,跳转到笔记管理页二次验证
|
||||
5. 连续 3 次失败自动熔断(防封号)
|
||||
- **成功率**:修复后 10/10(100%)
|
||||
|
||||
### 10.7 小红书假成功日志污染去重(119场)
|
||||
- **现象**:publish_log.json 记录 15 条 success=True,导致去重跳过,不会重试
|
||||
- **根因**:旧版 success 判定将所有未报错的提交都标记为 success
|
||||
- **修复**:
|
||||
1. 清理 publish_log.json 中的虚假记录
|
||||
2. 只有明确的成功信号(页面重置、URL 跳转、"发布成功"文本)才标记 success=True
|
||||
3. 不确定时走笔记管理页验证
|
||||
|
||||
### 10.8 视频号描述写入空白(119场)
|
||||
- **现象**:所有视频发布后描述为空,视频号使用 Wujie 微前端框架
|
||||
- **根因**:`.input-editor` 在 Shadow DOM 内,常规 `.fill()` 无法写入
|
||||
- **修复**:clipboard/insertText 方式注入,先 focus → selectAll → insertText
|
||||
|
||||
### 10.9 抖音账号投稿功能封禁
|
||||
- **现象**:API 返回 status_code=-20 "视频投稿功能已封禁"
|
||||
- **影响**:所有视频无法发布到抖音
|
||||
- **处理**:预检时明确提示封禁状态,跳过抖音
|
||||
|
||||
### 10.10 账号预检机制(v3.1 新增)
|
||||
- **所有平台发布前统一调用 `cookie_manager.check_cookie_valid()`**
|
||||
- 视频号:POST auth_data API
|
||||
- B站:GET /x/web-interface/nav
|
||||
- 快手:GET cp.kuaishou.com/rest/pc/user/myInfo
|
||||
- 小红书:GET creator.xiaohongshu.com/api/galaxy/user/info
|
||||
- 抖音:GET /web/api/media/user_info/
|
||||
- 预检不通过则终止发布,避免浪费时间上传后才发现 Cookie 过期
|
||||
|
||||
---
|
||||
|
||||
## 十一、万推(Web 版视频分发系统)
|
||||
|
||||
565
03_卡木(木)/木叶_视频内容/多平台分发/cookies/B站_cookies.json
Normal file
565
03_卡木(木)/木叶_视频内容/多平台分发/cookies/B站_cookies.json
Normal file
File diff suppressed because one or more lines are too long
253
03_卡木(木)/木叶_视频内容/多平台分发/cookies/小红书_cookies.json
Normal file
253
03_卡木(木)/木叶_视频内容/多平台分发/cookies/小红书_cookies.json
Normal file
@@ -0,0 +1,253 @@
|
||||
{
|
||||
"cookies": [
|
||||
{
|
||||
"name": "acw_tc",
|
||||
"value": "0a0d068317731459544511184e7f11e7ee22303f7a40238fa5613f4eb6702a",
|
||||
"domain": "creator.xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1773147754.395959,
|
||||
"httpOnly": true,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "xsecappid",
|
||||
"value": "ugc",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1804683007,
|
||||
"httpOnly": false,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "a1",
|
||||
"value": "19cd7bc1c751fyh9lntys4dzu93cfib0sfovi8mcw30000273597",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1804681955,
|
||||
"httpOnly": false,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "webId",
|
||||
"value": "6a6cd657224a4e256b12b847a79711c4",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1804681955,
|
||||
"httpOnly": false,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "acw_tc",
|
||||
"value": "0ad58cf017731459558476280efbf9edfae628268bace974a9335ca1712227",
|
||||
"domain": "edith.xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1773147755.795373,
|
||||
"httpOnly": true,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "acw_tc",
|
||||
"value": "0a0d01bc17731459559398103e7ac7810e5fc179199ff12d3e204185602919",
|
||||
"domain": "customer.xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1773147755.915278,
|
||||
"httpOnly": true,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "gid",
|
||||
"value": "yjSfWDSJjJMSyjSfWDSySiY6W2yivxj1I9vMlSE4fu7jqhq8Si3D83888JWq2jW8SiJjJii0",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1807707010.076645,
|
||||
"httpOnly": false,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "customer-sso-sid",
|
||||
"value": "68c517615603922284478469rptt2mwjgogfti8m",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1773750762.487704,
|
||||
"httpOnly": true,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "x-user-id-creator.xiaohongshu.com",
|
||||
"value": "63b3cb6f000000002502c21d",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1807705963.487751,
|
||||
"httpOnly": true,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "customerClientId",
|
||||
"value": "172893742756372",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1807705963.487788,
|
||||
"httpOnly": true,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "access-token-creator.xiaohongshu.com",
|
||||
"value": "customer.creator.AT-68c5176156039222844620815tecrfvr71dngizv",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1775737962.4878,
|
||||
"httpOnly": true,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "galaxy_creator_session_id",
|
||||
"value": "6ZdVvWjMwbN5FGk6Q39utKCwjaXS4uP7UvNj",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1775737963.487811,
|
||||
"httpOnly": true,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "galaxy.creator.beaker.session.id",
|
||||
"value": "1773145963473064900889",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1775737963.487825,
|
||||
"httpOnly": true,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "acw_tc",
|
||||
"value": "0a00de9917731463146134664e1f1f063d66f120924ddb04720828f7d5fd42",
|
||||
"domain": "www.xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1773148114.555781,
|
||||
"httpOnly": true,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "websectiga",
|
||||
"value": "2a3d3ea002e7d92b5c9743590ebd24010cf3750ff3af8029153751e41a6af4a3",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1773406124,
|
||||
"httpOnly": false,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "sec_poison_id",
|
||||
"value": "4b0502b9-b989-4527-9518-9458710cca3d",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1773147529,
|
||||
"httpOnly": false,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
},
|
||||
{
|
||||
"name": "loadts",
|
||||
"value": "1773147007432",
|
||||
"domain": ".xiaohongshu.com",
|
||||
"path": "/",
|
||||
"expires": 1804683007,
|
||||
"httpOnly": false,
|
||||
"secure": false,
|
||||
"sameSite": "Lax"
|
||||
}
|
||||
],
|
||||
"origins": [
|
||||
{
|
||||
"origin": "https://creator.xiaohongshu.com",
|
||||
"localStorage": [
|
||||
{
|
||||
"name": "USER_INFO_FOR_BIZ",
|
||||
"value": "{\"userId\":\"63b3cb6f000000002502c21d\",\"userName\":\"#卡若🔥(4:00起床的男人)\",\"userAvatar\":\"https://sns-avatar-qc.xhscdn.com/avatar/65a68110d4b53385b6a72ed1.jpg?imageView2/2/w/80/format/jpg\",\"redId\":\"6244231151\",\"role\":\"creator\",\"permissions\":[\"creatorCollege\",\"creatorWiki\",\"noteInspiration\",\"creatorHome\",\"creatorData\",\"USER_GROUP\",\"creatorActivityCenter\",\"ORIGINAL_STATEMENT\"],\"zone\":\"86\",\"phone\":\"15880802661\",\"relatedUserId\":null,\"relatedUserName\":null,\"kolCoOrder\":false}"
|
||||
},
|
||||
{
|
||||
"name": "uploader-permit-video-spectrum",
|
||||
"value": "{\"MBTI疗愈SOUL 年轻人测MBTI,40到60岁走五行八卦.mp4-10459668\":null,\"Soul业务模型 派对+切片+小程序全链路.mp4-10740368\":null,\"Soul切片30秒到8分钟 AI半小时能剪10到30个.mp4-14677795\":null,\"初期团队先找两个IS,比钱好使 ENFJ链接人,ENTJ指挥.mp4-15709935\":null,\"刷牙听业务逻辑 Soul切片变现怎么跑.mp4-11455089\":null,\"国学易经怎么学 两小时七七八八,召唤作者对话.mp4-9598781\":null,\"建立信任不是求来的 卖外挂发邮件三个月拿下德国总代.mp4-10091673\":null,\"懒人的活法 动作简单有利可图正反馈.mp4-7059868\":null,\"早起不是为了开派对,是不吵老婆睡觉.mp4-5788932\":null,\"睡眠不好?每天放下一件事,做减法.mp4-7022452\":null,\"金融AI获客体系 后端30人沉淀12年,前端丢手机.mp4-13904487\":null}"
|
||||
},
|
||||
{
|
||||
"name": "publish-uploader-history-upload-speed",
|
||||
"value": "[{\"speed\":[4.2139917695473255],\"domain\":\"ros-upload.xiaohongshu.com\",\"timestamp\":1773147009454},{\"speed\":[3.263224984066284],\"domain\":\"ros-upload-d4.xhscdn.com\",\"timestamp\":1773147011023}]"
|
||||
},
|
||||
{
|
||||
"name": "snsWebPublishCurrentUser",
|
||||
"value": "63b3cb6f000000002502c21d"
|
||||
},
|
||||
{
|
||||
"name": "USER_INFO",
|
||||
"value": "{\"user\":{\"type\":\"User\",\"value\":{\"userId\":\"63b3cb6f000000002502c21d\",\"loginUserType\":\"creator\"}}}"
|
||||
},
|
||||
{
|
||||
"name": "NEW_XHS_ABTEST_REPORT_KEY",
|
||||
"value": "{\"6a6cd657224a4e256b12b847a79711c463b3cb6f000000002502c21d\":\"2026-03-10\"}"
|
||||
},
|
||||
{
|
||||
"name": "b1b1",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "score_display",
|
||||
"value": "1"
|
||||
},
|
||||
{
|
||||
"name": "p1",
|
||||
"value": "27"
|
||||
},
|
||||
{
|
||||
"name": "nps-userId",
|
||||
"value": "63b3cb6f000000002502c21d"
|
||||
},
|
||||
{
|
||||
"name": "_speedList",
|
||||
"value": "[{\"ts\":1773146850016,\"speed\":107953861},{\"ts\":1773146850040,\"speed\":44932428},{\"ts\":1773146892407,\"speed\":145028849},{\"ts\":1773146892428,\"speed\":76504524.66666667},{\"ts\":1773146930414,\"speed\":203671940.33333334},{\"ts\":1773146930432,\"speed\":54714832.666666664},{\"ts\":1773146972441,\"speed\":201955666.66666666},{\"ts\":1773146972464,\"speed\":47211918.666666664},{\"ts\":1773147013892,\"speed\":285466777.6666667},{\"ts\":1773147013923,\"speed\":60348616.333333336}]"
|
||||
},
|
||||
{
|
||||
"name": "score_timestamp",
|
||||
"value": "1773146405848"
|
||||
},
|
||||
{
|
||||
"name": "last_tiga_update_time",
|
||||
"value": "1773146924939"
|
||||
},
|
||||
{
|
||||
"name": "uploader-permit-image-spectrum",
|
||||
"value": "{\"cover.jpeg-304598\":null,\"cover.jpeg-271507\":null,\"cover.jpeg-297124\":null,\"cover.jpeg-295955\":null,\"cover.jpeg-287062\":null,\"cover.jpeg-293020\":null,\"cover.jpeg-308663\":null}"
|
||||
},
|
||||
{
|
||||
"name": "sdt_source_storage_key",
|
||||
"value": "{\"signUrl\":\"https://fe-static.xhscdn.com/as/v1/f218/a15/public/04b29480233f4def5c875875b6bdc3b1.js\",\"url\":\"https://fe-static.xhscdn.com/as/v2/fp/962356ead351e7f2422eb57edff6982d.js\",\"reportUrl\":\"/api/sec/v1/shield/webprofile\",\"desVersion\":\"2\",\"validate\":false,\"commonPatch\":[\"/fe_api/burdock/v2/note/post\",\"/api/sns/web/v1/comment/post\",\"/api/sns/web/v1/note/like\",\"/api/sns/web/v1/note/collect\",\"/api/sns/web/v1/user/follow\",\"/api/sns/web/v1/feed\",\"/api/sns/web/v1/login/activate\",\"/api/sns/web/v1/note/metrics_report\",\"/api/redcaptcha\",\"/api/store/jpd/main\",\"/phoenix/api/strategy/getAppStrategy\",\"/web_api/sns/v2/note\"],\"signVersion\":\"1\",\"xhsTokenUrl\":\"https://fe-static.xhscdn.com/as/v1/3e44/public/bf7d4e32677698655a5cadc581fd09b3.js\",\"extraInfo\":{}}"
|
||||
},
|
||||
{
|
||||
"name": "b1",
|
||||
"value": "I38rHdgsjopgIvesdVwgIC+oIELmBZ5e3VwXLgFTIxS3bqwErFeexd0ekncAzMFYnqthIhJeSBMDKutRI3KsYorWHPtGrbi0P9WfIi/eWc6eYqtyQApPI37ekmR6QLQ5Ii6sdneeSfqYHqwl2qt5B0DBIx+PGDV/sutkIx0sxuwr4qtiIhuaIE3e3LV0I3VTIC7e0Vtl2ADmsLveDSKsSPw5IEvsiVtJOqw8BuwfPpdeTFWOIx4TIiu6ZPwrPut5IvlaLbgs3qtxIxes1VwHIkumIkIyejgsY/WTge7eSqte/D7sDcpipedeYrDtIC6eDVw2IENsSqtlnlSuNjVtIvoekqt3cZ7sVo4gIESyIhE4HfquIxhnqz8gIkIfoqwkICZWG73sdlOeVPw3IvAe0fged0MnIi5s3I4S2utAIiKsidvekZNeTPt4nAOeWPwEIvY/c07efPwvpn7sSqwrI3MrIxE5Luwwaqw+rekhZANe1MNe0Pw9ICNsVLoeSbIFIkosSr7sVnFiIkgsVVtMIiudqqw+tqtWI30e3PwjIENeTVthIh/sYqtSGqwymPwDIvIkI3It4aGS4Y/eiutjIimrIEOsSVtzBoFM/9vej9ZvIiENGutzrutlIvve3PtUOpKeVZNsVMEyIEJekd/skPtsnPwqIvge0qwfIiJeVaroIvKejfKeSPt3Ixvs1qwu2fWBIEL4ICgsVM6ekgeedZosdVtmIiF9Ixiw8qw9IiHOIx3efe4nargeTPw6IxVAqVwbbn5eisos1VtMKut1IiFeIvTl+VtubuwMIxosVegeYuwu4qtvIv8kHqtoIkViwcVuIxoskSos1FvedqwgBqtdIxhWIk7s0VtmIv5ekgRwIhMiwj8XIE41IEKeWuwGqutWOqt8IiuqICosSloeDPwq8gi+IhLXzVtYOPt6IihHIk+IIx+8Iv/edoAsxBkeoPw0IEVHyPwINPwpIC5eYSHQIxhKqS5eVqtNHPtVNZFhgBMlIhR5zqwaIxOe6zuZIiWebuwkI34n+PtWrVtsIhIAIEpvIvQ+sPwcIiu/IhgsxuwSeI81IEuZIvesj95sdPwvIv8WIhW3GZDYIC+FgmH4Iv3sjS/eSuwBIh7s1ut1IhLNICAedVwQ"
|
||||
},
|
||||
{
|
||||
"name": "_renderInfo",
|
||||
"value": "angle (google, vulkan 1.3.0 (swiftshader device (llvm 10.0.0) (0x0000c0de)), swiftshader driver)"
|
||||
},
|
||||
{
|
||||
"name": "xhs_context_networkQuality",
|
||||
"value": "MODERATE"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
25
03_卡木(木)/木叶_视频内容/多平台分发/cookies/快手_cookies.json
Normal file
25
03_卡木(木)/木叶_视频内容/多平台分发/cookies/快手_cookies.json
Normal file
@@ -0,0 +1,25 @@
|
||||
{
|
||||
"cookies": [
|
||||
{
|
||||
"name": "did",
|
||||
"value": "web_f861a30bda9307f2a1179ed9e744150219aa",
|
||||
"domain": ".kuaishou.com",
|
||||
"path": "/",
|
||||
"expires": 1807689321.011699,
|
||||
"httpOnly": false,
|
||||
"secure": true,
|
||||
"sameSite": "None"
|
||||
}
|
||||
],
|
||||
"origins": [
|
||||
{
|
||||
"origin": "https://cp.kuaishou.com",
|
||||
"localStorage": [
|
||||
{
|
||||
"name": "refresh_last_time_0x0810",
|
||||
"value": "1773129320784"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -19,6 +19,15 @@ import httpx
|
||||
COOKIE_STORE_DIR = Path(__file__).parent.parent / "cookies"
|
||||
CHANNELS_LEGACY_PATH = Path(__file__).parent.parent.parent / "视频号发布" / "脚本" / "channels_storage_state.json"
|
||||
|
||||
_BASE = Path(__file__).parent.parent.parent
|
||||
PLATFORM_LEGACY_PATHS = {
|
||||
"视频号": _BASE / "视频号发布" / "脚本" / "channels_storage_state.json",
|
||||
"B站": _BASE / "B站发布" / "脚本" / "bilibili_storage_state.json",
|
||||
"快手": _BASE / "快手发布" / "脚本" / "kuaishou_storage_state.json",
|
||||
"小红书": _BASE / "小红书发布" / "脚本" / "xiaohongshu_storage_state.json",
|
||||
"抖音": _BASE / "抖音发布" / "脚本" / "douyin_storage_state.json",
|
||||
}
|
||||
|
||||
SUPPORTED_PLATFORMS = ["视频号", "抖音", "快手", "B站", "小红书"]
|
||||
|
||||
# 各平台默认 cookie 域名
|
||||
@@ -72,10 +81,10 @@ def load_cookies(platform: str) -> dict[str, str] | None:
|
||||
"""
|
||||
path = get_cookie_path(platform)
|
||||
if not path.exists():
|
||||
# 视频号:尝试从旧路径迁移
|
||||
if platform == "视频号" and CHANNELS_LEGACY_PATH.exists():
|
||||
legacy = PLATFORM_LEGACY_PATHS.get(platform)
|
||||
if legacy and legacy.exists():
|
||||
try:
|
||||
with open(CHANNELS_LEGACY_PATH, "r", encoding="utf-8") as f:
|
||||
with open(legacy, "r", encoding="utf-8") as f:
|
||||
data = json.load(f)
|
||||
_ensure_cookie_dir()
|
||||
with open(path, "w", encoding="utf-8") as f:
|
||||
@@ -163,16 +172,62 @@ def _check_video_account_valid(cookies: dict[str, str]) -> tuple[bool, str]:
|
||||
return True, "有效"
|
||||
|
||||
|
||||
def _check_bilibili_valid(cookies: dict[str, str]) -> tuple[bool, str]:
|
||||
"""B站:GET /x/web-interface/nav 校验"""
|
||||
cookie_str = "; ".join(f"{k}={v}" for k, v in cookies.items())
|
||||
try:
|
||||
with httpx.Client(timeout=10) as c:
|
||||
r = c.get("https://api.bilibili.com/x/web-interface/nav",
|
||||
headers={"Cookie": cookie_str, "User-Agent": UA})
|
||||
body = r.json()
|
||||
if body.get("code") == 0:
|
||||
nick = body.get("data", {}).get("uname", "?")
|
||||
return True, f"有效 (昵称: {nick})"
|
||||
return False, f"Cookie 过期: {body.get('message', '')}"
|
||||
except Exception as e:
|
||||
return False, f"预检异常: {e}"
|
||||
|
||||
|
||||
def _check_kuaishou_valid(cookies: dict[str, str]) -> tuple[bool, str]:
|
||||
"""快手:GET 创作者中心用户信息"""
|
||||
cookie_str = "; ".join(f"{k}={v}" for k, v in cookies.items())
|
||||
try:
|
||||
with httpx.Client(timeout=10) as c:
|
||||
r = c.get("https://cp.kuaishou.com/rest/pc/user/myInfo",
|
||||
headers={"Cookie": cookie_str, "User-Agent": UA,
|
||||
"Referer": "https://cp.kuaishou.com/"})
|
||||
body = r.json()
|
||||
if body.get("result") == 1:
|
||||
nick = body.get("data", {}).get("userName", "?")
|
||||
return True, f"有效 (昵称: {nick})"
|
||||
return False, f"Cookie 过期: {body.get('error_msg', '')}"
|
||||
except Exception as e:
|
||||
return False, f"预检异常: {e}"
|
||||
|
||||
|
||||
def _check_xiaohongshu_valid(cookies: dict[str, str]) -> tuple[bool, str]:
|
||||
"""小红书:GET 创作者中心用户信息"""
|
||||
cookie_str = "; ".join(f"{k}={v}" for k, v in cookies.items())
|
||||
try:
|
||||
with httpx.Client(timeout=10) as c:
|
||||
r = c.get("https://creator.xiaohongshu.com/api/galaxy/user/info",
|
||||
headers={"Cookie": cookie_str, "User-Agent": UA,
|
||||
"Referer": "https://creator.xiaohongshu.com/"})
|
||||
body = r.json()
|
||||
if body.get("code") == 0:
|
||||
nick = body.get("data", {}).get("nick_name", "?")
|
||||
return True, f"有效 (昵称: {nick})"
|
||||
return False, f"Cookie 过期: {body.get('msg', '')}"
|
||||
except Exception as e:
|
||||
return False, f"预检异常: {e}"
|
||||
|
||||
|
||||
def _check_platform_stub(platform: str, cookies: dict[str, str]) -> tuple[bool, str]:
|
||||
"""抖音、B站、快手、小红书:暂为 stub,仅检查文件存在和基本结构"""
|
||||
"""通用 stub:仅检查 cookie 存在"""
|
||||
if not cookies:
|
||||
return False, "无 cookie 数据"
|
||||
# 简单启发:有常见 session 字段则视为可能有效
|
||||
session_keys = {
|
||||
"抖音": ["sessionid"],
|
||||
"B站": ["SESSDATA", "bili_jct"],
|
||||
"快手": ["kuaishou.server.web_st", "userId"],
|
||||
"小红书": ["web_session", "a1"],
|
||||
}
|
||||
keys = session_keys.get(platform, [])
|
||||
found = any(k in cookies for k in keys)
|
||||
@@ -193,7 +248,13 @@ def check_cookie_valid(platform: str) -> tuple[bool, str]:
|
||||
if platform == "视频号":
|
||||
return _check_video_account_valid(cookies)
|
||||
|
||||
if platform in ("抖音", "B站", "快手", "小红书"):
|
||||
if platform == "B站":
|
||||
return _check_bilibili_valid(cookies)
|
||||
if platform == "快手":
|
||||
return _check_kuaishou_valid(cookies)
|
||||
if platform == "小红书":
|
||||
return _check_xiaohongshu_valid(cookies)
|
||||
if platform == "抖音":
|
||||
return _check_platform_stub(platform, cookies)
|
||||
|
||||
return False, f"不支持的平台: {platform}"
|
||||
|
||||
@@ -58,3 +58,13 @@
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/初期团队先找两个IS,比钱好使 ENFJ链接人,ENTJ指挥.mp4", "title": "创业初期先找两个IS型人格,比融资好使十倍 #MBTI创业 #团队搭建 #小程序 卡若创业派对", "success": false, "status": "failed", "message": "笔记管理页未找到该笔记", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 23.95564889907837, "timestamp": "2026-03-10 20:41:00"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/刷牙听业务逻辑 Soul切片变现怎么跑.mp4", "title": "刷牙3分钟听完一套转化逻辑 #碎片创业 #副业逻辑 #小程序 卡若创业派对", "success": false, "status": "failed", "message": "笔记管理页未找到该笔记", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 23.785672187805176, "timestamp": "2026-03-10 20:41:47"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/国学易经怎么学 两小时七七八八,召唤作者对话.mp4", "title": "易经两小时学个七七八八,关键是跟古人对话 #国学 #易经入门 #小程序 卡若创业派对", "success": false, "status": "failed", "message": "笔记管理页未找到该笔记", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 23.7487850189209, "timestamp": "2026-03-10 20:42:35"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/MBTI疗愈SOUL 年轻人测MBTI,40到60岁走五行八卦.mp4", "title": "20岁测MBTI,40岁该学五行八卦了 #MBTI #认知觉醒 #小程序 卡若创业派对", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 26.811036825180054, "timestamp": "2026-03-10 20:44:06"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/Soul业务模型 派对+切片+小程序全链路.mp4", "title": "派对获客→AI切片→小程序转化,全链路拆解 #商业模式 #一人公司 #小程序 卡若创业派对", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 26.96160101890564, "timestamp": "2026-03-10 20:44:48"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/初期团队先找两个IS,比钱好使 ENFJ链接人,ENTJ指挥.mp4", "title": "创业初期先找两个IS型人格,比融资好使十倍 #MBTI创业 #团队搭建 #小程序 卡若创业派对", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 29.34863305091858, "timestamp": "2026-03-10 20:45:32"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/刷牙听业务逻辑 Soul切片变现怎么跑.mp4", "title": "刷牙3分钟听完一套转化逻辑 #碎片创业 #副业逻辑 #小程序 卡若创业派对", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 32.079976081848145, "timestamp": "2026-03-10 20:46:19"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/国学易经怎么学 两小时七七八八,召唤作者对话.mp4", "title": "易经两小时学个七七八八,关键是跟古人对话 #国学 #易经入门 #小程序 卡若创业派对", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 28.719475984573364, "timestamp": "2026-03-10 20:47:03"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/建立信任不是求来的 卖外挂发邮件三个月拿下德国总代.mp4", "title": "信任不是求来的,发三个月邮件拿下德国总代理 #销售思维 #信任建立 #小程序 卡若创业派对", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 26.622901916503906, "timestamp": "2026-03-10 20:47:45"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/懒人的活法 动作简单有利可图正反馈.mp4", "title": "懒人也能有收益?动作简单、有利可图、正反馈 #Soul派对 #副业思维 #小程序 卡若创业派对", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 26.939062118530273, "timestamp": "2026-03-10 20:48:27"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/早起不是为了开派对,是不吵老婆睡觉.mp4", "title": "每天6点起床不是因为自律,是因为老婆还在睡 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 26.36944603919983, "timestamp": "2026-03-10 20:49:08"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/睡眠不好?每天放下一件事,做减法.mp4", "title": "睡不好不是太累,是脑子装太多,每天做减法 #做减法 #心理健康 #小程序 卡若创业派对", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 25.956181049346924, "timestamp": "2026-03-10 20:49:49"}
|
||||
{"platform": "小红书", "video_path": "/Users/karuo/Movies/soul视频/soul 派对 119场 20260309_output/成片/金融AI获客体系 后端30人沉淀12年,前端丢手机.mp4", "title": "后端30人沉淀12年,前端就丢个手机号 #AI获客 #系统思维 #小程序 卡若创业派对", "success": true, "status": "published", "message": "页面已重置(发布成功)", "screenshot": "/tmp/xhs_result.png", "elapsed_sec": 26.69490694999695, "timestamp": "2026-03-10 20:50:31"}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -222,10 +222,15 @@ async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1,
|
||||
|
||||
async def main():
|
||||
from publish_result import print_summary, save_results
|
||||
from cookie_manager import check_cookie_valid
|
||||
|
||||
if not COOKIE_FILE.exists():
|
||||
print("[✗] Cookie 不存在")
|
||||
print("=== 账号预检 ===", flush=True)
|
||||
ok, info = check_cookie_valid("快手")
|
||||
print(f" 快手: {info}", flush=True)
|
||||
if not ok:
|
||||
print("[✗] 账号预检不通过,终止发布", flush=True)
|
||||
return 1
|
||||
print()
|
||||
|
||||
videos = sorted(VIDEO_DIR.glob("*.mp4"))
|
||||
if not videos:
|
||||
|
||||
@@ -391,10 +391,15 @@ async def publish_one(
|
||||
# ---------------------------------------------------------------------------
|
||||
async def main():
|
||||
from publish_result import print_summary, save_results
|
||||
from cookie_manager import check_cookie_valid
|
||||
|
||||
if not COOKIE_FILE.exists():
|
||||
print("[✗] Cookie 不存在,请先运行 channels_login.py 扫码")
|
||||
print("=== 账号预检 ===", flush=True)
|
||||
ok, info = check_cookie_valid("视频号")
|
||||
print(f" 视频号: {info}", flush=True)
|
||||
if not ok:
|
||||
print("[✗] 账号预检不通过,终止发布", flush=True)
|
||||
return 1
|
||||
print()
|
||||
|
||||
videos = sorted(VIDEO_DIR.glob("*.mp4"))
|
||||
if not videos:
|
||||
|
||||
@@ -274,3 +274,4 @@
|
||||
| 2026-03-10 19:50:33 | 🔄 卡若AI 同步 2026-03-10 19:50 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 |
|
||||
| 2026-03-10 20:05:38 | 🔄 卡若AI 同步 2026-03-10 20:05 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 |
|
||||
| 2026-03-10 20:26:50 | 🔄 卡若AI 同步 2026-03-10 20:26 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 |
|
||||
| 2026-03-10 20:45:03 | 🔄 卡若AI 同步 2026-03-10 20:45 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 |
|
||||
|
||||
@@ -277,3 +277,4 @@
|
||||
| 2026-03-10 19:50:33 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 19:50 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-03-10 20:05:38 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 20:05 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-03-10 20:26:50 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 20:26 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
| 2026-03-10 20:45:03 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 20:45 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |
|
||||
|
||||
Reference in New Issue
Block a user