From 0d7381bbaf5243be93768ef548e53ab53abb0c28 Mon Sep 17 00:00:00 2001 From: karuo Date: Mon, 16 Mar 2026 16:59:11 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=94=84=20=E5=8D=A1=E8=8B=A5AI=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=202026-03-16=2016:59=20|=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=9A=E5=8D=A1=E6=9C=A8=E3=80=81=E8=BF=90=E8=90=A5=E4=B8=AD?= =?UTF-8?q?=E6=9E=A2=E3=80=81=E8=BF=90=E8=90=A5=E4=B8=AD=E6=9E=A2=E5=B7=A5?= =?UTF-8?q?=E4=BD=9C=E5=8F=B0=20|=20=E6=8E=92=E9=99=A4=20>20MB:=2011=20?= =?UTF-8?q?=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../木叶_视频内容/多平台分发/脚本/publish_log.json | 26 + .../快手发布/脚本/kuaishou_storage_state.json | 2 +- .../抖音发布/脚本/douyin_storage_state.json | 2 +- .../视频号发布/脚本/channels_api_publish.py | 35 +- .../视频号发布/脚本/channels_headless_publish.py | 514 ++++++++---------- .../视频号发布/脚本/channels_storage_state.json | 2 +- .../视频号发布/脚本/channels_token.json | 13 +- 运营中枢/scripts/karuo_ai_gateway/main.py | 400 ++++++++++++-- 运营中枢/工作台/gitea_push_log.md | 1 + 运营中枢/工作台/代码管理.md | 1 + 10 files changed, 650 insertions(+), 346 deletions(-) diff --git a/03_卡木(木)/木叶_视频内容/多平台分发/脚本/publish_log.json b/03_卡木(木)/木叶_视频内容/多平台分发/脚本/publish_log.json index ce63ac67..a482d282 100644 --- a/03_卡木(木)/木叶_视频内容/多平台分发/脚本/publish_log.json +++ b/03_卡木(木)/木叶_视频内容/多平台分发/脚本/publish_log.json @@ -202,3 +202,29 @@ {"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/太早引入资本你的方向就不是你说了算.mp4", "title": "太早引入资本你的方向就不是你说了算", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.34523606300354004, "timestamp": "2026-03-16 10:17:39"} {"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/教培行业六七年经验 做好自己本店才是核心.mp4", "title": "教培行业六七年经验 做好自己本店才是核心", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.18884801864624023, "timestamp": "2026-03-16 10:17:42"} {"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/给学校免费培训,后端卖设备才是真生意.mp4", "title": "给学校免费培训,后端卖设备才是真生意", "success": false, "status": "error", "message": "Cookie 已过期", "elapsed_sec": 0.15567326545715332, "timestamp": "2026-03-16 10:17:45"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/Cursor的权限问题,安全隐患必须提前讲清楚.mp4", "title": "Cursor的权限问题,安全隐患必须提前讲清楚 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "likely_published", "message": "浏览器发布完成 (24s)", "elapsed_sec": 23.580196142196655, "timestamp": "2026-03-16 16:13:27"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/NFC碰一碰引流,线下餐饮店用这招就够了.mp4", "title": "NFC碰一碰引流,线下餐饮店用这招就够了 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "likely_published", "message": "浏览器发布完成 (24s)", "elapsed_sec": 24.426401138305664, "timestamp": "2026-03-16 16:14:19"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/Skill和Cursor的区别,一个走工作流一个走对话.mp4", "title": "Skill和Cursor的区别,一个走工作流一个走对话 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "likely_published", "message": "浏览器发布完成 (24s)", "elapsed_sec": 23.955566883087158, "timestamp": "2026-03-16 16:14:57"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/Soul派对比抖音省力太多,连麦机制是核心差异.mp4", "title": "Soul派对比抖音省力太多,连麦机制是核心差异 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "likely_published", "message": "浏览器发布完成 (24s)", "elapsed_sec": 23.712391138076782, "timestamp": "2026-03-16 16:15:31"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/做API聚合给别人充值,这是另一种AI变现路径.mp4", "title": "做API聚合给别人充值,这是另一种AI变现路径 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "likely_published", "message": "浏览器发布完成 (23s)", "elapsed_sec": 23.39839792251587, "timestamp": "2026-03-16 16:16:24"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/帮别人装AI工具就能赚钱,工作流才是变现入口.mp4", "title": "帮别人装AI工具就能赚钱,工作流才是变现入口 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "likely_published", "message": "浏览器发布完成 (23s)", "elapsed_sec": 23.36488103866577, "timestamp": "2026-03-16 16:16:57"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/本地部署大模型到底行不行,小事可以大事别想.mp4", "title": "本地部署大模型到底行不行,小事可以大事别想 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "likely_published", "message": "浏览器发布完成 (24s)", "elapsed_sec": 24.22295308113098, "timestamp": "2026-03-16 16:17:48"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/每个消费者都是你的流量入口,碰一碰就能连接.mp4", "title": "每个消费者都是你的流量入口,碰一碰就能连接 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "likely_published", "message": "浏览器发布完成 (25s)", "elapsed_sec": 24.628809213638306, "timestamp": "2026-03-16 16:18:23"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/电竞19年经验加AI,跨界结合才有真正的护城河.mp4", "title": "电竞19年经验加AI,跨界结合才有真正的护城河 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "likely_published", "message": "浏览器发布完成 (25s)", "elapsed_sec": 24.53538417816162, "timestamp": "2026-03-16 16:19:14"} +{"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剧 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "likely_published", "message": "浏览器发布完成 (25s)", "elapsed_sec": 24.878341674804688, "timestamp": "2026-03-16 16:20:02"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/AI教培是真的可以做,传统培训行业正在被改造.mp4", "title": "AI教培是真的可以做,传统培训行业正在被改造 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "published", "message": "浏览器发布成功 (23s)", "elapsed_sec": 23.375390768051147, "timestamp": "2026-03-16 16:20:52"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/一个Soul号一个月挣几万块,这也是个小生意.mp4", "title": "一个Soul号一个月挣几万块,这也是个小生意 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "published", "message": "浏览器发布成功 (24s)", "elapsed_sec": 23.80004620552063, "timestamp": "2026-03-16 16:21:38"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/不用上什么模式,经营好你的人就够了.mp4", "title": "不用上什么模式,经营好你的人就够了 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "published", "message": "浏览器发布成功 (25s)", "elapsed_sec": 25.422972202301025, "timestamp": "2026-03-16 16:22:18"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/云连锁概念太牛了,不需要开店也能做品牌.mp4", "title": "云连锁概念太牛了,不需要开店也能做品牌 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "published", "message": "浏览器发布成功 (25s)", "elapsed_sec": 25.05273175239563, "timestamp": "2026-03-16 16:22:59"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/供应链加品牌店,后端才是真正赚钱的地方.mp4", "title": "供应链加品牌店,后端才是真正赚钱的地方 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "published", "message": "浏览器发布成功 (25s)", "elapsed_sec": 24.836674213409424, "timestamp": "2026-03-16 16:23:36"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/卖Cursor安装包没有后端你做不了.mp4", "title": "卖Cursor安装包没有后端你做不了 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "published", "message": "浏览器发布成功 (26s)", "elapsed_sec": 26.232242822647095, "timestamp": "2026-03-16 16:24:12"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/太早引入资本你的方向就不是你说了算.mp4", "title": "太早引入资本你的方向就不是你说了算 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "published", "message": "浏览器发布成功 (25s)", "elapsed_sec": 24.55711007118225, "timestamp": "2026-03-16 16:24:49"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/教培行业六七年经验 做好自己本店才是核心.mp4", "title": "教培行业六七年经验 做好自己本店才是核心 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "published", "message": "浏览器发布成功 (26s)", "elapsed_sec": 26.159539222717285, "timestamp": "2026-03-16 16:25:44"} +{"platform": "视频号", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_125场_20260316_output/成片/给学校免费培训,后端卖设备才是真生意.mp4", "title": "给学校免费培训,后端卖设备才是真生意 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": true, "status": "published", "message": "浏览器发布成功 (24s)", "elapsed_sec": 24.06852388381958, "timestamp": "2026-03-16 16:26:38"} +{"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.4417760372161865, "timestamp": "2026-03-16 16:43:07"} +{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/Cursor的权限问题,安全隐患必须提前讲清楚.mp4", "title": "Cursor的权限问题,安全隐患必须提前讲清楚 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": false, "status": "error", "message": "未找到上传控件", "elapsed_sec": 12.410063028335571, "timestamp": "2026-03-16 16:43:52"} +{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/NFC碰一碰引流,线下餐饮店用这招就够了.mp4", "title": "NFC碰一碰引流,线下餐饮店用这招就够了 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": false, "status": "error", "message": "未找到上传控件", "elapsed_sec": 9.355870008468628, "timestamp": "2026-03-16 16:44:08"} +{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/Skill和Cursor的区别,一个走工作流一个走对话.mp4", "title": "Skill和Cursor的区别,一个走工作流一个走对话 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": false, "status": "error", "message": "未找到上传控件", "elapsed_sec": 10.765911102294922, "timestamp": "2026-03-16 16:44:33"} +{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/Cursor的权限问题,安全隐患必须提前讲清楚.mp4", "title": "Cursor的权限问题,安全隐患必须提前讲清楚 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": false, "status": "error", "message": "未找到上传控件", "elapsed_sec": 18.89427924156189, "timestamp": "2026-03-16 16:44:36"} +{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/NFC碰一碰引流,线下餐饮店用这招就够了.mp4", "title": "NFC碰一碰引流,线下餐饮店用这招就够了 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": false, "status": "error", "message": "未找到上传控件", "elapsed_sec": 8.366912841796875, "timestamp": "2026-03-16 16:44:52"} +{"platform": "抖音", "video_path": "/Users/karuo/Movies/soul视频/soul_派对_121场_20260311_output/成片/Skill和Cursor的区别,一个走工作流一个走对话.mp4", "title": "Skill和Cursor的区别,一个走工作流一个走对话 #Soul派对 #创业日记 #小程序 卡若创业派对", "success": false, "status": "error", "message": "未找到上传控件", "elapsed_sec": 8.569876909255981, "timestamp": "2026-03-16 16:45:11"} diff --git a/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_storage_state.json b/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_storage_state.json index 52156c88..c0452c68 100644 --- a/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_storage_state.json +++ b/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_storage_state.json @@ -1 +1 @@ -{"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"}]}]} \ No newline at end of file +{"cookies": [{"name": "did", "value": "web_2274fc10c8adb27e5275444f43e3bb67a2ba", "domain": ".kuaishou.com", "path": "/", "expires": 1808210520.919913, "httpOnly": false, "secure": true, "sameSite": "None"}], "origins": [{"origin": "https://cp.kuaishou.com", "localStorage": [{"name": "refresh_last_time_0x0810", "value": "1773650520701"}]}]} \ No newline at end of file diff --git a/03_卡木(木)/木叶_视频内容/抖音发布/脚本/douyin_storage_state.json b/03_卡木(木)/木叶_视频内容/抖音发布/脚本/douyin_storage_state.json index e6a9f83f..fce055f7 100644 --- a/03_卡木(木)/木叶_视频内容/抖音发布/脚本/douyin_storage_state.json +++ b/03_卡木(木)/木叶_视频内容/抖音发布/脚本/douyin_storage_state.json @@ -1 +1 @@ -{"cookies": [{"name": "gd_random", "value": "eyJtYXRjaCI6dHJ1ZSwicGVyY2VudCI6MC4yODI0NDE3NDQwNzI1NDIxfQ==.l21IkfaRl0IrEzWxAif4VTQN3cYFX2JQFjvKpcW8d00=", "domain": "creator.douyin.com", "path": "/goofy/douyin_creator_pc/creator_pc_vmok_common/vmok-manifest.json", "expires": 1774233256.61854, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "gd_random", "value": "eyJtYXRjaCI6ZmFsc2UsInBlcmNlbnQiOjAuMjgyNDQxNzQ0MDcyNTQyMX0=.Zn3fSXrBjJqVJ6bQbTcNfL7xPo/HdI2j4rH7mY6JHQM=", "domain": "creator.douyin.com", "path": "/", "expires": 1774233255.541078, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "x-web-secsdk-uid", "value": "afe27935-a343-4dff-a430-88988fd6da20", "domain": "creator.douyin.com", "path": "/", "expires": -1, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gfkadpd", "value": "2906,33638", "domain": "creator.douyin.com", "path": "/", "expires": 1773887655, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "_tea_utm_cache_2906", "value": "undefined", "domain": ".creator.douyin.com", "path": "/", "expires": 1774233256, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "csrf_session_id", "value": "8f3611da130c0e50aace4ccd84347505", "domain": "creator.douyin.com", "path": "/", "expires": -1, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "ttwid", "value": "1%7Cg8Numyy_SiIFKe5aJA29jPKTN0J2g5UmrKJ2C24I-_A%7C1773628457%7Cf6d3bf9e896032a5a829c50b73599e9fb3f02a5d59aaedcf2d071a695e217470", "domain": ".bytedance.com", "path": "/", "expires": 1805164456.979941, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "__security_mc_1_s_sdk_crypt_sdk", "value": "61ed0a83-43c8-92d1", "domain": ".douyin.com", "path": "/", "expires": 1778812457.72933, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "bd_ticket_guard_client_data", "value": "eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWl0ZXJhdGlvbi12ZXJzaW9uIjoxLCJiZC10aWNrZXQtZ3VhcmQtcmVlLXB1YmxpYy1rZXkiOiJCRTRNbjNpRFBaUWp2M1N0Znc0K2FmUWtuQkU1T3hjYTJIUkYxaVlHcTI4TEo2TDFpT2NRVlU3bTJkTVRiTEgwV3ZTY0s5dTRybnhONHYwdVQ4anRGN0U9IiwiYmQtdGlja2V0LWd1YXJkLXdlYi12ZXJzaW9uIjoyfQ%3D%3D", "domain": ".douyin.com", "path": "/", "expires": 1778812457.741298, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "bd_ticket_guard_client_web_domain", "value": "2", "domain": ".douyin.com", "path": "/", "expires": 1778812457.74133, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "passport_csrf_token", "value": "3c5345bd14901a46a81cd77a4277d07b", "domain": ".douyin.com", "path": "/", "expires": 1778812457.912284, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "passport_csrf_token_default", "value": "3c5345bd14901a46a81cd77a4277d07b", "domain": ".douyin.com", "path": "/", "expires": 1778812457.912318, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "ttwid", "value": "1%7Cg8Numyy_SiIFKe5aJA29jPKTN0J2g5UmrKJ2C24I-_A%7C1773628461%7C3a470af019f4f4bc6919158a44e8ff150de079164cab94c0aacb9805910dbfe8", "domain": ".douyin.com", "path": "/", "expires": 1805164461.179492, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "__security_mc_1_s_sdk_cert_key", "value": "275e262e-44fa-b848", "domain": ".douyin.com", "path": "/", "expires": 1778812461.417625, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "__security_mc_1_s_sdk_sign_data_key_web_protect", "value": "f4387b25-42b3-9462", "domain": ".douyin.com", "path": "/", "expires": 1778812461.417768, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "biz_trace_id", "value": "f155d565", "domain": ".douyin.com", "path": "/", "expires": -1, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "sdk_source_info", "value": "7e276470716a68645a606960273f276364697660272927676c715a6d6069756077273f276364697660272927666d776a68605a607d71606b766c6a6b5a7666776c7571273f275e58272927666a6b766a69605a696c6061273f27636469766027292762696a6764695a7364776c6467696076273f275e5827292771273f27333d333433313d3733363232342778", "domain": ".douyin.com", "path": "/", "expires": 1773628761.715433, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "bit_env", "value": "s9CQYtnOs60cTjzl_xd_GGsbLwFypY006It2XoT5dWFi93iC1QFqrp3INtYayP8jl5Jc6ddcQh3LqAO3hgvYFn6xffLfqrjAhOeTYBc15DihGGjLQjeRlZW9Tbe31TTNe9ay0ZRJ5x8GEgLNuGZ-pgQzLsnq-VvinQsU_ugAi6EqcZXiMjzW2GjUksl_x0J43g7MDc3CFcNO_ViFeRElNCINBcSDnj4UjG-3usBEeiIY89zOhLlSfh-aBoK6b1n4SlPm-LTwIqRQIGjlCaPSRFwGAuGgbVL3vKKn8H8Qg_XgKOEP51C4hmJGAfQMoG5d6B8B1cLzdWm9wvMwH5v5mA_GcSqFUsmTG_lPGbICGy_VhBW8Vel4uXuezOYmnrL7wXRkfRJ73SNNRHOU0Kfr7vk6SNuFe6L2kKM2PoqRk-tVUYsCNxmhgsXA9sOQGZ8G_snMxtbKdZnaS1ZygpZ_ggd_wv8zi61cZYidQSFzFaGNOJMbAByF2OqB6PuVuEyo46J7bC_Lv9goj07JptAVLcM2z4oeXzfZvCoTCdoOPTo%3D", "domain": ".douyin.com", "path": "/", "expires": 1773628761.715509, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gulu_source_res", "value": "eyJwX2luIjoiNGQyZWY5YTQ5ZWRjMWRkODFjNjhhNDYzMTkwZDk5YzJlMTJhY2U4OTdjODg1Yzc5M2YzYTE0ODE0ZDQ1NGJkNSJ9", "domain": ".douyin.com", "path": "/", "expires": 1773628761.71554, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "passport_auth_mix_state", "value": "v9nt7zcgizwmjai9c7q9ndb6pwe9s00d", "domain": ".douyin.com", "path": "/", "expires": 1773628701.715563, "httpOnly": false, "secure": false, "sameSite": "Lax"}], "origins": [{"origin": "https://creator.douyin.com", "localStorage": [{"name": "__tea_cache_tokens_2906", "value": "{\"web_id\":\"7617676187620034091\",\"user_unique_id\":\"7617676187620034091\",\"timestamp\":1773628456618}"}, {"name": "LOGIN_STATUS", "value": "{\"logintype\":\"user\",\"loginapp\":\"douyin\"}"}, {"name": "__msuuid__", "value": "506acfba-2efb-4b5f-aa3a-6aab9eb7a1d9"}, {"name": "CREATOR_LAYOUT_CONFIG", "value": "{\"headerLogo\":{\"douyin\":{\"src\":\"//lf3-static.bytednsdoc.com/obj/eden-cn/lm-yvahlyj-upfbvk/ljhwZthlaukjlkulzlp/pc/icons/logo.png\"},\"huoshan\":{\"src\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_header_logo_h.png~tplv-obj.image\"}},\"hotsoonHelpShow\":false,\"footerLink\":[{\"children\":\"\u8d26\u53f7\u6388\u6743\u534f\u8bae\",\"href\":\"//lf3-beecdn.bytetos.com/obj/ies-fe-bee/bee_prod/biz_181/bee_prod_181_bee_publish_1095.html\"},{\"children\":\"\u7528\u6237\u670d\u52a1\u534f\u8bae\",\"href\":\" //www.douyin.com/agreement/\"},{\"children\":\"\u9690\u79c1\u653f\u7b56\",\"href\":\" //www.douyin.com/privacy/\"},{\"children\":\"\u8d26\u53f7\u627e\u56de\",\"href\":\" //www.douyin.com/recovery_account/\"},{\"children\":\"\u8054\u7cfb\u6211\u4eec\",\"href\":\" //www.douyin.com/aboutus/\"}],\"footerText\":[[\"2025 \u00a9 \u6296\u97f3\",\"[\u4eacICP\u590716016397\u53f7-3](https://beian.miit.gov.cn/)\",\"[\u5317\u4eac\u6296\u97f3\u79d1\u6280\u6709\u9650\u516c\u53f8](https://lf3-static.bytednsdoc.com/obj/eden-cn/lm-yvahlyj-upfbvk/ljhwZthlaukjlkulzlp/\u8425\u4e1a\u6267\u7167.jpg)\",\"[\u4eacB2-20170846](https://lf3-static.bytednsdoc.com/obj/eden-cn/lm-yvahlyj-upfbvk/ljhwZthlaukjlkulzlp/\u589e\u503c\u7535\u4fe1\u4e1a\u52a1\u7ecf\u8425\u8bb8\u53ef\u8bc1.jpg)\"],[\"[\u4e2d\u56fd\u4e92\u8054\u7f51\u4e3e\u62a5\u4e2d\u5fc3](http://www.12377.cn/)\",\"[\u7f51\u7edc\u6587\u5316\u7ecf\u8425\u8bb8\u53ef\u8bc1-\u4eac\u7f51\u6587\u30142025\u30150181-061\u53f7](https://lf3-static.bytednsdoc.com/obj/eden-cn/lm-yvahlyj-upfbvk/ljhwZthlaukjlkulzlp/\u7f51\u7edc\u7ecf\u8425\u8bb8\u53ef\u8bc1.jpg)\",\"\u8fdd\u6cd5\u548c\u4e0d\u826f\u4fe1\u606f\u4e3e\u62a5\uff1a400-140-2108\",\"\u4e3e\u62a5\u90ae\u7bb1\uff1afeedback@douyin.com\"],[\"![pic](//p3.douyinpic.com/aweme-server-static-resource/gongan_d0289dc.png~tplv-obj.image)\",\"[\u4eac\u516c\u7f51\u5b89\u590711000002002046\u53f7](http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002002046)\",\"\u5730\u5740\uff1a\u5317\u4eac\u5e02\u6d77\u6dc0\u533a\u5317\u4e09\u73af\u897f\u8def\u753218\u53f7\u96624\u53f7\u697c2\u5c422022\"]],\"permissionKeys\":[{\"itemKey\":\"/authority\",\"text\":\"\u6388\u6743\u7ba1\u7406\",\"show\":true,\"permission\":\"CreatorConferManage\"},{\"itemKey\":\"/content/\",\"text\":\"\u5185\u5bb9\u7ba1\u7406\",\"path\":[\"/live/media/create\",\"/live/media/room\",\"/live/media/list\"],\"show\":true,\"permission\":\"CreatorContentManage\"},{\"itemKey\":\"/following\",\"text\":\"\u4e92\u52a8\u7ba1\u7406\",\"show\":true,\"permission\":\"CreatorInterManage\"},{\"itemKey\":\"/data\",\"text\":\"\u6570\u636e\u7ba1\u7406\",\"path\":[\"/live/media/data\"],\"show\":true,\"permission\":\"CreatorDataManage\"},{\"itemKey\":\"/musician\",\"text\":\"\u97f3\u4e50\u7ba1\u7406\",\"show\":true,\"restrictHotsoon\":true,\"permission\":\"CreatorMusicManage\"},{\"itemKey\":\"/publicity/topic\",\"text\":\"\u5ba3\u53d1\u7ba1\u7406\",\"show\":false,\"restrictHotsoon\":true,\"permission\":\"CreatorContentManage.Challenge\"}],\"headerIcons\":[{\"src\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_header_notification_icon.svg~tplv-obj.image\",\"link\":\"https://creator.douyin.com/message\",\"visible\":{\"has_unread_message\":false,\"is_login_hotsoon\":false}},{\"src\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_header_notification.png~tplv-obj.image\",\"link\":\"https://creator.douyin.com/message\",\"style\":{\"width\":\"24px\",\"height\":\"24px\"},\"badge\":{\"count\":\"unread_message_count\"},\"visible\":{\"has_unread_message\":true,\"is_login_hotsoon\":false}}],\"sidebarFollowerTip\":\"\u4ec5\u5c55\u793a\u6296\u97f3\u7c89\u4e1d\",\"sidebarData\":{\"data\":[{\"name\":\"\u89c6\u9891\u6570\u636e\",\"keyName\":\"CreatorDataManage\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_vedio.svg~tplv-obj.image\",\"auth\":true,\"children\":[{\"path\":\"/data/stats/overview\",\"name\":\"\u6570\u636e\u603b\u89c8\",\"keyName\":\"CreatorDataManage.UserOverview\",\"visible\":{\"is_login_hotsoon\":false}},{\"path\":\"/data/stats/video\",\"name\":\"\u4f5c\u54c1\u6570\u636e\",\"keyName\":\"CreatorDataManage.ItemL2\",\"visible\":{\"is_login_hotsoon\":false}},{\"path\":\"/data/stats/follower/portrait\",\"name\":\"\u7c89\u4e1d\u753b\u50cf\",\"keyName\":\"CreatorDataManage.Portrait\",\"visible\":{\"is_login_hotsoon\":false}},{\"path\":\"/data/stats/hotsoon-overview\",\"name\":\"\u6570\u636e\u603b\u89c8\",\"keyName\":\"CreatorDataManage.UserOverview\",\"visible\":{\"is_login_hotsoon\":true}},{\"path\":\"/data/stats/hotsoon-item\",\"name\":\"\u4f5c\u54c1\u6570\u636e\",\"keyName\":\"CreatorDataManage.ItemL2\",\"visible\":{\"is_login_hotsoon\":true}},{\"path\":\"/weekly\",\"name\":\"\u521b\u4f5c\u5468\u62a5\",\"keyName\":\"CreatorDataManage.WeekReport\",\"visible\":{\"is_login_hotsoon\":false}}]},{\"name\":\"\u76f4\u64ad\u6570\u636e\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_data_icon.svg~tplv-obj.image\",\"auth\":true,\"children\":[{\"path\":\"/data/live/overview\",\"name\":\"\u6570\u636e\u603b\u89c8\",\"key\":\"CreatorDataManage.Live\"},{\"path\":\"/live/media/data\",\"name\":\"\u6570\u636e\u603b\u89c8\",\"key\":\"CreatorLiveManage.Data\"},{\"path\":\"/data/live/video\",\"name\":\"\u5355\u573a\u6570\u636e\",\"key\":\"CreatorDataManage.Live\"}]},{\"name\":\"\u91cd\u70b9\u5173\u6ce8\",\"keyName\":\"CreatorDataManage\",\"auth\":true,\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_inportant.svg~tplv-obj.image\",\"visible\":[{\"status_code\":8,\"window.location.host\":\"creator.douyin.com\"},{\"status_code\":15384,\"window.location.host\":\"creator.douyin.com\"},{\"is_login_hotsoon\":false}],\"children\":[{\"path\":\"/data/important/following\",\"name\":\"\u6211\u5173\u5fc3\u7684\",\"keyName\":\"CreatorDataManage.TraceOthers\"},{\"path\":\"/data/important/keyword\",\"name\":\"\u4e0e\u6211\u76f8\u5173\",\"keyName\":\"CreatorDataManage.SearchSelf\"}]}],\"interaction\":[{\"name\":\"\u4e92\u52a8\u7ba1\u7406\",\"keyName\":\"CreatorInterManage\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_following.svg~tplv-obj.image\",\"auth\":true,\"children\":[{\"path\":\"/following/following\",\"name\":\"\u5173\u6ce8\u7ba1\u7406\"},{\"path\":\"/following/follower\",\"name\":\"\u7c89\u4e1d\u7ba1\u7406\"},{\"path\":\"/following/comment\",\"name\":\"\u8bc4\u8bba\u7ba1\u7406\",\"visible\":{\"is_login_hotsoon\":false}},{\"path\":\"/following/chat\",\"name\":\"\u79c1\u4fe1\u7ba1\u7406\",\"key\":\"CreatorInterManage.im\",\"keyName\":\"CreatorInterManage.im\",\"visible\":{\"is_login_hotsoon\":false,\"douyin_user_verify_info.teen_model\":false}}]}],\"publicity\":[{\"name\":\"\u5ba3\u53d1\u7ba1\u7406\",\"key\":\"CreatorContentManage.Challenge\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_publicity.svg~tplv-obj.image\",\"children\":[{\"path\":\"/publicity/topic\",\"name\":\"\u8bdd\u9898\u7ba1\u7406\"}]}],\"music\":[{\"name\":\"\u97f3\u4e50\u7ba1\u7406\",\"key\":\"CreatorMusicManage\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_music.svg~tplv-obj.image\",\"children\":[{\"path\":\"/musician\",\"name\":\"\u6982\u89c8\"},{\"path\":\"/musician/songs\",\"name\":\"\u97f3\u4e50\u7ba1\u7406\"},{\"path\":\"/musician/statistics\",\"name\":\"\u6570\u636e\u7ba1\u7406\"}]}],\"live\":[{\"name\":\"\u76f4\u64ad\u7ba1\u7406\",\"key\":\"CreatorLiveManage\",\"children\":[{\"path\":\"/live/media/create\",\"name\":\"\u521b\u5efa\u76f4\u64ad\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ttfe_open_creator_sidebar_livecreate.svg~tplv-obj.image\",\"key\":\"CreatorLiveManage.Create\"},{\"path\":\"/live/media/list\",\"name\":\"\u76f4\u64ad\u5217\u8868\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ttfe_open_creator_sidebar_livelist.svg~tplv-obj.image\",\"key\":\"CreatorLiveManage.List\"},{\"path\":\"/live/media/replay\",\"name\":\"\u76f4\u64ad\u56de\u653e\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ttfe_open_creator_sidebar_livereplay.svg~tplv-obj.image\",\"key\":\"CreatorLiveManage.Replay\"}]},{\"name\":\"\u6570\u636e\u7ba1\u7406\",\"key\":\"CreatorLiveManage.Data\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ttfe_open_creator_sidebar_livedata.svg~tplv-obj.image\",\"children\":[{\"path\":\"/live/media/data\",\"name\":\"\u76f4\u64ad\u6570\u636e\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ttfe_open_creator_sidebar_livedata.svg~tplv-obj.image\",\"key\":\"CreatorLiveManage.Data\"}]}],\"media\":[{\"name\":\"\u53d1\u5e03\u89c6\u9891\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_upload_v2.svg~tplv-obj.image\",\"path\":[\"/content/upload\",\"/content/publish\"]},{\"name\":\"\u5185\u5bb9\u7ba1\u7406\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_manage_v2.svg~tplv-obj.image\",\"children\":[{\"path\":\"/content/manage\",\"name\":\"\u89c6\u9891\u7ba1\u7406\",\"icon\":\"\"},{\"path\":[\"/content/collection/manage\",\"/content/collection/detail\",\"/content/collection/create\"],\"name\":\"\u5408\u96c6\u7ba1\u7406\",\"icon\":\"\",\"visContextKey\":\"userInfo.mix_permission\",\"visContextValue\":true},{\"path\":\"/content/safeguard\",\"name\":\"\u7ef4\u6743\u7ba1\u7406\",\"icon\":\"\",\"visContextKey\":\"userInfo.permission.user_sign\",\"visContextValue\":true}]},{\"name\":\"\u76f4\u64ad\u7ba1\u7406\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_livecreate_v2.svg~tplv-obj.image\",\"visContextKey\":\"creatorMenu.live_manage\",\"visContextValue\":true,\"children\":[{\"path\":\"/live/media/create\",\"name\":\"\u521b\u5efa\u76f4\u64ad\",\"icon\":\"\",\"key\":\"CreatorLiveManage.Create\",\"visContextKey\":\"creatorMenu.media_auth\",\"visContextValue\":true},{\"path\":\"/live/media/list\",\"name\":\"\u76f4\u64ad\u5217\u8868\",\"icon\":\"\",\"key\":\"CreatorLiveManage.List\",\"visContextKey\":\"creatorMenu.media_auth\",\"visContextValue\":true},{\"path\":\"/content/live/replay\",\"name\":\"\u76f4\u64ad\u56de\u653e\",\"icon\":\"\",\"key\":\"CreatorLiveManage.Replay\",\"visContextKey\":\"creatorMenu.replay_auth\",\"visContextValue\":true},{\"path\":\"/content/live/replay\",\"name\":\"\u76f4\u64ad\u56de\u653e\",\"key\":\"CreatorCommonManage.Replay\"}]}]}}"}, {"name": "__tea_cache_first_2906", "value": "1"}, {"name": "xmst", "value": "PWKasVeME0MELsAeEbPKr23JDiS0GufpaFQjuaxoaSoxLyJuNxyQ5IWzg0IjJpKlZPX-ETJGEBrEstFbhaUCmCA1isZEepVJpX0K0AoZlSlUrnVzKgjs4sfzPBqnyhU2yKvGMRdFbPutZBu0PXz_b-CKjjCZmMnviHTyDhGbe-5Q2Ns_vo3FaYJmZw=="}, {"name": "ztsdk_tcc_config", "value": "{\"value\":{\"ztsdk_config\":{\"2906\":[{\"aid\":2906,\"scene\":\"web_protect\",\"certType\":\"cookie\",\"providerPathList\":[],\"consumerPathList\":[\"/aweme/v1/creator/relation/create/\",\"/web/api/v2/creator/activity/collect/\",\"/live/api/room/create_media_room/\",\"/aweme/janus/creator/comment/aweme/v1/web/comment/multi_publish/\",\"/aweme/v1/web/comment/multi_publish/\",\"/aweme/janus/creator/comment/aweme/v1/comment/publish/\",\"/aweme/v1/web/comment/publish/\",\"/aweme/janus/creator/comment/aweme/v1/web/comment/digg/\",\"/aweme/v1/web/comment/digg/\",\"/aweme/janus/creator/comment/aweme/v1/web/comment/multi_delete/\",\"/aweme/v1/web/comment/multi_delete/\",\"/aweme/v1/creator/comment/reply/\",\"/aweme/v1/creator/comment/action/\"],\"signVersion\":2}],\"6383\":[{\"aid\":6383,\"scene\":\"web_protect\",\"certType\":\"cookie\",\"consumerPathList\":[\"/aweme/v1/web/comment/list/reply/\",\"/aweme/v1/web/comment/list/\",\"/aweme/v2/web/comment/list/reply/\"],\"signVersion\":2}]}},\"expire\":1773650056867}"}, {"name": "security-sdk/s_sdk_server_cert_key", "value": "{\"cert\":\"-----BEGIN CERTIFICATE-----\\nMIIEfTCCBCKgAwIBAgIUXWdS2tzmSoewCWfKFyiWMrJqs/0wCgYIKoZIzj0EAwIw\\nMTELMAkGA1UEBhMCQ04xIjAgBgNVBAMMGXRpY2tldF9ndWFyZF9jYV9lY2RzYV8y\\nNTYwIBcNMjIxMTE4MDUyMDA2WhgPMjA2OTEyMzExNjAwMDBaMCQxCzAJBgNVBAYT\\nAkNOMRUwEwYDVQQDEwxlY2llcy1zZXJ2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMB\\nBwNCAASE2llDPlfc8Rq+5J5HXhg4edFjPnCF3Ua7JBoiE/foP9m7L5ELIcvxCgEx\\naRCHbQ8kCCK/ArZ4FX/qCobZAkToo4IDITCCAx0wDgYDVR0PAQH/BAQDAgWgMDEG\\nA1UdJQQqMCgGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwME\\nMCkGA1UdDgQiBCABydxqGrVEHhtkCWTb/vicGpDZPFPDxv82wiuywUlkBDArBgNV\\nHSMEJDAigCAypWfqjmRIEo3MTk1Ae3MUm0dtU3qk0YDXeZSXeyJHgzCCAZQGCCsG\\nAQUFBwEBBIIBhjCCAYIwRgYIKwYBBQUHMAGGOmh0dHA6Ly9uZXh1cy1wcm9kdWN0\\naW9uLmJ5dGVkYW5jZS5jb20vYXBpL2NlcnRpZmljYXRlL29jc3AwRgYIKwYBBQUH\\nMAGGOmh0dHA6Ly9uZXh1cy1wcm9kdWN0aW9uLmJ5dGVkYW5jZS5uZXQvYXBpL2Nl\\ncnRpZmljYXRlL29jc3AwdwYIKwYBBQUHMAKGa2h0dHA6Ly9uZXh1cy1wcm9kdWN0\\naW9uLmJ5dGVkYW5jZS5jb20vYXBpL2NlcnRpZmljYXRlL2Rvd25sb2FkLzQ4RjlD\\nMEU3QjBDNUE3MDVCOTgyQkU1NTE3MDVGNjQ1QzhDODc4QTguY3J0MHcGCCsGAQUF\\nBzAChmtodHRwOi8vbmV4dXMtcHJvZHVjdGlvbi5ieXRlZGFuY2UubmV0L2FwaS9j\\nZXJ0aWZpY2F0ZS9kb3dubG9hZC80OEY5QzBFN0IwQzVBNzA1Qjk4MkJFNTUxNzA1\\nRjY0NUM4Qzg3OEE4LmNydDCB5wYDVR0fBIHfMIHcMGygaqBohmZodHRwOi8vbmV4\\ndXMtcHJvZHVjdGlvbi5ieXRlZGFuY2UuY29tL2FwaS9jZXJ0aWZpY2F0ZS9jcmwv\\nNDhGOUMwRTdCMEM1QTcwNUI5ODJCRTU1MTcwNUY2NDVDOEM4NzhBOC5jcmwwbKBq\\noGiGZmh0dHA6Ly9uZXh1cy1wcm9kdWN0aW9uLmJ5dGVkYW5jZS5uZXQvYXBpL2Nl\\ncnRpZmljYXRlL2NybC80OEY5QzBFN0IwQzVBNzA1Qjk4MkJFNTUxNzA1RjY0NUM4\\nQzg3OEE4LmNybDAKBggqhkjOPQQDAgNJADBGAiEAqMjT5ADMdGMeaImoJK4J9jzE\\nLqZ573rNjsT3k14pK50CIQCLpWHVKWi71qqqrMjiSDvUhpyO1DpTPRHlavPRuaNm\\nww==\\n-----END CERTIFICATE-----\",\"sn\":\"533240336124694022040808462028007165443034493949\",\"createdTime\":1773628457996}"}, {"name": "__tea_cache_first_1661", "value": "1"}, {"name": "SLARDARdouyin_creator", "value": "JTdCJTIydXNlcklkJTIyOiUyMjIwZWNhY2FkLTQ3YmItNGU4NS1hNDdlLWYwNWExZWY3Y2Q1MCUyMiwlMjJkZXZpY2VJZCUyMjolMjJiOTZlZDY1Ni04NzA3LTQ1YzUtYTVkZS1kOGMxZmZhNGM3N2IlMjIsJTIyZXhwaXJlcyUyMjoxNzgxNDA0NDU2NzA5JTdE"}, {"name": "SLARDARuc_secure_sdk", "value": "JTdCJTIydXNlcklkJTIyOiUyMjA1MDIxMzQzLTdiNTMtNDRhMy05MzIzLWE1MjlmMTJhNTZmMiUyMiwlMjJkZXZpY2VJZCUyMjolMjI5ZjU1NWQxNC0yZTkzLTQyNzEtYTJjOC00YjM0YjQ2YTIzMWYlMjIsJTIyZXhwaXJlcyUyMjoxNzgxNDA0NDU2NzczJTdE"}, {"name": "__tea_cache_tokens_1661", "value": "{\"web_id\":\"1214251571020068476\",\"user_unique_id\":\"1214251571020068476\",\"timestamp\":1773628461080,\"_type_\":\"default\"}"}, {"name": "web_runtime_security_uid", "value": "afe27935-a343-4dff-a430-88988fd6da20"}, {"name": "security-sdk/s_sdk_crypt_sdk", "value": "{\"data\":\"{\\\"ec_privateKey\\\":\\\"-----BEGIN PRIVATE KEY-----\\\\r\\\\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgLwpZRK5hGH6WvMpA\\\\r\\\\nDISYV+YozN3lqratF1kKRCOvX2qhRANCAARODJ94gz2UI790rX8OPmn0JJwROTsX\\\\r\\\\nGth0RdYmBqtvCyei9YjnEFVO5tnTE2yx9Fr0nCvbuK58TeL9Lk/I7Rex\\\\r\\\\n-----END PRIVATE KEY-----\\\\r\\\\n\\\",\\\"ec_publicKey\\\":\\\"-----BEGIN PUBLIC KEY-----\\\\r\\\\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETgyfeIM9lCO/dK1/Dj5p9CScETk7\\\\r\\\\nFxrYdEXWJgarbwsnovWI5xBVTubZ0xNssfRa9Jwr27iufE3i/S5PyO0XsQ==\\\\r\\\\n-----END PUBLIC KEY-----\\\\r\\\\n\\\",\\\"ec_csr\\\":\\\"\\\"}\"}"}]}, {"origin": "https://lf-zt.douyin.com", "localStorage": [{"name": "security-sdk/s_sdk_crypt_sdk", "value": "{\"data\":\"{\\\"ec_privateKey\\\":\\\"-----BEGIN PRIVATE KEY-----\\\\r\\\\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgLwpZRK5hGH6WvMpA\\\\r\\\\nDISYV+YozN3lqratF1kKRCOvX2qhRANCAARODJ94gz2UI790rX8OPmn0JJwROTsX\\\\r\\\\nGth0RdYmBqtvCyei9YjnEFVO5tnTE2yx9Fr0nCvbuK58TeL9Lk/I7Rex\\\\r\\\\n-----END PRIVATE KEY-----\\\\r\\\\n\\\",\\\"ec_publicKey\\\":\\\"-----BEGIN PUBLIC KEY-----\\\\r\\\\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETgyfeIM9lCO/dK1/Dj5p9CScETk7\\\\r\\\\nFxrYdEXWJgarbwsnovWI5xBVTubZ0xNssfRa9Jwr27iufE3i/S5PyO0XsQ==\\\\r\\\\n-----END PUBLIC KEY-----\\\\r\\\\n\\\",\\\"ec_csr\\\":\\\"\\\"}\"}"}]}]} \ No newline at end of file +{"cookies": [{"name": "gd_random", "value": "eyJtYXRjaCI6dHJ1ZSwicGVyY2VudCI6MC4yODI0NDE3NDQwNzI1NDIxfQ==.l21IkfaRl0IrEzWxAif4VTQN3cYFX2JQFjvKpcW8d00=", "domain": "creator.douyin.com", "path": "/goofy/douyin_creator_pc/creator_pc_vmok_common/vmok-manifest.json", "expires": 1774255503.26378, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "gd_random", "value": "eyJwZXJjZW50IjowLjI4MjQ0MTc0NDA3MjU0MjEsIm1hdGNoIjpmYWxzZX0=.+KDfSAPm+zwkCnEl6yxB2/60ZNd6yYzHdoU91yZ0Y5g=", "domain": "creator.douyin.com", "path": "/goofy/douyin_creator_pc/mono/creator_content", "expires": 1774255503.279441, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "gd_random", "value": "eyJtYXRjaCI6ZmFsc2UsInBlcmNlbnQiOjAuMjgyNDQxNzQ0MDcyNTQyMX0=.Zn3fSXrBjJqVJ6bQbTcNfL7xPo/HdI2j4rH7mY6JHQM=", "domain": "creator.douyin.com", "path": "/goofy/douyin_creator_pc", "expires": 1774255313.138442, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "x-web-secsdk-uid", "value": "afe27935-a343-4dff-a430-88988fd6da20", "domain": "creator.douyin.com", "path": "/", "expires": -1, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gfkadpd", "value": "2906,33638", "domain": "creator.douyin.com", "path": "/", "expires": 1773887655, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "_tea_utm_cache_2906", "value": "undefined", "domain": ".creator.douyin.com", "path": "/", "expires": 1774233256, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "csrf_session_id", "value": "8f3611da130c0e50aace4ccd84347505", "domain": "creator.douyin.com", "path": "/", "expires": -1, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "ttwid", "value": "1%7Cg8Numyy_SiIFKe5aJA29jPKTN0J2g5UmrKJ2C24I-_A%7C1773628457%7Cf6d3bf9e896032a5a829c50b73599e9fb3f02a5d59aaedcf2d071a695e217470", "domain": ".bytedance.com", "path": "/", "expires": 1805164456.979941, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "__security_mc_1_s_sdk_crypt_sdk", "value": "61ed0a83-43c8-92d1", "domain": ".douyin.com", "path": "/", "expires": 1778812457.72933, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "bd_ticket_guard_client_web_domain", "value": "2", "domain": ".douyin.com", "path": "/", "expires": 1778834703.310412, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "passport_csrf_token", "value": "3c5345bd14901a46a81cd77a4277d07b", "domain": ".douyin.com", "path": "/", "expires": 1778812457.912284, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "passport_csrf_token_default", "value": "3c5345bd14901a46a81cd77a4277d07b", "domain": ".douyin.com", "path": "/", "expires": 1778812457.912318, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "__security_mc_1_s_sdk_cert_key", "value": "275e262e-44fa-b848", "domain": ".douyin.com", "path": "/", "expires": 1778812461.417625, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "__security_mc_1_s_sdk_sign_data_key_web_protect", "value": "f4387b25-42b3-9462", "domain": ".douyin.com", "path": "/", "expires": 1778812461.417768, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "sdk_source_info", "value": "7e276470716a68645a606960273f276364697660272927676c715a6d6069756077273f276364697660272927666d776a68605a607d71606b766c6a6b5a7666776c7571273f275e58272927666a6b766a69605a696c6061273f27636469766027292762696a6764695a7364776c6467696076273f275e5827292771273f2732343c373333353033363232342778", "domain": ".douyin.com", "path": "/", "expires": 1773650963.091297, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "bit_env", "value": "5TWup4OzUhCYYgovunB4WvKFFUW78pLfLIzFwf4eheuVJJC1gh1SLlOYFgxKw9uxhoIAPCBLQsSWKgT2lX6mPD8KtLV3Wm867s2e3tR0dowUQUcgl9ZRfppSlcWVaXxtKn_dgfaNlu9O0pqM_x8heaAP4qqbBg8yakUd3crwWCITgVtShbtZ6lY4yG2Djs-KiqrfOF9TN7QsCj5ScR7GfrFQvLH6TzXHa4xCOWZlWt0MbnEhyryC_6HK6wyxOyvJV0VwjozpUIJDoB1kQ9-L1ris4CvsTMDX652wvPtPj2_HGxR47nbOxHWqWG0RKmI1g5pW-muhoeBNmy7SaEEj2JPqfFmYfty6XNSsGm3SRHRIZy1g4qtfvY_g9W3MWbBpv1naNDp78576IpbIHNj25khnZ22ooz2iHNna13sZvoqkO076T1dX2uusuvpICJiv9yzpKjdywX-1tap-7-y-yDGlzpOCvNEuEmD6eX-43Fl6qT3MOeXoyTpft7l00_GUKtlCdVwLu-eMN2styq7BV3PA0r6std-HdpeDfJWp3dA%3D", "domain": ".douyin.com", "path": "/", "expires": 1773650963.091525, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gulu_source_res", "value": "eyJwX2luIjoiMDhjOGQ3ZTJiODQyNjZkZWI5Y2VkMGJiODNlNmY1ZWY0ZjMyNTE2ZmYyZjAzNDMzZjI0OWU1Y2Q1NTczNTk5NyJ9", "domain": ".douyin.com", "path": "/", "expires": 1773650963.091663, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "passport_auth_mix_state", "value": "2ysoizhn4a5b8wsmh1c1tcqssyadrpohfqunmqaaaqd17ajd", "domain": ".douyin.com", "path": "/", "expires": 1773650903.091725, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gd_random", "value": "eyJtYXRjaCI6ZmFsc2UsInBlcmNlbnQiOjAuMjgyNDQxNzQ0MDcyNTQyMX0=.Zn3fSXrBjJqVJ6bQbTcNfL7xPo/HdI2j4rH7mY6JHQM=", "domain": "creator.douyin.com", "path": "/", "expires": 1774255502.756075, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "bd_ticket_guard_client_data", "value": "eyJiZC10aWNrZXQtZ3VhcmQtdmVyc2lvbiI6MiwiYmQtdGlja2V0LWd1YXJkLWl0ZXJhdGlvbi12ZXJzaW9uIjoxLCJiZC10aWNrZXQtZ3VhcmQtcmVlLXB1YmxpYy1rZXkiOiJCRTRNbjNpRFBaUWp2M1N0Znc0K2FmUWtuQkU1T3hjYTJIUkYxaVlHcTI4TEo2TDFpT2NRVlU3bTJkTVRiTEgwV3ZTY0s5dTRybnhONHYwdVQ4anRGN0U9IiwiYmQtdGlja2V0LWd1YXJkLXdlYi12ZXJzaW9uIjoyfQ%3D%3D", "domain": ".douyin.com", "path": "/", "expires": 1778834703.310343, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "ttwid", "value": "1%7Cg8Numyy_SiIFKe5aJA29jPKTN0J2g5UmrKJ2C24I-_A%7C1773650709%7Cae84e5ce8847b9273ba2a0ef64e72fdbf24de60a1348523c625972cefd713ba2", "domain": ".douyin.com", "path": "/", "expires": 1805186709.014785, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "passport_fe_beating_status", "value": "false", "domain": ".creator.douyin.com", "path": "/", "expires": -1, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "biz_trace_id", "value": "7b4f0c63", "domain": ".douyin.com", "path": "/", "expires": -1, "httpOnly": false, "secure": false, "sameSite": "Lax"}], "origins": [{"origin": "https://creator.douyin.com", "localStorage": [{"name": "__tea_cache_tokens_2906", "value": "{\"user_unique_id\":\"7617676187620034091\",\"web_id\":\"7617676187620034091\",\"timestamp\":1773650702939}"}, {"name": "LOGIN_STATUS", "value": "{\"logintype\":\"user\",\"loginapp\":\"douyin\"}"}, {"name": "__msuuid__", "value": "506acfba-2efb-4b5f-aa3a-6aab9eb7a1d9"}, {"name": "CREATOR_LAYOUT_CONFIG", "value": "{\"headerLogo\":{\"douyin\":{\"src\":\"//lf3-static.bytednsdoc.com/obj/eden-cn/lm-yvahlyj-upfbvk/ljhwZthlaukjlkulzlp/pc/icons/logo.png\"},\"huoshan\":{\"src\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_header_logo_h.png~tplv-obj.image\"}},\"hotsoonHelpShow\":false,\"footerLink\":[{\"children\":\"\u8d26\u53f7\u6388\u6743\u534f\u8bae\",\"href\":\"//lf3-beecdn.bytetos.com/obj/ies-fe-bee/bee_prod/biz_181/bee_prod_181_bee_publish_1095.html\"},{\"children\":\"\u7528\u6237\u670d\u52a1\u534f\u8bae\",\"href\":\" //www.douyin.com/agreement/\"},{\"children\":\"\u9690\u79c1\u653f\u7b56\",\"href\":\" //www.douyin.com/privacy/\"},{\"children\":\"\u8d26\u53f7\u627e\u56de\",\"href\":\" //www.douyin.com/recovery_account/\"},{\"children\":\"\u8054\u7cfb\u6211\u4eec\",\"href\":\" //www.douyin.com/aboutus/\"}],\"footerText\":[[\"2025 \u00a9 \u6296\u97f3\",\"[\u4eacICP\u590716016397\u53f7-3](https://beian.miit.gov.cn/)\",\"[\u5317\u4eac\u6296\u97f3\u79d1\u6280\u6709\u9650\u516c\u53f8](https://lf3-static.bytednsdoc.com/obj/eden-cn/lm-yvahlyj-upfbvk/ljhwZthlaukjlkulzlp/\u8425\u4e1a\u6267\u7167.jpg)\",\"[\u4eacB2-20170846](https://lf3-static.bytednsdoc.com/obj/eden-cn/lm-yvahlyj-upfbvk/ljhwZthlaukjlkulzlp/\u589e\u503c\u7535\u4fe1\u4e1a\u52a1\u7ecf\u8425\u8bb8\u53ef\u8bc1.jpg)\"],[\"[\u4e2d\u56fd\u4e92\u8054\u7f51\u4e3e\u62a5\u4e2d\u5fc3](http://www.12377.cn/)\",\"[\u7f51\u7edc\u6587\u5316\u7ecf\u8425\u8bb8\u53ef\u8bc1-\u4eac\u7f51\u6587\u30142025\u30150181-061\u53f7](https://lf3-static.bytednsdoc.com/obj/eden-cn/lm-yvahlyj-upfbvk/ljhwZthlaukjlkulzlp/\u7f51\u7edc\u7ecf\u8425\u8bb8\u53ef\u8bc1.jpg)\",\"\u8fdd\u6cd5\u548c\u4e0d\u826f\u4fe1\u606f\u4e3e\u62a5\uff1a400-140-2108\",\"\u4e3e\u62a5\u90ae\u7bb1\uff1afeedback@douyin.com\"],[\"![pic](//p3.douyinpic.com/aweme-server-static-resource/gongan_d0289dc.png~tplv-obj.image)\",\"[\u4eac\u516c\u7f51\u5b89\u590711000002002046\u53f7](http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11000002002046)\",\"\u5730\u5740\uff1a\u5317\u4eac\u5e02\u6d77\u6dc0\u533a\u5317\u4e09\u73af\u897f\u8def\u753218\u53f7\u96624\u53f7\u697c2\u5c422022\"]],\"permissionKeys\":[{\"itemKey\":\"/authority\",\"text\":\"\u6388\u6743\u7ba1\u7406\",\"show\":true,\"permission\":\"CreatorConferManage\"},{\"itemKey\":\"/content/\",\"text\":\"\u5185\u5bb9\u7ba1\u7406\",\"path\":[\"/live/media/create\",\"/live/media/room\",\"/live/media/list\"],\"show\":true,\"permission\":\"CreatorContentManage\"},{\"itemKey\":\"/following\",\"text\":\"\u4e92\u52a8\u7ba1\u7406\",\"show\":true,\"permission\":\"CreatorInterManage\"},{\"itemKey\":\"/data\",\"text\":\"\u6570\u636e\u7ba1\u7406\",\"path\":[\"/live/media/data\"],\"show\":true,\"permission\":\"CreatorDataManage\"},{\"itemKey\":\"/musician\",\"text\":\"\u97f3\u4e50\u7ba1\u7406\",\"show\":true,\"restrictHotsoon\":true,\"permission\":\"CreatorMusicManage\"},{\"itemKey\":\"/publicity/topic\",\"text\":\"\u5ba3\u53d1\u7ba1\u7406\",\"show\":false,\"restrictHotsoon\":true,\"permission\":\"CreatorContentManage.Challenge\"}],\"headerIcons\":[{\"src\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_header_notification_icon.svg~tplv-obj.image\",\"link\":\"https://creator.douyin.com/message\",\"visible\":{\"has_unread_message\":false,\"is_login_hotsoon\":false}},{\"src\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_header_notification.png~tplv-obj.image\",\"link\":\"https://creator.douyin.com/message\",\"style\":{\"width\":\"24px\",\"height\":\"24px\"},\"badge\":{\"count\":\"unread_message_count\"},\"visible\":{\"has_unread_message\":true,\"is_login_hotsoon\":false}}],\"sidebarFollowerTip\":\"\u4ec5\u5c55\u793a\u6296\u97f3\u7c89\u4e1d\",\"sidebarData\":{\"data\":[{\"name\":\"\u89c6\u9891\u6570\u636e\",\"keyName\":\"CreatorDataManage\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_vedio.svg~tplv-obj.image\",\"auth\":true,\"children\":[{\"path\":\"/data/stats/overview\",\"name\":\"\u6570\u636e\u603b\u89c8\",\"keyName\":\"CreatorDataManage.UserOverview\",\"visible\":{\"is_login_hotsoon\":false}},{\"path\":\"/data/stats/video\",\"name\":\"\u4f5c\u54c1\u6570\u636e\",\"keyName\":\"CreatorDataManage.ItemL2\",\"visible\":{\"is_login_hotsoon\":false}},{\"path\":\"/data/stats/follower/portrait\",\"name\":\"\u7c89\u4e1d\u753b\u50cf\",\"keyName\":\"CreatorDataManage.Portrait\",\"visible\":{\"is_login_hotsoon\":false}},{\"path\":\"/data/stats/hotsoon-overview\",\"name\":\"\u6570\u636e\u603b\u89c8\",\"keyName\":\"CreatorDataManage.UserOverview\",\"visible\":{\"is_login_hotsoon\":true}},{\"path\":\"/data/stats/hotsoon-item\",\"name\":\"\u4f5c\u54c1\u6570\u636e\",\"keyName\":\"CreatorDataManage.ItemL2\",\"visible\":{\"is_login_hotsoon\":true}},{\"path\":\"/weekly\",\"name\":\"\u521b\u4f5c\u5468\u62a5\",\"keyName\":\"CreatorDataManage.WeekReport\",\"visible\":{\"is_login_hotsoon\":false}}]},{\"name\":\"\u76f4\u64ad\u6570\u636e\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_data_icon.svg~tplv-obj.image\",\"auth\":true,\"children\":[{\"path\":\"/data/live/overview\",\"name\":\"\u6570\u636e\u603b\u89c8\",\"key\":\"CreatorDataManage.Live\"},{\"path\":\"/live/media/data\",\"name\":\"\u6570\u636e\u603b\u89c8\",\"key\":\"CreatorLiveManage.Data\"},{\"path\":\"/data/live/video\",\"name\":\"\u5355\u573a\u6570\u636e\",\"key\":\"CreatorDataManage.Live\"}]},{\"name\":\"\u91cd\u70b9\u5173\u6ce8\",\"keyName\":\"CreatorDataManage\",\"auth\":true,\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_inportant.svg~tplv-obj.image\",\"visible\":[{\"status_code\":8,\"window.location.host\":\"creator.douyin.com\"},{\"status_code\":15384,\"window.location.host\":\"creator.douyin.com\"},{\"is_login_hotsoon\":false}],\"children\":[{\"path\":\"/data/important/following\",\"name\":\"\u6211\u5173\u5fc3\u7684\",\"keyName\":\"CreatorDataManage.TraceOthers\"},{\"path\":\"/data/important/keyword\",\"name\":\"\u4e0e\u6211\u76f8\u5173\",\"keyName\":\"CreatorDataManage.SearchSelf\"}]}],\"interaction\":[{\"name\":\"\u4e92\u52a8\u7ba1\u7406\",\"keyName\":\"CreatorInterManage\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_following.svg~tplv-obj.image\",\"auth\":true,\"children\":[{\"path\":\"/following/following\",\"name\":\"\u5173\u6ce8\u7ba1\u7406\"},{\"path\":\"/following/follower\",\"name\":\"\u7c89\u4e1d\u7ba1\u7406\"},{\"path\":\"/following/comment\",\"name\":\"\u8bc4\u8bba\u7ba1\u7406\",\"visible\":{\"is_login_hotsoon\":false}},{\"path\":\"/following/chat\",\"name\":\"\u79c1\u4fe1\u7ba1\u7406\",\"key\":\"CreatorInterManage.im\",\"keyName\":\"CreatorInterManage.im\",\"visible\":{\"is_login_hotsoon\":false,\"douyin_user_verify_info.teen_model\":false}}]}],\"publicity\":[{\"name\":\"\u5ba3\u53d1\u7ba1\u7406\",\"key\":\"CreatorContentManage.Challenge\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_publicity.svg~tplv-obj.image\",\"children\":[{\"path\":\"/publicity/topic\",\"name\":\"\u8bdd\u9898\u7ba1\u7406\"}]}],\"music\":[{\"name\":\"\u97f3\u4e50\u7ba1\u7406\",\"key\":\"CreatorMusicManage\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_music.svg~tplv-obj.image\",\"children\":[{\"path\":\"/musician\",\"name\":\"\u6982\u89c8\"},{\"path\":\"/musician/songs\",\"name\":\"\u97f3\u4e50\u7ba1\u7406\"},{\"path\":\"/musician/statistics\",\"name\":\"\u6570\u636e\u7ba1\u7406\"}]}],\"live\":[{\"name\":\"\u76f4\u64ad\u7ba1\u7406\",\"key\":\"CreatorLiveManage\",\"children\":[{\"path\":\"/live/media/create\",\"name\":\"\u521b\u5efa\u76f4\u64ad\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ttfe_open_creator_sidebar_livecreate.svg~tplv-obj.image\",\"key\":\"CreatorLiveManage.Create\"},{\"path\":\"/live/media/list\",\"name\":\"\u76f4\u64ad\u5217\u8868\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ttfe_open_creator_sidebar_livelist.svg~tplv-obj.image\",\"key\":\"CreatorLiveManage.List\"},{\"path\":\"/live/media/replay\",\"name\":\"\u76f4\u64ad\u56de\u653e\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ttfe_open_creator_sidebar_livereplay.svg~tplv-obj.image\",\"key\":\"CreatorLiveManage.Replay\"}]},{\"name\":\"\u6570\u636e\u7ba1\u7406\",\"key\":\"CreatorLiveManage.Data\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ttfe_open_creator_sidebar_livedata.svg~tplv-obj.image\",\"children\":[{\"path\":\"/live/media/data\",\"name\":\"\u76f4\u64ad\u6570\u636e\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ttfe_open_creator_sidebar_livedata.svg~tplv-obj.image\",\"key\":\"CreatorLiveManage.Data\"}]}],\"media\":[{\"name\":\"\u53d1\u5e03\u89c6\u9891\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_upload_v2.svg~tplv-obj.image\",\"path\":[\"/content/upload\",\"/content/publish\"]},{\"name\":\"\u5185\u5bb9\u7ba1\u7406\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_manage_v2.svg~tplv-obj.image\",\"children\":[{\"path\":\"/content/manage\",\"name\":\"\u89c6\u9891\u7ba1\u7406\",\"icon\":\"\"},{\"path\":[\"/content/collection/manage\",\"/content/collection/detail\",\"/content/collection/create\"],\"name\":\"\u5408\u96c6\u7ba1\u7406\",\"icon\":\"\",\"visContextKey\":\"userInfo.mix_permission\",\"visContextValue\":true},{\"path\":\"/content/safeguard\",\"name\":\"\u7ef4\u6743\u7ba1\u7406\",\"icon\":\"\",\"visContextKey\":\"userInfo.permission.user_sign\",\"visContextValue\":true}]},{\"name\":\"\u76f4\u64ad\u7ba1\u7406\",\"icon\":\"//p3.douyinpic.com/aweme-server-static-resource/ies_douyin_opencn_tiktok_creator_sidebar_livecreate_v2.svg~tplv-obj.image\",\"visContextKey\":\"creatorMenu.live_manage\",\"visContextValue\":true,\"children\":[{\"path\":\"/live/media/create\",\"name\":\"\u521b\u5efa\u76f4\u64ad\",\"icon\":\"\",\"key\":\"CreatorLiveManage.Create\",\"visContextKey\":\"creatorMenu.media_auth\",\"visContextValue\":true},{\"path\":\"/live/media/list\",\"name\":\"\u76f4\u64ad\u5217\u8868\",\"icon\":\"\",\"key\":\"CreatorLiveManage.List\",\"visContextKey\":\"creatorMenu.media_auth\",\"visContextValue\":true},{\"path\":\"/content/live/replay\",\"name\":\"\u76f4\u64ad\u56de\u653e\",\"icon\":\"\",\"key\":\"CreatorLiveManage.Replay\",\"visContextKey\":\"creatorMenu.replay_auth\",\"visContextValue\":true},{\"path\":\"/content/live/replay\",\"name\":\"\u76f4\u64ad\u56de\u653e\",\"key\":\"CreatorCommonManage.Replay\"}]}]}}"}, {"name": "__tea_cache_first_2906", "value": "1"}, {"name": "xmst", "value": "THk1MvC4ZAHg3ACok_XOgidUS1i2v5l-xADnS6f4hb2Wz3JBHX3MN19e18kr9dMyARgkFWGcOYQTjtruvdej5P_CEmj8JQmwxetj2YxHGB819DagNEE1rCAhzQ2yvepovJ0jsBLU5UCYZWqEapZxNg9LUBVh6L3So9bLwbzP7TciEvBmVyQZdEup1A=="}, {"name": "ztsdk_tcc_config", "value": "{\"value\":{\"ztsdk_config\":{\"2906\":[{\"aid\":2906,\"scene\":\"web_protect\",\"certType\":\"cookie\",\"providerPathList\":[],\"consumerPathList\":[\"/aweme/v1/creator/relation/create/\",\"/web/api/v2/creator/activity/collect/\",\"/live/api/room/create_media_room/\",\"/aweme/janus/creator/comment/aweme/v1/web/comment/multi_publish/\",\"/aweme/v1/web/comment/multi_publish/\",\"/aweme/janus/creator/comment/aweme/v1/comment/publish/\",\"/aweme/v1/web/comment/publish/\",\"/aweme/janus/creator/comment/aweme/v1/web/comment/digg/\",\"/aweme/v1/web/comment/digg/\",\"/aweme/janus/creator/comment/aweme/v1/web/comment/multi_delete/\",\"/aweme/v1/web/comment/multi_delete/\",\"/aweme/v1/creator/comment/reply/\",\"/aweme/v1/creator/comment/action/\"],\"signVersion\":2}],\"6383\":[{\"aid\":6383,\"scene\":\"web_protect\",\"certType\":\"cookie\",\"consumerPathList\":[\"/aweme/v1/web/comment/list/reply/\",\"/aweme/v1/web/comment/list/\",\"/aweme/v2/web/comment/list/reply/\"],\"signVersion\":2}]}},\"expire\":1773672113389}"}, {"name": "security-sdk/s_sdk_server_cert_key", "value": "{\"cert\":\"-----BEGIN CERTIFICATE-----\\nMIIEfTCCBCKgAwIBAgIUXWdS2tzmSoewCWfKFyiWMrJqs/0wCgYIKoZIzj0EAwIw\\nMTELMAkGA1UEBhMCQ04xIjAgBgNVBAMMGXRpY2tldF9ndWFyZF9jYV9lY2RzYV8y\\nNTYwIBcNMjIxMTE4MDUyMDA2WhgPMjA2OTEyMzExNjAwMDBaMCQxCzAJBgNVBAYT\\nAkNOMRUwEwYDVQQDEwxlY2llcy1zZXJ2ZXIwWTATBgcqhkjOPQIBBggqhkjOPQMB\\nBwNCAASE2llDPlfc8Rq+5J5HXhg4edFjPnCF3Ua7JBoiE/foP9m7L5ELIcvxCgEx\\naRCHbQ8kCCK/ArZ4FX/qCobZAkToo4IDITCCAx0wDgYDVR0PAQH/BAQDAgWgMDEG\\nA1UdJQQqMCgGCCsGAQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwME\\nMCkGA1UdDgQiBCABydxqGrVEHhtkCWTb/vicGpDZPFPDxv82wiuywUlkBDArBgNV\\nHSMEJDAigCAypWfqjmRIEo3MTk1Ae3MUm0dtU3qk0YDXeZSXeyJHgzCCAZQGCCsG\\nAQUFBwEBBIIBhjCCAYIwRgYIKwYBBQUHMAGGOmh0dHA6Ly9uZXh1cy1wcm9kdWN0\\naW9uLmJ5dGVkYW5jZS5jb20vYXBpL2NlcnRpZmljYXRlL29jc3AwRgYIKwYBBQUH\\nMAGGOmh0dHA6Ly9uZXh1cy1wcm9kdWN0aW9uLmJ5dGVkYW5jZS5uZXQvYXBpL2Nl\\ncnRpZmljYXRlL29jc3AwdwYIKwYBBQUHMAKGa2h0dHA6Ly9uZXh1cy1wcm9kdWN0\\naW9uLmJ5dGVkYW5jZS5jb20vYXBpL2NlcnRpZmljYXRlL2Rvd25sb2FkLzQ4RjlD\\nMEU3QjBDNUE3MDVCOTgyQkU1NTE3MDVGNjQ1QzhDODc4QTguY3J0MHcGCCsGAQUF\\nBzAChmtodHRwOi8vbmV4dXMtcHJvZHVjdGlvbi5ieXRlZGFuY2UubmV0L2FwaS9j\\nZXJ0aWZpY2F0ZS9kb3dubG9hZC80OEY5QzBFN0IwQzVBNzA1Qjk4MkJFNTUxNzA1\\nRjY0NUM4Qzg3OEE4LmNydDCB5wYDVR0fBIHfMIHcMGygaqBohmZodHRwOi8vbmV4\\ndXMtcHJvZHVjdGlvbi5ieXRlZGFuY2UuY29tL2FwaS9jZXJ0aWZpY2F0ZS9jcmwv\\nNDhGOUMwRTdCMEM1QTcwNUI5ODJCRTU1MTcwNUY2NDVDOEM4NzhBOC5jcmwwbKBq\\noGiGZmh0dHA6Ly9uZXh1cy1wcm9kdWN0aW9uLmJ5dGVkYW5jZS5uZXQvYXBpL2Nl\\ncnRpZmljYXRlL2NybC80OEY5QzBFN0IwQzVBNzA1Qjk4MkJFNTUxNzA1RjY0NUM4\\nQzg3OEE4LmNybDAKBggqhkjOPQQDAgNJADBGAiEAqMjT5ADMdGMeaImoJK4J9jzE\\nLqZ573rNjsT3k14pK50CIQCLpWHVKWi71qqqrMjiSDvUhpyO1DpTPRHlavPRuaNm\\nww==\\n-----END CERTIFICATE-----\",\"sn\":\"533240336124694022040808462028007165443034493949\",\"createdTime\":1773628457996}"}, {"name": "SLARDARdouyin_creator", "value": "JTdCJTIydXNlcklkJTIyOiUyMjIwZWNhY2FkLTQ3YmItNGU4NS1hNDdlLWYwNWExZWY3Y2Q1MCUyMiwlMjJkZXZpY2VJZCUyMjolMjJiOTZlZDY1Ni04NzA3LTQ1YzUtYTVkZS1kOGMxZmZhNGM3N2IlMjIsJTIyZXhwaXJlcyUyMjoxNzgxNDI2NzAyODQwJTdE"}, {"name": "__tea_cache_first_1661", "value": "1"}, {"name": "https://creator.douyin.com-operation", "value": "false"}, {"name": "__tea_cache_tokens_1661", "value": "{\"web_id\":\"1214251571020068476\",\"user_unique_id\":\"1214251571020068476\",\"timestamp\":1773650704882,\"_type_\":\"default\"}"}, {"name": "SLARDARuc_secure_sdk", "value": "JTdCJTIydXNlcklkJTIyOiUyMjA1MDIxMzQzLTdiNTMtNDRhMy05MzIzLWE1MjlmMTJhNTZmMiUyMiwlMjJkZXZpY2VJZCUyMjolMjI5ZjU1NWQxNC0yZTkzLTQyNzEtYTJjOC00YjM0YjQ2YTIzMWYlMjIsJTIyZXhwaXJlcyUyMjoxNzgxNDI2NzAzMjUwJTdE"}, {"name": "web_runtime_security_uid", "value": "afe27935-a343-4dff-a430-88988fd6da20"}, {"name": "security-sdk/s_sdk_crypt_sdk", "value": "{\"data\":\"{\\\"ec_privateKey\\\":\\\"-----BEGIN PRIVATE KEY-----\\\\r\\\\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgLwpZRK5hGH6WvMpA\\\\r\\\\nDISYV+YozN3lqratF1kKRCOvX2qhRANCAARODJ94gz2UI790rX8OPmn0JJwROTsX\\\\r\\\\nGth0RdYmBqtvCyei9YjnEFVO5tnTE2yx9Fr0nCvbuK58TeL9Lk/I7Rex\\\\r\\\\n-----END PRIVATE KEY-----\\\\r\\\\n\\\",\\\"ec_publicKey\\\":\\\"-----BEGIN PUBLIC KEY-----\\\\r\\\\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETgyfeIM9lCO/dK1/Dj5p9CScETk7\\\\r\\\\nFxrYdEXWJgarbwsnovWI5xBVTubZ0xNssfRa9Jwr27iufE3i/S5PyO0XsQ==\\\\r\\\\n-----END PUBLIC KEY-----\\\\r\\\\n\\\",\\\"ec_csr\\\":\\\"\\\"}\"}"}]}, {"origin": "https://lf-zt.douyin.com", "localStorage": [{"name": "security-sdk/s_sdk_crypt_sdk", "value": "{\"data\":\"{\\\"ec_privateKey\\\":\\\"-----BEGIN PRIVATE KEY-----\\\\r\\\\nMIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgLwpZRK5hGH6WvMpA\\\\r\\\\nDISYV+YozN3lqratF1kKRCOvX2qhRANCAARODJ94gz2UI790rX8OPmn0JJwROTsX\\\\r\\\\nGth0RdYmBqtvCyei9YjnEFVO5tnTE2yx9Fr0nCvbuK58TeL9Lk/I7Rex\\\\r\\\\n-----END PRIVATE KEY-----\\\\r\\\\n\\\",\\\"ec_publicKey\\\":\\\"-----BEGIN PUBLIC KEY-----\\\\r\\\\nMFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAETgyfeIM9lCO/dK1/Dj5p9CScETk7\\\\r\\\\nFxrYdEXWJgarbwsnovWI5xBVTubZ0xNssfRa9Jwr27iufE3i/S5PyO0XsQ==\\\\r\\\\n-----END PUBLIC KEY-----\\\\r\\\\n\\\",\\\"ec_csr\\\":\\\"\\\"}\"}"}]}]} \ No newline at end of file diff --git a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_api_publish.py b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_api_publish.py index d9763fcf..5ee7fdc0 100644 --- a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_api_publish.py +++ b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_api_publish.py @@ -375,6 +375,9 @@ async def poll_clip_result( if status == 1: return data + if "url" in data and "width" in data and "height" in data: + print(f" 转码完成(url+dimensions已返回)", flush=True) + return data if status < -1: print(f" [!] clip_result 失败: status={status}", flush=True) return None @@ -466,17 +469,27 @@ async def create_post( if scheduled_ts > 0: payload["postTimingInfo"] = {"timing": 1, "postTime": scheduled_ts} - headers = _micro_headers(cookie_str, uin, finger_print) - rid = f"{uuid.uuid4().hex[:8]}-{uuid.uuid4().hex[:8]}" - url = ( - f"{MICRO_PREFIX}/post/post_create" - f"?_aid={aid}&_rid={rid}" - f"&_pageUrl=https%3A%2F%2Fchannels.weixin.qq.com%2Fmicro%2Fcontent%2Fpost%2Fcreate" - ) - - r = httpx.post(url, json=payload, headers=headers, timeout=30) - resp = r.json() - print(f" [DEBUG] post_create response: {json.dumps(resp, ensure_ascii=False)[:300]}", flush=True) + # 尝试 CGI_PREFIX(标准助手端点)和 MICRO_PREFIX 两个路径 + for prefix, referer in [ + (CGI_PREFIX, "https://channels.weixin.qq.com/platform/post/create"), + (MICRO_PREFIX, "https://channels.weixin.qq.com/micro/content/post/create"), + ]: + headers = { + "Cookie": cookie_str, + "User-Agent": UA, + "Content-Type": "application/json", + "Referer": referer, + "x-wechat-uin": uin, + } + if finger_print: + headers["finger-print-device-id"] = finger_print + rid = f"{uuid.uuid4().hex[:8]}-{uuid.uuid4().hex[:8]}" + url = f"{prefix}/post/post_create" + r = httpx.post(url, json=payload, headers=headers, timeout=30) + resp = r.json() + print(f" [DEBUG] post_create ({prefix.split('/')[-2]}): {json.dumps(resp, ensure_ascii=False)[:300]}", flush=True) + if resp.get("errCode") == 0: + return resp return resp diff --git a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_headless_publish.py b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_headless_publish.py index 48c60b10..a75258ad 100644 --- a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_headless_publish.py +++ b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_headless_publish.py @@ -1,330 +1,298 @@ -#!/usr/bin/env python3 """ -视频号 headless 发布 v1 — 使用 Playwright 通过浏览器 UI 自动发布 -无需扫码:从 channels_storage_state.json 恢复会话。 -全程 headless(不弹窗)。 -""" -import asyncio -import json -import sys -import time -import random -from dataclasses import dataclass -from pathlib import Path +视频号 Headless 全自动发布脚本 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ +- 完全无窗口(headless Playwright) +- 通过 iframe 内的真实发布表单操作 +- 自动上传 → 填描述 → 填短标题 → 发表 +- 支持去重、定时发布 +- 以后所有视频号发布统一走这个脚本 +用法: + python channels_headless_publish.py /path/to/video_dir + python channels_headless_publish.py /path/to/video1.mp4 /path/to/video2.mp4 +""" +import asyncio, json, sys, random, time, argparse +from pathlib import Path from playwright.async_api import async_playwright -SCRIPT_DIR = Path(__file__).parent -COOKIE_FILE = SCRIPT_DIR / "channels_storage_state.json" -CREATE_URL = "https://channels.weixin.qq.com/platform/post/create" +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 + +SCRIPT_DIR = Path(__file__).resolve().parent +STORAGE_FILE = SCRIPT_DIR / "channels_storage_state.json" 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" + "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36" ) - -DESC_SUFFIX = "\n#Soul派对 #创业日记 #卡若 #创业" +DESC_SUFFIX = " #小程序 卡若创业派对" MINI_PROGRAM_LINK = "#小程序://卡若创业派对/gF4V4Vo4Ws4IiJa" -@dataclass -class PublishResult: - platform: str = "视频号" - video_path: str = "" - title: str = "" - success: bool = False - status: str = "" - message: str = "" - elapsed_sec: float = 0 +async def _get_iframe(page, timeout=20): + for _ in range(timeout): + for f in page.frames: + if "micro/content" in f.url: + return f + await asyncio.sleep(1) + return None -sys.path.insert(0, str(SCRIPT_DIR.parent.parent / "多平台分发" / "脚本")) -try: - from publish_result import is_published, log_publish -except ImportError: - def is_published(*a): return False - def log_publish(*a): pass - -try: - from video_metadata import VideoMeta -except ImportError: - VideoMeta = None - - -async def publish_one_headless( - context, video_path: str, title: str, idx: int, total: int, - scheduled_ts: int = 0, -) -> PublishResult: - fname = Path(video_path).name - fsize = Path(video_path).stat().st_size +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}" t0 = time.time() - print(f"\n[{idx}/{total}] {fname} ({fsize / 1024 / 1024:.1f}MB)", flush=True) - print(f" 标题: {title[:60]}", flush=True) + sched_label = "" + if scheduled_ts > 0: + import datetime as _dt + sched_label = f" [定时 {_dt.datetime.fromtimestamp(scheduled_ts).strftime('%H:%M')}]" - if is_published("视频号", video_path): + print(f"\n[{idx}/{total}] {video_path.name} ({fsize_mb:.1f}MB){sched_label}", flush=True) + + if is_published("视频号", str(video_path)): print(" [跳过] 已发布", flush=True) - return PublishResult(video_path=video_path, title=title, - success=True, status="skipped", message="去重跳过") + return PublishResult( + platform="视频号", video_path=str(video_path), title=title, + success=True, status="skipped", message="去重跳过", + ) - page = await context.new_page() try: - await page.goto(CREATE_URL, timeout=30000, wait_until="domcontentloaded") - await asyncio.sleep(3) + # 1. 加载发布页 + print(" 加载发布页...", flush=True) + await page.goto( + "https://channels.weixin.qq.com/platform/post/create", + wait_until="networkidle", timeout=30000, + ) + await asyncio.sleep(8) - if "login" in page.url: - print(" [!] Cookie 过期,需要重新登录", flush=True) - await page.close() - return PublishResult(video_path=video_path, title=title, - success=False, status="error", message="Cookie 过期") + frame = await _get_iframe(page) + if not frame: + return PublishResult( + platform="视频号", video_path=str(video_path), title=title, + success=False, status="error", message="未找到iframe", + elapsed_sec=time.time() - t0, + ) - print(" 等待上传区域...", flush=True) - upload_input = page.locator('input[type="file"][accept*="video"]') - await upload_input.wait_for(state="attached", timeout=15000) + # 2. iframe 内上传视频 + print(" 上传视频...", flush=True) + fi = frame.locator('input[type="file"]').first + await fi.set_input_files(str(video_path), timeout=10000) - print(" 选择视频文件...", flush=True) - await upload_input.set_input_files(video_path) - - print(" 等待视频处理...", flush=True) - await asyncio.sleep(5) - - for wait_round in range(60): - progress_el = page.locator('[class*="progress"], [class*="upload-progress"]') - if await progress_el.count() == 0: - break + upload_ok = False + for rnd in range(150): await asyncio.sleep(3) - if wait_round % 10 == 9: - print(f" 处理中... ({wait_round * 3}s)", flush=True) + st = await frame.evaluate("""() => { + const b = document.body.innerText || ''; + const v = document.querySelector('video'); + return { + done: b.includes('上传完成') || b.includes('重新上传') + || b.includes('编辑视频') || !!(v && v.src), + fail: b.includes('上传失败') || b.includes('格式不支持'), + uploading: b.includes('上传中'), + pct: (b.match(/(\\d+)%/) || [null, '-1'])[1], + }; + }""") + if st.get("done"): + print(f" 上传完成 ({time.time() - t0:.0f}s)", flush=True) + upload_ok = True + break + if st.get("fail"): + return PublishResult( + platform="视频号", video_path=str(video_path), title=title, + success=False, status="error", message="上传失败", + elapsed_sec=time.time() - t0, + ) + if rnd % 10 == 0: + print(f" 进度: {st.get('pct','-1')}% ({rnd*3}s)", flush=True) + if not upload_ok: + return PublishResult( + platform="视频号", video_path=str(video_path), title=title, + success=False, status="error", message="上传超时(7.5min)", + elapsed_sec=time.time() - t0, + ) await asyncio.sleep(3) - desc_full = title + DESC_SUFFIX + "\n" + MINI_PROGRAM_LINK - if VideoMeta: + # 3. 填写描述 + print(" 填写描述...", flush=True) + for sel in ['[contenteditable="true"]', "textarea"]: try: - vmeta = VideoMeta.from_filename(video_path) - desc_full = vmeta.description("视频号") + "\n" + MINI_PROGRAM_LINK + el = frame.locator(sel).first + if await el.count() > 0: + await el.click(timeout=3000) + await asyncio.sleep(0.3) + await frame.page.keyboard.type(desc_full[:500], delay=8) + break + except Exception: + continue + + # 4. 短标题 + try: + se = frame.locator('input[placeholder*="短标题"]').first + if await se.count() > 0: + short = stem[:16] if len(stem) >= 6 else stem + "|创业日记" + await se.fill(short, timeout=3000) + except Exception: + pass + + await asyncio.sleep(1) + + # 5. 点击发表 + print(" 点击发表...", flush=True) + try: + pb = frame.locator('button:has-text("发表")').first + await pb.click(timeout=5000) + except Exception: + await frame.evaluate("""() => { + const b = [...document.querySelectorAll('button')] + .find(x => x.textContent.trim() === '发表'); + if (b) b.click(); + }""") + + await asyncio.sleep(8) + + # 6. 处理弹窗 + for ct in ["确定", "确认", "我知道了"]: + try: + cb = frame.locator(f'button:has-text("{ct}")').first + if await cb.count() > 0 and await cb.is_visible(): + await cb.click(timeout=2000) + await asyncio.sleep(2) except Exception: pass - desc_input = page.locator('[class*="desc"] [contenteditable="true"], textarea[class*="desc"]').first - try: - await desc_input.wait_for(state="visible", timeout=8000) - await desc_input.click() - await asyncio.sleep(0.5) - await desc_input.fill("") - await desc_input.type(desc_full, delay=20) - print(f" 描述已填写", flush=True) - except Exception as e: - print(f" [!] 描述填写异常: {e}", flush=True) - - short_title_input = page.locator('[class*="short-title"] input, [class*="shortTitle"] input').first - try: - await short_title_input.wait_for(state="visible", timeout=5000) - short = title.split("#")[0].strip()[:16] - await short_title_input.fill(short) - print(f" 短标题: {short}", flush=True) - except Exception: - pass - - original_checkbox = page.locator('[class*="original"] input[type="checkbox"], [class*="original"] [role="checkbox"]').first - try: - await original_checkbox.wait_for(state="visible", timeout=3000) - if not await original_checkbox.is_checked(): - await original_checkbox.click() - print(" 声明原创: ✓", flush=True) - except Exception: - pass - - print(" 准备发表...", flush=True) - await asyncio.sleep(2) - - if scheduled_ts > 0: - import datetime - dt = datetime.datetime.fromtimestamp(scheduled_ts) - print(f" 定时发布: {dt.strftime('%Y-%m-%d %H:%M')}", flush=True) - - publish_btn = page.locator('button:has-text("发表"), button:has-text("发布"), [class*="publish-btn"]').first - await publish_btn.wait_for(state="visible", timeout=10000) - - post_created = asyncio.Event() - post_response = {} - - async def on_response(response): - if "post_create" in response.url: - try: - body = await response.json() - post_response.update(body) - post_created.set() - except Exception: - pass - - page.on("response", on_response) - - await publish_btn.click() - print(" 已点击发表按钮...", flush=True) - - try: - await asyncio.wait_for(post_created.wait(), timeout=120) - except asyncio.TimeoutError: - pass - + # 7. 验证 elapsed = time.time() - t0 + final = await frame.evaluate("""() => { + const b = document.body.innerText || ''; + return { + ok: b.includes('发表成功') || b.includes('发布成功'), + err: b.includes('发表失败'), + }; + }""") - if post_response: - err = post_response.get("errCode", -1) - if err == 0: - result = PublishResult( - video_path=video_path, title=title, - success=True, status="published", - message=f"headless 发布成功 ({elapsed:.1f}s)", - elapsed_sec=elapsed, - ) - log_publish("视频号", video_path, title, True) - print(f" [✓] 发布成功!", flush=True) - else: - result = PublishResult( - video_path=video_path, title=title, - success=False, status="error", - message=f"post_create errCode={err}: {post_response.get('errMsg','')}", - elapsed_sec=elapsed, - ) - print(f" [✗] errCode={err}", flush=True) + if final.get("ok") or "list" in page.url: + print(f" [✓] 发布成功! ({elapsed:.0f}s)", flush=True) + return PublishResult( + platform="视频号", video_path=str(video_path), title=title, + success=True, status="published", + message=f"headless发布成功 ({elapsed:.0f}s){sched_label}", + elapsed_sec=elapsed, + ) + elif final.get("err"): + return PublishResult( + platform="视频号", video_path=str(video_path), title=title, + success=False, status="error", message="发表失败", + elapsed_sec=elapsed, + ) else: - await asyncio.sleep(5) - current_url = page.url - if "list" in current_url or current_url != CREATE_URL: - result = PublishResult( - video_path=video_path, title=title, - success=True, status="published", - message=f"headless 发布成功(页面跳转确认)({elapsed:.1f}s)", - elapsed_sec=elapsed, - ) - log_publish("视频号", video_path, title, True) - print(f" [✓] 发布成功 (页面跳转)", flush=True) - else: - await page.screenshot(path=f"/tmp/ch_publish_fail_{idx}.png") - result = PublishResult( - video_path=video_path, title=title, - success=False, status="error", - message=f"发布结果不明确,截图已保存", - elapsed_sec=elapsed, - ) - print(f" [?] 结果不明确,截图保存到 /tmp/ch_publish_fail_{idx}.png", flush=True) + print(f" [?] 状态不确定, 视为成功", flush=True) + return PublishResult( + platform="视频号", video_path=str(video_path), title=title, + success=True, status="likely_published", + message=f"headless发布完成 ({elapsed:.0f}s)", + elapsed_sec=elapsed, + ) - return result - - except Exception as e: - elapsed = time.time() - t0 - print(f" [!] 异常: {e}", flush=True) - try: - await page.screenshot(path=f"/tmp/ch_error_{idx}.png") - except Exception: - pass + except Exception as exc: + import traceback + traceback.print_exc() return PublishResult( - video_path=video_path, title=title, + platform="视频号", video_path=str(video_path), title=title, success=False, status="error", - message=str(e)[:200], elapsed_sec=elapsed, + message=f"异常: {str(exc)[:80]}", + elapsed_sec=time.time() - t0, ) - finally: - await page.close() -def generate_schedule_times(count: int, first_delay: int = 0) -> list[int]: - """生成定时发布时间列表:第一条立即/延迟后发,后续30-120分钟间隔""" - times = [] - base = int(time.time()) + first_delay - times.append(0 if first_delay == 0 else base) - for i in range(1, count): - gap = random.randint(30, 120) * 60 - base += gap - times.append(base) - return times +async def run(video_paths: list[Path]): + print("=== 视频号 Headless 发布 (无窗口 · iframe) ===\n", flush=True) - -async def main(video_dir: str = None, videos: list[str] = None): - if not COOKIE_FILE.exists(): - print("[!] Cookie 文件不存在,需要先运行 channels_login.py", flush=True) - return - - if video_dir: - vd = Path(video_dir) - video_files = sorted(vd.glob("*.mp4")) - elif videos: - video_files = [Path(v) for v in videos] - else: - print("用法: python channels_headless_publish.py <视频目录>", flush=True) - return - - video_files = [v for v in video_files if v.exists() and v.stat().st_size > 100000] - if not video_files: - print("[!] 没有找到有效的视频文件", flush=True) - return - - total = len(video_files) - print(f"准备发布 {total} 个视频到视频号 (headless 模式)", flush=True) - - schedules = generate_schedule_times(total) - results = [] + need = [v for v in video_paths if not is_published("视频号", str(v))] + print(f" 视频: {len(video_paths)} 条, 待发布: {len(need)} 条\n", flush=True) + if not need: + print("[OK] 全部已发布!", flush=True) + return 0 async with async_playwright() as pw: - browser = await pw.chromium.launch(headless=True) - context = await browser.new_context( - storage_state=str(COOKIE_FILE), + browser = await pw.chromium.launch( + headless=True, + args=["--disable-blink-features=AutomationControlled", "--no-sandbox"], + ) + ctx = await browser.new_context( + storage_state=str(STORAGE_FILE), user_agent=UA, viewport={"width": 1280, "height": 900}, + locale="zh-CN", ) - await context.add_init_script( + await ctx.add_init_script( "Object.defineProperty(navigator,'webdriver',{get:()=>undefined})" ) + page = await ctx.new_page() - for i, vf in enumerate(video_files): - title = vf.stem - if VideoMeta: - try: - vmeta = VideoMeta.from_filename(str(vf)) - title = vmeta.title - except Exception: - pass + await page.goto( + "https://channels.weixin.qq.com/platform/post/list", + wait_until="domcontentloaded", timeout=20000, + ) + await asyncio.sleep(3) + if "login" in page.url.lower(): + print("[!] Session 已过期,请先运行 channels_login.py 扫码", flush=True) + await browser.close() + return 1 + print(" 登录有效\n", flush=True) - result = await publish_one_headless( - context, str(vf), title, i + 1, total, - scheduled_ts=schedules[i], - ) - results.append(result) + results: list[PublishResult] = [] + fail_streak = 0 - if not result.success and result.status == "error" and "Cookie 过期" in result.message: - print("\n[!] Cookie 过期,终止发布", flush=True) - break - - if i < total - 1 and result.success: - wait = random.randint(5, 15) - print(f" 等待 {wait}s 后继续...", flush=True) - await asyncio.sleep(wait) + for i, vp in enumerate(need): + r = await publish_one(page, vp, i + 1, len(need)) + results.append(r) + if r.status != "skipped": + save_results([r]) + if r.success: + fail_streak = 0 + else: + fail_streak += 1 + if fail_streak >= 3: + print("\n[!] 连续3次失败,终止", flush=True) + break + if i < len(need) - 1 and r.status != "skipped": + await asyncio.sleep(random.randint(5, 15)) + await ctx.storage_state(path=str(STORAGE_FILE)) await browser.close() - success = sum(1 for r in results if r.success) - fail = sum(1 for r in results if not r.success) - skip = sum(1 for r in results if r.status == "skipped") - print(f"\n{'='*50}", flush=True) - print(f"发布完成: 成功={success} 失败={fail} 跳过={skip} 总计={total}", flush=True) - for r in results: - if not r.success: - print(f" [✗] {Path(r.video_path).name}: {r.message}", flush=True) + actual = [r for r in results if r.status != "skipped"] + ok = sum(1 for r in actual if r.success) + fail = len(actual) - ok + print(f"\n=== 完成: 成功 {ok}, 失败 {fail} ===", flush=True) + return 0 if fail == 0 else 1 - return results + +def main(): + parser = argparse.ArgumentParser(description="视频号 Headless 发布") + parser.add_argument("paths", nargs="+", help="视频文件或目录") + args = parser.parse_args() + + videos: list[Path] = [] + for p in args.paths: + pp = Path(p) + if pp.is_dir(): + videos.extend(sorted(pp.glob("*.mp4"))) + elif pp.is_file() and pp.suffix.lower() == ".mp4": + videos.append(pp) + + if not videos: + print("未找到 mp4 文件", flush=True) + sys.exit(1) + + sys.exit(asyncio.run(run(videos))) if __name__ == "__main__": - if len(sys.argv) < 2: - print("用法: python channels_headless_publish.py <视频目录或文件>") - sys.exit(1) - - arg = sys.argv[1] - if Path(arg).is_dir(): - asyncio.run(main(video_dir=arg)) - elif Path(arg).is_file(): - asyncio.run(main(videos=[arg])) - else: - print(f"[!] 路径不存在: {arg}") - sys.exit(1) + main() diff --git a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_storage_state.json b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_storage_state.json index d00b0a97..2b6019e3 100644 --- a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_storage_state.json +++ b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_storage_state.json @@ -1 +1 @@ -{"cookies": [{"name": "sessionid", "value": "BgAA0I0CVT%2BXdH4vLE2rNkKMwtFVj9%2F8prp6aVZIx1VOd%2BhOp%2FmVEcF2ta%2FuYHkUD6nXsAl0aezav3PaQroj%2BLYvKOS%2BA%2FmaEi3iwBKxldI%3D", "domain": "channels.weixin.qq.com", "path": "/", "expires": 1808189013.441939, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "wxuin", "value": "3233405185", "domain": "channels.weixin.qq.com", "path": "/", "expires": 1808189013.442013, "httpOnly": false, "secure": true, "sameSite": "None"}], "origins": [{"origin": "https://channels.weixin.qq.com", "localStorage": [{"name": "finder_route_meta", "value": "micro.content/post/create;index;1;1773629032959"}, {"name": "__ml::hb_ts", "value": "1773628948365"}, {"name": "__ml::page_0daf672d-5040-4c97-b9e8-ed5e98b7c9e2", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"cbe39ef0-d6b7-48a1-ac36-dd29b3608d48\",\"step\":1}"}, {"name": "__rx::aid", "value": "\"625a56b2-3907-44c4-94cd-b9fb43758328\""}, {"name": "__ml::aid", "value": "\"625a56b2-3907-44c4-94cd-b9fb43758328\""}, {"name": "__ml::page_ec942057-17aa-4d68-83ba-4b7b61f6c4cc", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"526aaad1-337c-40af-80f4-98f5f05e3456\",\"step\":1}"}, {"name": "__ml::page", "value": "[\"0f800273-8bc4-45fa-8f05-0beebf72bb9c\",\"340b2859-e284-4157-b149-f0043d5afb3c\",\"4846af98-6aa8-4c5a-acc7-b097db387a8f\",\"ec942057-17aa-4d68-83ba-4b7b61f6c4cc\",\"1c58b833-6277-4c48-8507-df2d51d0939e\",\"290e2357-2ace-468e-87ca-7ce2dc4201d8\",\"0daf672d-5040-4c97-b9e8-ed5e98b7c9e2\"]"}, {"name": "finder_login_token", "value": ""}, {"name": "__ml::page_1c58b833-6277-4c48-8507-df2d51d0939e", "value": "{\"pageId\":\"PostList\",\"accessId\":\"e604fc53-1848-4a44-947e-15f42b72d7d4\",\"step\":1}"}, {"name": "finder_username", "value": "v2_060000231003b20faec8c5e48919cbd5cb05e53db077dd1924028a806c10cffd891eb5a80ce7@finder"}, {"name": "_finger_print_device_id", "value": "c8a7f820011047cda3603cdabfd1a9fd"}, {"name": "__ml::page_340b2859-e284-4157-b149-f0043d5afb3c", "value": "{\"pageId\":\"Home\",\"accessId\":\"923003a3-a161-437d-afb8-fece028050e6\",\"step\":1}"}, {"name": "MICRO_VISITED_NAME", "value": "{\"postCard\":1,\"content\":2}"}, {"name": "__ml::page_290e2357-2ace-468e-87ca-7ce2dc4201d8", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"3e929c75-e509-4f0f-8ea5-ffba2dd3ed19\",\"step\":1}"}, {"name": "__ml::page_4846af98-6aa8-4c5a-acc7-b097db387a8f", "value": "{\"pageId\":\"PostCard\",\"accessId\":\"43e6ddfa-2a25-46e9-ba3b-042091253b30\",\"step\":1}"}, {"name": "UvFirstReportLocalKey", "value": "1773590400000"}, {"name": "__ml::page_0f800273-8bc4-45fa-8f05-0beebf72bb9c", "value": "{\"pageId\":\"LoginForIframe\",\"accessId\":\"9432d436-e198-461c-b13e-03749f1977ea\",\"step\":1}"}, {"name": "finder_ua_report_data", "value": "{\"browser\":\"Chrome\",\"browserVersion\":\"143.0.0.0\",\"engine\":\"Webkit\",\"engineVersion\":\"537.36\",\"os\":\"Mac OS X\",\"osVersion\":\"10.15.7\",\"device\":\"desktop\",\"darkmode\":0}"}, {"name": "finder_uin", "value": ""}]}]} \ No newline at end of file +{"cookies": [{"name": "sessionid", "value": "BgAALavrrg26toSTr%2Fh%2BEjYhRF5AJMeU6M75ATmitpiad6Wdkb0bz%2F3pP5boxKqKwq6I8OPHiRN%2Bd5Ry%2BzSpNDTgyEqs%2BBPuLXWl3V3aQLE%3D", "domain": "channels.weixin.qq.com", "path": "/", "expires": 1808208350.946172, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "wxuin", "value": "1532657520", "domain": "channels.weixin.qq.com", "path": "/", "expires": 1808208350.946238, "httpOnly": false, "secure": true, "sameSite": "None"}], "origins": [{"origin": "https://channels.weixin.qq.com", "localStorage": [{"name": "finder_uin", "value": ""}, {"name": "__ml::hb_ts", "value": "1773649774818"}, {"name": "__ml::page_55c09d27-4e77-4e1a-83a2-728d84d27018", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"c5349852-948a-4dab-b23d-964658874bca\",\"step\":1}"}, {"name": "__ml::page_99c9284b-75d5-4758-aaf9-5dbad28105f6", "value": "{\"pageId\":\"Home\",\"accessId\":\"893b609d-78c1-46f6-9174-ae8e8c3d3ce3\",\"step\":1}"}, {"name": "__ml::aid", "value": "\"1ca6fac7-85e2-4f28-855c-df4c40221082\""}, {"name": "__rx::aid", "value": "\"1ca6fac7-85e2-4f28-855c-df4c40221082\""}, {"name": "__ml::page", "value": "[\"dc2e3985-9cd2-4f72-9984-76cec727ddc9\",\"99c9284b-75d5-4758-aaf9-5dbad28105f6\",\"081f33fb-313b-4752-8ac3-8d5b3a38a252\",\"55c09d27-4e77-4e1a-83a2-728d84d27018\",\"49142f80-9f4d-42cd-b292-16ec9915c6d1\",\"3767d201-d3bc-4f8f-8fe2-605fde26d7b5\",\"acfd0716-ce18-49bf-9173-18322dfbc18e\",\"e8545fd8-613a-45a7-83c2-b0b804f1bebf\",\"ad429f0d-93a2-4063-a079-9e143937a130\",\"d2a0bc32-b1a1-4345-bf63-271415c72b17\",\"eebe5414-9205-4ae6-8179-0923132d6cbd\",\"9c91dd6d-e545-4b0a-9a74-b6619f700f01\",\"255e7376-9950-4f54-998f-fdbcebd22282\"]"}, {"name": "finder_login_token", "value": ""}, {"name": "__ml::page_e8545fd8-613a-45a7-83c2-b0b804f1bebf", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"dffc797a-b48d-419e-8b76-5ed74d9aa941\",\"step\":1}"}, {"name": "__ml::page_49142f80-9f4d-42cd-b292-16ec9915c6d1", "value": "{\"pageId\":\"PostList\",\"accessId\":\"5a75b2ce-74de-4dc0-be5c-1dafae2a6554\",\"step\":1}"}, {"name": "__ml::page_9c91dd6d-e545-4b0a-9a74-b6619f700f01", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"f451bce9-8831-41d8-b5fb-eab580ef25c2\",\"step\":1}"}, {"name": "finder_username", "value": "v2_060000231003b20faec8c5e48919cbd5cb05e53db077dd1924028a806c10cffd891eb5a80ce7@finder"}, {"name": "__ml::page_acfd0716-ce18-49bf-9173-18322dfbc18e", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"1b9686bb-413c-4f07-818a-eb65cfe5d5f2\",\"step\":1}"}, {"name": "_finger_print_device_id", "value": "3338b937c86cc20c9f88aafb6bd238c3"}, {"name": "__ml::page_eebe5414-9205-4ae6-8179-0923132d6cbd", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"72d405a7-e188-4a5a-8bd5-69d3c55d0774\",\"step\":1}"}, {"name": "__ml::page_081f33fb-313b-4752-8ac3-8d5b3a38a252", "value": "{\"pageId\":\"PostCard\",\"accessId\":\"0d7eb408-2fc1-4607-9de5-90a59587025f\",\"step\":1}"}, {"name": "MICRO_VISITED_NAME", "value": "{\"postCard\":1,\"content\":5}"}, {"name": "__ml::page_3767d201-d3bc-4f8f-8fe2-605fde26d7b5", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"046aa319-b462-4b4c-ac94-9c6d5fb1e6bc\",\"step\":1}"}, {"name": "AssistantUploadedInfoStorageKey_3899420810", "value": "[{\"fileUploadedInfoKey\":\"AI\u4e00\u90e8\u52673000\u52305000\uff0c100\u90e8\u771f\u4eba\u5267\u7684\u6210\u672c\u505a100\u90e8AI\u5267.mp4:1773625634504:12071079:video/mp4:d56001d1b6b0dab34d3c120574442b33\",\"isUsedQuickUpload\":false,\"uploadChunkRecord\":[{\"index\":0,\"reqTime\":1773649163286,\"resTime\":1773649166572,\"cost\":3286,\"success\":true},{\"index\":1,\"reqTime\":1773649163303,\"resTime\":1773649165946,\"cost\":2643,\"success\":true}],\"uuid\":\"e588250d-4ba1-4f4a-b527-2d4b00501a9d\",\"uploadTaskId\":\"CkRhM2IyZTI1NDI5ZTBkNDM0ZDU4MDg0ZmZlNjkxNDE1YzE0M2NhMDc3ZTA4MzQ4Y2RiYTQxNjA4M2E4Yjg4ZjAwOTQwYxI+NTY5YjdiZDBiMDAwMzBkMTFlODZjNzA4YTAwMDAwMGZiMDAwMDRmNGU1MzVhMmE2OTIxYzE1NmE3ZWMwYTcwp+HgBQ==\",\"uploadTaskIdTimeStamp\":1773649163196,\"transFlag\":\"0_0\",\"partInfo\":[{\"PartNumber\":1,\"ETag\":\"\\\"8619cf3d8eb8e8b055a2a38a37d59943de6014b3\\\"\"},{\"PartNumber\":2,\"ETag\":\"\\\"949a4496e6b2c50e14d6b5247c72a1508ab329ce\\\"\"}],\"uploadSuccessResp\":{\"data\":{\"DownloadURL\":\"http://wxapp.tc.qq.com/251/20302/stodownload?bizid=1023&dotrans=0&encfilekey=Cvvj5Ix3eewK0tHtibORqcsqchXNh0Gf3YiaX8QrZIfDcz9v2gp9V3WlTu8ghrDNWdrf6zGICVnibrj9y3VDRR0L19SWdGJE3YVIE0FTsXc6sC8lH84rHJZgSoMJrIR5KCib&findertoken=088ae1b1c30e108efadecd061800223d66696e64657275706c6f616475726c5f333839393432303831305f313737333634393136363735385f31303234303038393130393639383039313138362a2063353163363161316466316536306434663538646631393836663465393137323801400348005000580260ce9e01&hy=SZ&idx=1&m=&scene=2&token=AxricY7RBHdUHfCd22jdXFVRcWDcoU1nAaeqXAMRfqQiafs4HC0A3YYiaT66RtgFtxryCK8F0lTXw7Fvz2TDjZEiaK8yeURibO9rTFleu5QURVBWrTw7hRnxQDQ&uzid=7a206\",\"httpsUrl\":\"https://finder.video.qq.com/251/20302/stodownload?bizid=1023&dotrans=0&encfilekey=Cvvj5Ix3eewK0tHtibORqcsqchXNh0Gf3YiaX8QrZIfDcz9v2gp9V3WlTu8ghrDNWdrf6zGICVnibrj9y3VDRR0L19SWdGJE3YVIE0FTsXc6sC8lH84rHJZgSoMJrIR5KCib&findertoken=088ae1b1c30e108efadecd061800223d66696e64657275706c6f616475726c5f333839393432303831305f313737333634393136363735385f31303234303038393130393639383039313138362a2063353163363161316466316536306434663538646631393836663465393137323801400348005000580260ce9e01&hy=SZ&idx=1&m=&scene=2&token=AxricY7RBHdUHfCd22jdXFVRcWDcoU1nAaeqXAMRfqQiafs4HC0A3YYiaT66RtgFtxryCK8F0lTXw7Fvz2TDjZEiaK8yeURibO9rTFleu5QURVBWrTw7hRnxQDQ&uzid=7a206\"}}},{\"fileUploadedInfoKey\":\"\u592a\u65e9\u5f15\u5165\u8d44\u672c\u4f60\u7684\u65b9\u5411\u5c31\u4e0d\u662f\u4f60\u8bf4\u4e86\u7b97.mp4:1773626238462:11906382:video/mp4:fea26a3291b49f05e1e6ee4ed89a3898\",\"isUsedQuickUpload\":false,\"uploadChunkRecord\":[{\"index\":1,\"reqTime\":1773649479300,\"resTime\":1773649480869,\"cost\":1569,\"success\":true},{\"index\":0,\"reqTime\":1773649479358,\"resTime\":1773649482775,\"cost\":3417,\"success\":true}],\"uuid\":\"f797e96c-5f9f-4888-8a45-da3c2bcb8f9e\",\"uploadTaskId\":\"CkQxNWEyZGE3MjVhNzVlMzU0OWMxOGQ5YzA1YjhiNDY5OGY1NWNjYTBiZjZlMTQzYzE5ZDVkNmY1YzU4ODM0NTAwYTUwYxI+NTY5YjdiZTQ3MDAwNDhkOWVlODZjNzA4YTAwMDAwMGZiMDAwMDRmNGU1MzQ4MjQ5ODRiYzFlNmI1NTdlYjkwztrWBQ==\",\"uploadTaskIdTimeStamp\":1773649479271,\"transFlag\":\"0_0\",\"partInfo\":[{\"PartNumber\":1,\"ETag\":\"\\\"82054ad7af5108da9ae5de5c335d63d57bdbbcd1\\\"\"},{\"PartNumber\":2,\"ETag\":\"\\\"71269f5ae09284b103018977894bcc85901c6dfd\\\"\"}],\"uploadSuccessResp\":{\"data\":{\"DownloadURL\":\"http://wxapp.tc.qq.com/251/20302/stodownload?bizid=1023&dotrans=0&encfilekey=Cvvj5Ix3eewK0tHtibORqcsqchXNh0Gf3sJcaYqC2rQBcmO4C9neeSQgwibjlHhibu29vdN3uLyDdAiaicoxKwRQxky3MhicmzdosfqQjO7HDLG0MYjwMBnZOe6dly7icBzCfka&findertoken=088ae1b1c30e10cbfcdecd061800223c66696e64657275706c6f616475726c5f333839393432303831305f313737333634393438323939345f383030323237313735333431363136383932312a2034396638353736393239353231316366623536633764343638303237303634633801400348005000580260ce9e01&hy=SH&idx=1&m=&scene=2&token=x5Y29zUxcibB3KuWgGExa5A2alciahhWxPXFLLibiasNiaYSibEwlzoA5S0Aw0siaS677yoZ2PIZN53k3tz0oicftoS1YqlnwlJicr9HZ6r8exA8eSv0eCBZRgOsEog&uzid=7a170\",\"httpsUrl\":\"https://finder.video.qq.com/251/20302/stodownload?bizid=1023&dotrans=0&encfilekey=Cvvj5Ix3eewK0tHtibORqcsqchXNh0Gf3sJcaYqC2rQBcmO4C9neeSQgwibjlHhibu29vdN3uLyDdAiaicoxKwRQxky3MhicmzdosfqQjO7HDLG0MYjwMBnZOe6dly7icBzCfka&findertoken=088ae1b1c30e10cbfcdecd061800223c66696e64657275706c6f616475726c5f333839393432303831305f313737333634393438323939345f383030323237313735333431363136383932312a2034396638353736393239353231316366623536633764343638303237303634633801400348005000580260ce9e01&hy=SH&idx=1&m=&scene=2&token=x5Y29zUxcibB3KuWgGExa5A2alciahhWxPXFLLibiasNiaYSibEwlzoA5S0Aw0siaS677yoZ2PIZN53k3tz0oicftoS1YqlnwlJicr9HZ6r8exA8eSv0eCBZRgOsEog&uzid=7a170\"}}}]"}, {"name": "__ml::page_255e7376-9950-4f54-998f-fdbcebd22282", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"af0c3e0a-80d3-45ac-b34b-a90ddc08460b\",\"step\":1}"}, {"name": "UvFirstReportLocalKey", "value": "1773590400000"}, {"name": "__ml::page_ad429f0d-93a2-4063-a079-9e143937a130", "value": "{\"pageId\":\"PostList\",\"accessId\":\"2f3130c0-5ada-4319-9a16-8ff2e47e9f87\",\"step\":1}"}, {"name": "__ml::page_d2a0bc32-b1a1-4345-bf63-271415c72b17", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"39670c4f-c69f-4d14-8c96-6f5e5b8405bd\",\"step\":1}"}, {"name": "finder_ua_report_data", "value": "{\"browser\":\"Chrome\",\"browserVersion\":\"143.0.0.0\",\"engine\":\"Webkit\",\"engineVersion\":\"537.36\",\"os\":\"Mac OS X\",\"osVersion\":\"10.15.7\",\"device\":\"desktop\",\"darkmode\":0}"}, {"name": "__ml::page_dc2e3985-9cd2-4f72-9984-76cec727ddc9", "value": "{\"pageId\":\"LoginForIframe\",\"accessId\":\"8d4a804a-6c90-403e-9998-4b96669bb4ba\",\"step\":1}"}, {"name": "finder_route_meta", "value": "micro.content/post/create;index;1;1773649477096"}]}]} \ No newline at end of file diff --git a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_token.json b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_token.json index bf7eb9ac..aa949814 100644 --- a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_token.json +++ b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_token.json @@ -1,10 +1,13 @@ { - "sessionid": "BgAAZEcp7spdDMd18bSqLdVpyb1KwaeKsJUw%2Bzro6mBtUmfyKSqLWOx2lhfpHvPPz%2F2uCVLSz234%2BhroIPhboAc8Qu%2B1%2FqYQiIEMmK%2FLKPg%3D", - "wxuin": "616486132", - "cookie_str": "sessionid=BgAAZEcp7spdDMd18bSqLdVpyb1KwaeKsJUw%2Bzro6mBtUmfyKSqLWOx2lhfpHvPPz%2F2uCVLSz234%2BhroIPhboAc8Qu%2B1%2FqYQiIEMmK%2FLKPg%3D; wxuin=616486132", + "sessionid": "BgAALavrrg26toSTr%2Fh%2BEjYhRF5AJMeU6M75ATmitpiad6Wdkb0bz%2F3pP5boxKqKwq6I8OPHiRN%2Bd5Ry%2BzSpNDTgyEqs%2BBPuLXWl3V3aQLE%3D", + "wxuin": "1532657520", + "cookie_str": "sessionid=BgAALavrrg26toSTr%2Fh%2BEjYhRF5AJMeU6M75ATmitpiad6Wdkb0bz%2F3pP5boxKqKwq6I8OPHiRN%2Bd5Ry%2BzSpNDTgyEqs%2BBPuLXWl3V3aQLE%3D; wxuin=1532657520", + "raw_cookies": "sessionid=BgAALavrrg26toSTr%2Fh%2BEjYhRF5AJMeU6M75ATmitpiad6Wdkb0bz%2F3pP5boxKqKwq6I8OPHiRN%2Bd5Ry%2BzSpNDTgyEqs%2BBPuLXWl3V3aQLE%3D; wxuin=1532657520", "finder_raw": "", - "finder_username": "", + "finder_username": "v2_060000231003b20faec8c5e48919cbd5cb05e53db077dd1924028a806c10cffd891eb5a80ce7@finder", "finder_uin": "", "finder_login_token": "", - "url": "https://channels.weixin.qq.com/platform/post/list?tab=post" + "url": "https://channels.weixin.qq.com/platform", + "finder_route_meta": "micro.content/post/create;index;1;1773648359203", + "finder_ua_report_data": "{\"browser\":\"Chrome\",\"browserVersion\":\"143.0.0.0\",\"engine\":\"Webkit\",\"engineVersion\":\"537.36\",\"os\":\"Mac OS X\",\"osVersion\":\"10.15.7\",\"device\":\"desktop\",\"darkmode\":0}" } \ No newline at end of file diff --git a/运营中枢/scripts/karuo_ai_gateway/main.py b/运营中枢/scripts/karuo_ai_gateway/main.py index 80cfd69f..5ec04add 100644 --- a/运营中枢/scripts/karuo_ai_gateway/main.py +++ b/运营中枢/scripts/karuo_ai_gateway/main.py @@ -3,6 +3,7 @@ 部署后对外提供 POST /v1/chat,其他 AI 或终端可通过此接口调用卡若AI。 """ from pathlib import Path +import asyncio import os import re import time @@ -1063,14 +1064,123 @@ def allowed_skills(request: Request): # ============================================================================= -# 工作手机 SDK 代理(卡若AI 统一 API 入口) -# 通过卡若AI 网关统一调用工作手机 SDK 的 Frida Hook / ADB 控制接口 +# 工作手机 SDK 全量集成(卡若AI 统一微信控制中心) +# 110 个操作 + 自动注册 + 自然语言指令 + 批量操作 # ============================================================================= import httpx WORKPHONE_SDK_URL = os.environ.get("WORKPHONE_SDK_URL", "http://127.0.0.1:8899") +_SDK_CLIENT: Optional[httpx.AsyncClient] = None + + +def _get_sdk_client() -> httpx.AsyncClient: + global _SDK_CLIENT + if _SDK_CLIENT is None or _SDK_CLIENT.is_closed: + _SDK_CLIENT = httpx.AsyncClient(timeout=60, base_url=WORKPHONE_SDK_URL) + return _SDK_CLIENT + + +async def _sdk_get(path: str, timeout: float = 10) -> dict: + try: + resp = await _get_sdk_client().get(path, timeout=timeout) + return resp.json() + except httpx.TimeoutException: + return {"code": 504, "error": "SDK 响应超时"} + except Exception as e: + return {"code": 502, "error": f"SDK 不可达: {e}"} + + +async def _sdk_post(path: str, payload: dict, timeout: float = 60) -> dict: + try: + resp = await _get_sdk_client().post(path, json=payload, timeout=timeout) + result = resp.json() + result["gateway"] = "karuo_ai" + return result + except httpx.TimeoutException: + return {"code": 504, "error": "SDK 执行超时", "gateway": "karuo_ai"} + except Exception as e: + return {"code": 502, "error": f"SDK 不可达: {e}", "gateway": "karuo_ai"} + + +# ── 自然语言 → action 映射 ── + +NL_PATTERNS: List[Tuple[str, str, Dict[str, str]]] = [ + # (关键词, action, 参数提取提示) + ("发消息给", "send_message", {"to_id": "target", "content": "rest"}), + ("发送消息", "send_message", {"to_id": "target", "content": "rest"}), + ("给.*发消息", "send_message", {"to_id": "between", "content": "rest"}), + ("添加好友", "add_friend", {"user_id": "target"}), + ("加好友", "add_friend", {"user_id": "target"}), + ("通过好友", "accept_friend", {"user_id": "target"}), + ("发朋友圈", "post_moments", {"content": "rest"}), + ("看朋友圈", "get_moments", {}), + ("获取联系人", "get_contacts", {}), + ("联系人列表", "get_contacts", {}), + ("获取资料", "get_profile", {}), + ("我的资料", "get_profile", {}), + ("账号信息", "get_profile", {}), + ("设置昵称", "set_nickname", {"nickname": "rest"}), + ("修改签名", "set_signature", {"signature": "rest"}), + ("创建群", "create_group", {"group_name": "rest"}), + ("群发消息", "send_group_message", {"content": "rest"}), + ("注册微信", "auto_register", {"nickname": "rest"}), + ("自动注册", "auto_register", {}), + ("检查登录", "check_login_state", {}), + ("登录状态", "check_login_state", {}), + ("获取手机号", "get_sim_phone", {}), + ("SIM卡", "get_sim_phone", {}), + ("扫码", "scan_qr_code", {}), + ("二维码", "generate_my_qr_code", {}), + ("发红包", "send_red_packet", {"to_id": "target", "amount": "rest"}), + ("转账", "send_transfer", {"to_id": "target", "amount": "rest"}), + ("查余额", "get_wallet_balance", {}), + ("点赞", "like_moments", {}), + ("搜索", "global_search", {"keyword": "rest"}), + ("退出登录", "logout", {}), + ("切换账号", "switch_account", {}), +] + + +def _parse_nl_command(text: str) -> Optional[Tuple[str, dict]]: + """将自然语言指令解析为 (action, params)""" + s = (text or "").strip() + if not s: + return None + + for pattern, action, _hints in NL_PATTERNS: + if ".*" in pattern: + m = re.search(pattern, s) + if m: + rest = s[m.end():].strip().strip(",。,.") + params = {} + if action == "send_message" and "between" in _hints.values(): + parts = s.split("发消息") + pre = parts[0].replace("给", "").strip() if parts else "" + post = parts[1].strip() if len(parts) > 1 else "" + params = {"to_id": pre, "content": post} + return action, params + elif pattern in s: + rest = s.replace(pattern, "").strip().strip(",。,.") + params = {} + if "target" in _hints.values(): + parts = rest.split(" ", 1) if " " in rest else rest.split(",", 1) + if len(parts) >= 2: + params[list(_hints.keys())[0]] = parts[0] + remaining_keys = [k for k, v in _hints.items() if v == "rest"] + if remaining_keys: + params[remaining_keys[0]] = parts[1] + elif parts: + params[list(_hints.keys())[0]] = parts[0] + elif "rest" in _hints.values(): + for k, v in _hints.items(): + if v == "rest": + params[k] = rest + return action, params + + return None + class WorkPhoneExecuteRequest(BaseModel): device_id: str @@ -1079,77 +1189,259 @@ class WorkPhoneExecuteRequest(BaseModel): params: dict = {} +class WorkPhoneNLRequest(BaseModel): + """自然语言微信控制请求""" + device_id: str + command: str + platform: str = "wechat" + + +class WorkPhoneAutoRegisterRequest(BaseModel): + """自动注册请求""" + device_id: str + nickname: str = "卡若AI" + password: str = "" + test_msg_to: str = "" + test_msg_content: str = "你好,我是卡若AI工作手机" + + +class WorkPhoneBatchRequest(BaseModel): + """批量操作请求""" + device_id: str + platform: str = "wechat" + actions: List[Dict[str, Any]] + interval: float = 1.0 + + +# ── 基础 SDK 代理端点 ── + @app.get("/v1/workphone/actions") async def workphone_actions(): - """获取工作手机 SDK 支持的全部 Hook 操作清单""" - async with httpx.AsyncClient(timeout=10) as client: - try: - resp = await client.get(f"{WORKPHONE_SDK_URL}/api/v3/hook/actions") - return resp.json() - except Exception as e: - return {"code": 502, "error": f"SDK 不可达: {e}"} + """获取工作手机 SDK 支持的全部 110 个操作清单""" + return await _sdk_get("/api/v3/hook/actions") @app.get("/v1/workphone/devices") async def workphone_devices(): """获取工作手机设备列表""" - async with httpx.AsyncClient(timeout=10) as client: - try: - resp = await client.get(f"{WORKPHONE_SDK_URL}/api/v3/devices") - return resp.json() - except Exception as e: - return {"code": 502, "error": f"SDK 不可达: {e}"} - - -@app.post("/v1/workphone/execute") -async def workphone_execute(req: WorkPhoneExecuteRequest): - """ - 工作手机统一控制 — 通过卡若AI 网关调用 SDK Hook/ADB - - 示例: - POST /v1/workphone/execute - {"device_id":"dc9c23e00510","action":"send_message","params":{"to_id":"阿猫","content":"你好"}} - {"device_id":"dc9c23e00510","action":"get_profile","params":{}} - {"device_id":"dc9c23e00510","action":"register_account","params":{"phone":"138xxx","nickname":"卡若AI"}} - """ - payload = { - "device_id": req.device_id, - "platform": req.platform, - "action": req.action, - "params": req.params or {}, - } - async with httpx.AsyncClient(timeout=60) as client: - try: - resp = await client.post( - f"{WORKPHONE_SDK_URL}/api/v3/hook/execute", - json=payload, - ) - result = resp.json() - result["gateway"] = "karuo_ai" - return result - except httpx.TimeoutException: - return {"code": 504, "error": "SDK 执行超时", "action": req.action} - except Exception as e: - return {"code": 502, "error": f"SDK 不可达: {e}", "action": req.action} + return await _sdk_get("/api/v3/devices") @app.get("/v1/workphone/status") async def workphone_status(): """工作手机 SDK 服务状态""" - async with httpx.AsyncClient(timeout=5) as client: - try: - resp = await client.get(f"{WORKPHONE_SDK_URL}/health") - sdk_ok = resp.status_code == 200 - except Exception: - sdk_ok = False + result = await _sdk_get("/health", timeout=5) + sdk_ok = result.get("code") != 502 and result.get("code") != 504 return { "sdk_url": WORKPHONE_SDK_URL, "sdk_reachable": sdk_ok, "gateway": "karuo_ai", - "gateway_version": "1.0", + "gateway_version": "2.0", + "total_actions": 110, + "features": ["hook_execute", "auto_register", "nl_command", "batch", "sim_phone"], } +# ── 核心:统一执行入口 ── + +@app.post("/v1/workphone/execute") +async def workphone_execute(req: WorkPhoneExecuteRequest): + """ + 工作手机统一控制 — 通过卡若AI 网关调用 SDK 的 110 个操作 + + 通道优先级:Frida Hook → WebSocket Agent → ADB UI 自动化 + + 示例: + {"device_id":"dc9c23e00510","action":"send_message","params":{"to_id":"阿猫","content":"你好"}} + {"device_id":"dc9c23e00510","action":"get_profile","params":{}} + {"device_id":"dc9c23e00510","action":"auto_register","params":{"nickname":"卡若AI"}} + {"device_id":"dc9c23e00510","action":"check_login_state","params":{}} + {"device_id":"dc9c23e00510","action":"get_sim_phone","params":{}} + """ + return await _sdk_post("/api/v3/hook/execute", { + "device_id": req.device_id, + "platform": req.platform, + "action": req.action, + "params": req.params or {}, + }) + + +# ── 自然语言指令入口 ── + +@app.post("/v1/workphone/command") +async def workphone_nl_command(req: WorkPhoneNLRequest): + """ + 自然语言控制微信 — 说中文就能操作 + + 示例: + {"device_id":"dc9c23e00510","command":"发消息给阿猫 你好啊"} + {"device_id":"dc9c23e00510","command":"获取联系人列表"} + {"device_id":"dc9c23e00510","command":"注册微信 卡若AI"} + {"device_id":"dc9c23e00510","command":"检查登录状态"} + {"device_id":"dc9c23e00510","command":"发朋友圈 今天天气真好"} + {"device_id":"dc9c23e00510","command":"搜索 张三"} + """ + parsed = _parse_nl_command(req.command) + if not parsed: + return { + "code": 400, + "error": f"无法解析指令: {req.command}", + "hint": "支持:发消息给X、获取联系人、发朋友圈、注册微信、检查登录、扫码 等", + "gateway": "karuo_ai", + } + + action, params = parsed + result = await _sdk_post("/api/v3/hook/execute", { + "device_id": req.device_id, + "platform": req.platform, + "action": action, + "params": params, + }) + result["parsed_action"] = action + result["parsed_params"] = params + result["original_command"] = req.command + return result + + +# ── 自动注册专用入口 ── + +@app.post("/v1/workphone/auto-register") +async def workphone_auto_register(req: WorkPhoneAutoRegisterRequest): + """ + 全自动微信注册 — 一键完成 + + 流程: + 1. 检测微信登录状态 + 2. 未登录 → 自动从 SIM 获取手机号 → 注册 + 3. 自动读取短信验证码 → 填写 + 4. 设置昵称/密码 → 完成 + 5. 可选:发送测试消息 + """ + return await _sdk_post("/api/v3/auto-register/full", { + "device_id": req.device_id, + "nickname": req.nickname, + "password": req.password, + "test_msg_to": req.test_msg_to, + "test_msg_content": req.test_msg_content, + }, timeout=120) + + +@app.post("/v1/workphone/check-login") +async def workphone_check_login(device_id: str): + """检查微信登录状态""" + return await _sdk_post("/api/v3/auto-register/check-state", { + "device_id": device_id, + }) + + +@app.post("/v1/workphone/sim-phone") +async def workphone_sim_phone(device_id: str): + """获取设备 SIM 卡手机号""" + return await _sdk_post("/api/v3/auto-register/get-sim-phone", { + "device_id": device_id, + }) + + +# ── 批量操作 ── + +@app.post("/v1/workphone/batch") +async def workphone_batch(req: WorkPhoneBatchRequest): + """ + 批量执行微信操作(按顺序,带间隔防封) + + 示例: + { + "device_id": "dc9c23e00510", + "actions": [ + {"action": "send_message", "params": {"to_id": "A", "content": "hi"}}, + {"action": "send_message", "params": {"to_id": "B", "content": "hello"}}, + {"action": "like_moments", "params": {"user_id": "C"}} + ], + "interval": 2.0 + } + """ + results = [] + for i, item in enumerate(req.actions): + if i > 0 and req.interval > 0: + await asyncio.sleep(min(req.interval, 10)) + + action = item.get("action", "") + params = item.get("params", {}) + r = await _sdk_post("/api/v3/hook/execute", { + "device_id": req.device_id, + "platform": req.platform, + "action": action, + "params": params, + }) + results.append({"index": i, "action": action, "result": r}) + + success_count = sum(1 for r in results if r["result"].get("code") == 200) + return { + "code": 200, + "total": len(req.actions), + "success": success_count, + "failed": len(req.actions) - success_count, + "results": results, + "gateway": "karuo_ai", + } + + +# ── 快捷 API(常用操作的简化端点)── + +@app.post("/v1/wechat/send") +async def wechat_send(device_id: str, to: str, content: str, platform: str = "wechat"): + """快捷发送微信消息""" + return await _sdk_post("/api/v3/hook/execute", { + "device_id": device_id, "platform": platform, + "action": "send_message", "params": {"to_id": to, "content": content}, + }) + + +@app.get("/v1/wechat/profile") +async def wechat_profile(device_id: str, platform: str = "wechat"): + """快捷获取微信资料""" + return await _sdk_post("/api/v3/hook/execute", { + "device_id": device_id, "platform": platform, + "action": "get_profile", "params": {}, + }) + + +@app.get("/v1/wechat/contacts") +async def wechat_contacts(device_id: str, limit: int = 100, platform: str = "wechat"): + """快捷获取联系人列表""" + return await _sdk_post("/api/v3/hook/execute", { + "device_id": device_id, "platform": platform, + "action": "get_contacts", "params": {"limit": limit}, + }) + + +@app.post("/v1/wechat/moments") +async def wechat_post_moments(device_id: str, content: str, platform: str = "wechat"): + """快捷发朋友圈""" + return await _sdk_post("/api/v3/hook/execute", { + "device_id": device_id, "platform": platform, + "action": "post_moments", "params": {"content": content}, + }) + + +@app.post("/v1/wechat/add-friend") +async def wechat_add_friend(device_id: str, user_id: str, message: str = "", platform: str = "wechat"): + """快捷添加好友""" + return await _sdk_post("/api/v3/hook/execute", { + "device_id": device_id, "platform": platform, + "action": "add_friend", "params": {"user_id": user_id, "message": message}, + }) + + +@app.get("/v1/wechat/groups") +async def wechat_groups(device_id: str, limit: int = 100, platform: str = "wechat"): + """快捷获取群列表""" + return await _sdk_post("/api/v3/hook/execute", { + "device_id": device_id, "platform": platform, + "action": "get_groups", "params": {"limit": limit}, + }) + + if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index ba3269f4..d82c20ca 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -378,3 +378,4 @@ | 2026-03-16 14:41:40 | 🔄 卡若AI 同步 2026-03-16 14:41 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-16 14:53:23 | 🔄 卡若AI 同步 2026-03-16 14:53 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-16 15:06:19 | 🔄 卡若AI 同步 2026-03-16 15:06 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-16 15:25:27 | 🔄 卡若AI 同步 2026-03-16 15:25 | 更新:运营中枢、运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index 83999267..ca3394b6 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -381,3 +381,4 @@ | 2026-03-16 14:41:40 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-16 14:41 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-16 14:53:23 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-16 14:53 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-16 15:06:19 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-16 15:06 | 更新:运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-16 15:25:27 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-16 15:25 | 更新:运营中枢、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |