From 7e318684a4902fc3bcb63dc11140dfcd647462d9 Mon Sep 17 00:00:00 2001 From: karuo Date: Tue, 10 Mar 2026 15:16:50 +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-10=2015:16=20|=20=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=EF=BC=9A=E6=B0=B4=E6=BA=AA=E6=95=B4=E7=90=86=E5=BD=92=E6=A1=A3?= =?UTF-8?q?=E3=80=81=E5=8D=A1=E6=9C=A8=E3=80=81=E8=BF=90=E8=90=A5=E4=B8=AD?= =?UTF-8?q?=E6=9E=A2=E5=B7=A5=E4=BD=9C=E5=8F=B0=20|=20=E6=8E=92=E9=99=A4?= =?UTF-8?q?=20>20MB:=2011=20=E4=B8=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../记忆系统/structured/last_chat_collect_date.txt | 2 +- .../记忆系统/structured/memory_health.json | 4 +- .../木叶_视频内容/B站发布/脚本/bilibili_publish.py | 18 +- .../多平台分发/脚本/distribute_all.py | 58 ++++-- .../多平台分发/脚本/schedule_generator.py | 71 +++++++ .../多平台分发/脚本/schedule_helper.py | 197 ++++++++++++++++++ .../小红书发布/脚本/xiaohongshu_publish.py | 12 +- .../小红书发布/脚本/xiaohongshu_storage_state.json | 2 +- .../快手发布/脚本/kuaishou_publish.py | 12 +- .../快手发布/脚本/kuaishou_storage_state.json | 2 +- .../木叶_视频内容/抖音发布/脚本/douyin_pure_api.py | 97 +++++---- .../视频号发布/脚本/channels_publish.py | 12 +- .../视频号发布/脚本/channels_storage_state.json | 2 +- 运营中枢/工作台/gitea_push_log.md | 1 + 运营中枢/工作台/代码管理.md | 1 + 15 files changed, 420 insertions(+), 71 deletions(-) create mode 100644 03_卡木(木)/木叶_视频内容/多平台分发/脚本/schedule_generator.py create mode 100644 03_卡木(木)/木叶_视频内容/多平台分发/脚本/schedule_helper.py diff --git a/02_卡人(水)/水溪_整理归档/记忆系统/structured/last_chat_collect_date.txt b/02_卡人(水)/水溪_整理归档/记忆系统/structured/last_chat_collect_date.txt index 12c225b9..ae37545c 100644 --- a/02_卡人(水)/水溪_整理归档/记忆系统/structured/last_chat_collect_date.txt +++ b/02_卡人(水)/水溪_整理归档/记忆系统/structured/last_chat_collect_date.txt @@ -1 +1 @@ -2026-03-01 \ No newline at end of file +2026-03-10 \ No newline at end of file diff --git a/02_卡人(水)/水溪_整理归档/记忆系统/structured/memory_health.json b/02_卡人(水)/水溪_整理归档/记忆系统/structured/memory_health.json index 7f0fdde6..4889cf61 100644 --- a/02_卡人(水)/水溪_整理归档/记忆系统/structured/memory_health.json +++ b/02_卡人(水)/水溪_整理归档/记忆系统/structured/memory_health.json @@ -1,6 +1,6 @@ { - "updated": "2026-03-01 08:00:22", - "date": "2026-03-01", + "updated": "2026-03-10 15:13:06", + "date": "2026-03-10", "scan_total": 0, "copied_new": 0, "skipped_idempotent": 0, diff --git a/03_卡木(木)/木叶_视频内容/B站发布/脚本/bilibili_publish.py b/03_卡木(木)/木叶_视频内容/B站发布/脚本/bilibili_publish.py index ef14f10c..b457310e 100644 --- a/03_卡木(木)/木叶_视频内容/B站发布/脚本/bilibili_publish.py +++ b/03_卡木(木)/木叶_视频内容/B站发布/脚本/bilibili_publish.py @@ -71,8 +71,8 @@ def _load_credential(): ) -async def _api_publish(video_path: str, title: str) -> PublishResult: - """方案一:bilibili-api-python 纯 API""" +async def _api_publish(video_path: str, title: str, scheduled_time=None) -> PublishResult: + """方案一:bilibili-api-python 纯 API(支持定时发布)""" from bilibili_api import video_uploader from video_utils import extract_cover @@ -100,6 +100,11 @@ async def _api_publish(video_path: str, title: str) -> PublishResult: "up_close_reply": False, } + if scheduled_time: + dtime = int(scheduled_time.timestamp()) + meta["dtime"] = dtime + print(f" [API] 定时发布: {scheduled_time.strftime('%Y-%m-%d %H:%M')}", flush=True) + page = video_uploader.VideoUploaderPage( path=video_path, title=title[:80], @@ -264,11 +269,12 @@ async def _playwright_publish(video_path: str, title: str) -> PublishResult: ) -async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, skip_dedup: bool = False) -> PublishResult: - """API 优先 → Playwright 兜底""" +async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, skip_dedup: bool = False, scheduled_time=None) -> PublishResult: + """API 优先 → Playwright 兜底(支持定时发布)""" fname = Path(video_path).name fsize = Path(video_path).stat().st_size - print(f"\n[{idx}/{total}] {fname} ({fsize/1024/1024:.1f}MB)", flush=True) + time_hint = f" → 定时 {scheduled_time.strftime('%H:%M')}" if scheduled_time else "" + print(f"\n[{idx}/{total}] {fname} ({fsize/1024/1024:.1f}MB){time_hint}", flush=True) print(f" 标题: {title[:60]}", flush=True) if not skip_dedup and is_published("B站", video_path): @@ -285,7 +291,7 @@ async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, # 方案一:纯 API print(" [方案一] bilibili-api-python 纯 API...", flush=True) try: - result = await _api_publish(video_path, title) + result = await _api_publish(video_path, title, scheduled_time) print(f" {result.log_line()}", flush=True) return result except Exception as e: diff --git a/03_卡木(木)/木叶_视频内容/多平台分发/脚本/distribute_all.py b/03_卡木(木)/木叶_视频内容/多平台分发/脚本/distribute_all.py index 0734394e..b2b744a8 100644 --- a/03_卡木(木)/木叶_视频内容/多平台分发/脚本/distribute_all.py +++ b/03_卡木(木)/木叶_视频内容/多平台分发/脚本/distribute_all.py @@ -1,6 +1,7 @@ #!/usr/bin/env python3 """ -多平台一键分发 v2 — 全链路自动化 +多平台一键分发 v3 — 全链路自动化 + 定时排期 +- 定时排期:30-120 分钟随机间隔,超 24h 自动压缩 - 并行分发:5 平台同时上传(asyncio.gather) - 去重机制:已成功发布的视频自动跳过 - 失败重试:--retry 自动重跑历史失败任务 @@ -9,13 +10,15 @@ - 结果持久化:JSON Lines 日志 + 控制台汇总 用法: - python3 distribute_all.py # 并行分发到所有平台 + python3 distribute_all.py # 定时排期并行分发 + python3 distribute_all.py --now # 立即发布(不排期) python3 distribute_all.py --platforms B站 快手 # 只发指定平台 python3 distribute_all.py --check # 检查 Cookie python3 distribute_all.py --retry # 重试失败任务 python3 distribute_all.py --video /path/to.mp4 # 发单条视频 python3 distribute_all.py --no-dedup # 跳过去重检查 python3 distribute_all.py --serial # 串行模式(调试用) + python3 distribute_all.py --min-gap 30 --max-gap 120 # 自定义间隔 """ import argparse import asyncio @@ -34,6 +37,7 @@ from cookie_manager import CookieManager, check_all_cookies from publish_result import (PublishResult, print_summary, save_results, load_published_set, load_failed_tasks) from title_generator import generate_title +from schedule_generator import generate_schedule, format_schedule PLATFORM_CONFIG = { "抖音": { @@ -139,8 +143,9 @@ def load_platform_module(name: str, config: dict): async def distribute_to_platform( platform: str, config: dict, videos: list[Path], published_set: set, skip_dedup: bool = False, + schedule_times: list = None, ) -> list[PublishResult]: - """分发到单个平台(含去重)""" + """分发到单个平台(含去重 + 定时排期)""" print(f"\n{'#'*60}") print(f" [{platform}] 开始分发") print(f"{'#'*60}") @@ -190,11 +195,19 @@ async def distribute_to_platform( success=True, status="skipped", message="去重跳过(已发布)", )) + publish_schedule = None + if schedule_times and len(to_publish) > 0: + if len(schedule_times) >= len(to_publish): + publish_schedule = schedule_times[:len(to_publish)] + else: + publish_schedule = generate_schedule(len(to_publish)) + total = len(to_publish) for i, vp in enumerate(to_publish): title = generate_title(vp.name, titles_dict) + stime = publish_schedule[i] if publish_schedule else None try: - r = await module.publish_one(str(vp), title, i + 1, total) + r = await module.publish_one(str(vp), title, i + 1, total, scheduled_time=stime) if isinstance(r, PublishResult): results.append(r) else: @@ -215,12 +228,13 @@ async def distribute_to_platform( async def run_parallel(targets: list[str], videos: list[Path], - published_set: set, skip_dedup: bool) -> list[PublishResult]: - """多平台并行分发""" + published_set: set, skip_dedup: bool, + schedule_times: list = None) -> list[PublishResult]: + """多平台并行分发(共享排期)""" tasks = [] for platform in targets: config = PLATFORM_CONFIG[platform] - task = distribute_to_platform(platform, config, videos, published_set, skip_dedup) + task = distribute_to_platform(platform, config, videos, published_set, skip_dedup, schedule_times) tasks.append(task) platform_results = await asyncio.gather(*tasks, return_exceptions=True) @@ -239,12 +253,13 @@ async def run_parallel(targets: list[str], videos: list[Path], async def run_serial(targets: list[str], videos: list[Path], - published_set: set, skip_dedup: bool) -> list[PublishResult]: + published_set: set, skip_dedup: bool, + schedule_times: list = None) -> list[PublishResult]: """多平台串行分发(调试用)""" all_results = [] for platform in targets: config = PLATFORM_CONFIG[platform] - results = await distribute_to_platform(platform, config, videos, published_set, skip_dedup) + results = await distribute_to_platform(platform, config, videos, published_set, skip_dedup, schedule_times) all_results.extend(results) return all_results @@ -299,7 +314,7 @@ async def retry_failed() -> list[PublishResult]: async def main(): - parser = argparse.ArgumentParser(description="多平台一键视频分发 v2") + parser = argparse.ArgumentParser(description="多平台一键视频分发 v3(定时排期)") parser.add_argument("--platforms", nargs="+", help="指定平台") parser.add_argument("--check", action="store_true", help="只检查 Cookie") parser.add_argument("--retry", action="store_true", help="重试失败任务") @@ -307,6 +322,10 @@ async def main(): parser.add_argument("--video-dir", help="自定义视频目录") parser.add_argument("--no-dedup", action="store_true", help="跳过去重") parser.add_argument("--serial", action="store_true", help="串行模式") + parser.add_argument("--now", action="store_true", help="立即发布(不排期)") + parser.add_argument("--min-gap", type=int, default=30, help="最小间隔(分钟)") + parser.add_argument("--max-gap", type=int, default=120, help="最大间隔(分钟)") + parser.add_argument("--max-hours", type=float, default=24.0, help="最大排期跨度(小时)") args = parser.parse_args() available, alerts = check_cookies_with_alert() @@ -354,16 +373,31 @@ async def main(): if (p, v.name) not in published_set: total_new += 1 + # 生成排期 + schedule_times = None + if not args.now and total_new > 1: + schedule_times = generate_schedule( + len(videos), + min_gap=args.min_gap, + max_gap=args.max_gap, + max_hours=args.max_hours, + ) + print(f"\n{'='*60}") print(f" 分发计划 ({mode})") print(f"{'='*60}") print(f" 视频数: {len(videos)}") print(f" 目标平台: {', '.join(targets)}") print(f" 新任务: {total_new} 条") + print(f" 发布方式: {'立即发布' if args.now or not schedule_times else '定时排期'}") if not args.no_dedup: skipped = len(videos) * len(targets) - total_new if skipped > 0: print(f" 去重跳过: {skipped} 条") + + if schedule_times: + print(f"\n 排期表:") + print(format_schedule([v.name for v in videos], schedule_times)) print() if total_new == 0: @@ -372,9 +406,9 @@ async def main(): t0 = time.time() if args.serial: - all_results = await run_serial(targets, videos, published_set, args.no_dedup) + all_results = await run_serial(targets, videos, published_set, args.no_dedup, schedule_times) else: - all_results = await run_parallel(targets, videos, published_set, args.no_dedup) + all_results = await run_parallel(targets, videos, published_set, args.no_dedup, schedule_times) actual_results = [r for r in all_results if r.status != "skipped"] print_summary(actual_results) diff --git a/03_卡木(木)/木叶_视频内容/多平台分发/脚本/schedule_generator.py b/03_卡木(木)/木叶_视频内容/多平台分发/脚本/schedule_generator.py new file mode 100644 index 00000000..c5acfb27 --- /dev/null +++ b/03_卡木(木)/木叶_视频内容/多平台分发/脚本/schedule_generator.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +""" +定时排期生成器 — 为 N 条视频生成发布时间表 +规则: +1. 相邻视频间隔 30-120 分钟(随机) +2. 若总时长 > max_hours,按比例压缩至 max_hours 内 +3. 第一条视频在 first_delay 分钟后发布 +""" +import random +from datetime import datetime, timedelta + + +def generate_schedule( + n: int, + min_gap: int = 30, + max_gap: int = 120, + max_hours: float = 24.0, + first_delay: int = 5, + start_time: datetime = None, +) -> list[datetime]: + """ + 返回 n 个 datetime,每个对应一条视频的定时发布时间。 + """ + if n <= 0: + return [] + + base = start_time or datetime.now() + if n == 1: + return [base + timedelta(minutes=first_delay)] + + gaps = [random.randint(min_gap, max_gap) for _ in range(n - 1)] + total_min = first_delay + sum(gaps) + max_min = max_hours * 60 + + if total_min > max_min: + ratio = max_min / total_min + first_delay = int(first_delay * ratio) + gaps = [max(1, int(g * ratio)) for g in gaps] + + times = [] + cur = base + timedelta(minutes=first_delay) + times.append(cur) + for g in gaps: + cur = cur + timedelta(minutes=g) + times.append(cur) + + return times + + +def format_schedule(videos: list[str], times: list[datetime]) -> str: + """格式化排期表用于打印""" + lines = [" 序号 | 发布时间 | 间隔 | 视频"] + lines.append(" " + "-" * 70) + for i, (v, t) in enumerate(zip(videos, times)): + gap = "" + if i > 0: + delta = (t - times[i - 1]).total_seconds() / 60 + gap = f"{delta:.0f}min" + name = v[:40] if len(v) > 40 else v + lines.append(f" {i+1:>4} | {t.strftime('%Y-%m-%d %H:%M')} | {gap:>7} | {name}") + + total = (times[-1] - times[0]).total_seconds() / 3600 if len(times) > 1 else 0 + lines.append(" " + "-" * 70) + lines.append(f" 总跨度: {total:.1f}h | 首条: {times[0].strftime('%H:%M')} | 末条: {times[-1].strftime('%H:%M')}") + return "\n".join(lines) + + +if __name__ == "__main__": + schedule = generate_schedule(15) + names = [f"视频_{i+1}.mp4" for i in range(15)] + print(format_schedule(names, schedule)) diff --git a/03_卡木(木)/木叶_视频内容/多平台分发/脚本/schedule_helper.py b/03_卡木(木)/木叶_视频内容/多平台分发/脚本/schedule_helper.py new file mode 100644 index 00000000..13942338 --- /dev/null +++ b/03_卡木(木)/木叶_视频内容/多平台分发/脚本/schedule_helper.py @@ -0,0 +1,197 @@ +#!/usr/bin/env python3 +""" +Playwright 平台定时发布辅助 — 通用日期时间填写逻辑 +各平台调用 set_scheduled_time(page, dt, platform_hint) 即可 +""" +import asyncio +from datetime import datetime + + +async def set_scheduled_time(page, scheduled_time: datetime, platform: str = "") -> bool: + """ + 在 Playwright 页面上设置定时发布时间。 + 返回 True 表示成功设置,False 表示失败(降级为立即发布)。 + """ + if not scheduled_time: + return False + + date_str = scheduled_time.strftime("%Y-%m-%d") + time_str = scheduled_time.strftime("%H:%M") + print(f" [定时] 设置定时发布: {date_str} {time_str}", flush=True) + + try: + found = await _click_schedule_toggle(page) + if not found: + print(f" [定时] 未找到定时发布选项,降级为立即发布", flush=True) + return False + + await asyncio.sleep(1) + + ok = await _fill_datetime(page, scheduled_time, date_str, time_str) + if ok: + print(f" [定时] 已设置定时: {date_str} {time_str}", flush=True) + else: + print(f" [定时] 日期时间填写失败,降级为立即发布", flush=True) + return ok + + except Exception as e: + print(f" [定时] 异常: {str(e)[:60]},降级为立即发布", flush=True) + return False + + +async def _click_schedule_toggle(page) -> bool: + """找到并点击定时发布开关/单选按钮""" + selectors = [ + 'label:has-text("定时发布")', + 'span:has-text("定时发布")', + 'div:has-text("定时发布"):not(:has(div:has-text("定时发布")))', + 'input[value="schedule"] + label', + 'input[value="schedule"]', + 'text=定时发布', + '[class*="schedule"]', + '[class*="timing"]', + ] + + for sel in selectors: + loc = page.locator(sel).first + try: + if await loc.count() > 0: + await loc.scroll_into_view_if_needed() + await asyncio.sleep(0.3) + await loc.click(force=True) + return True + except Exception: + continue + + clicked = await page.evaluate("""() => { + const texts = ['定时发布', '定时', '预约发布', '选择时间发布']; + const all = document.querySelectorAll('label, span, div, li, a, button, input[type="radio"]'); + for (const el of all) { + const t = el.textContent?.trim(); + if (t && texts.some(k => t === k || t.startsWith(k)) && el.offsetParent !== null) { + el.click(); + return true; + } + } + return false; + }""") + return clicked + + +async def _fill_datetime(page, dt: datetime, date_str: str, time_str: str) -> bool: + """填写日期和时间(处理各种 datepicker 形式)""" + date_filled = await _try_fill_date(page, dt, date_str) + time_filled = await _try_fill_time(page, dt, time_str) + + if not date_filled and not time_filled: + return await _try_fill_combined(page, dt, date_str, time_str) + + return date_filled or time_filled + + +async def _try_fill_date(page, dt: datetime, date_str: str) -> bool: + """尝试填写日期""" + date_selectors = [ + 'input[type="date"]', + 'input[placeholder*="日期"]', + 'input[placeholder*="年"]', + 'input[class*="date"]', + ] + + for sel in date_selectors: + loc = page.locator(sel).first + try: + if await loc.count() > 0: + await loc.click(force=True) + await loc.fill(date_str) + await asyncio.sleep(0.3) + return True + except Exception: + continue + + filled = await page.evaluate("""(dateStr) => { + const inputs = document.querySelectorAll('input'); + for (const inp of inputs) { + const ph = (inp.placeholder || '').toLowerCase(); + const cls = (inp.className || '').toLowerCase(); + if ((ph.includes('日期') || ph.includes('date') || cls.includes('date')) + && inp.offsetParent !== null) { + const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set; + nativeSet.call(inp, dateStr); + inp.dispatchEvent(new Event('input', {bubbles: true})); + inp.dispatchEvent(new Event('change', {bubbles: true})); + return true; + } + } + return false; + }""", date_str) + return filled + + +async def _try_fill_time(page, dt: datetime, time_str: str) -> bool: + """尝试填写时间""" + time_selectors = [ + 'input[type="time"]', + 'input[placeholder*="时间"]', + 'input[placeholder*="时"]', + 'input[class*="time"]:not([class*="timestamp"])', + ] + + for sel in time_selectors: + loc = page.locator(sel).first + try: + if await loc.count() > 0: + await loc.click(force=True) + await loc.fill(time_str) + await asyncio.sleep(0.3) + return True + except Exception: + continue + + filled = await page.evaluate("""(timeStr) => { + const inputs = document.querySelectorAll('input'); + for (const inp of inputs) { + const ph = (inp.placeholder || '').toLowerCase(); + const cls = (inp.className || '').toLowerCase(); + if ((ph.includes('时间') || ph.includes('time') || cls.includes('time')) + && !cls.includes('timestamp') && inp.offsetParent !== null) { + const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set; + nativeSet.call(inp, timeStr); + inp.dispatchEvent(new Event('input', {bubbles: true})); + inp.dispatchEvent(new Event('change', {bubbles: true})); + return true; + } + } + return false; + }""", time_str) + return filled + + +async def _try_fill_combined(page, dt: datetime, date_str: str, time_str: str) -> bool: + """尝试一体式 datetime 输入""" + combined = f"{date_str} {time_str}" + + loc = page.locator('input[type="datetime-local"]').first + try: + if await loc.count() > 0: + await loc.fill(f"{date_str}T{time_str}") + return True + except Exception: + pass + + filled = await page.evaluate("""(combined) => { + const inputs = document.querySelectorAll('input'); + for (const inp of inputs) { + const ph = (inp.placeholder || ''); + if ((ph.includes('发布时间') || ph.includes('选择时间')) + && inp.offsetParent !== null) { + const nativeSet = Object.getOwnPropertyDescriptor(HTMLInputElement.prototype, 'value').set; + nativeSet.call(inp, combined); + inp.dispatchEvent(new Event('input', {bubbles: true})); + inp.dispatchEvent(new Event('change', {bubbles: true})); + return true; + } + } + return false; + }""", combined) + return filled diff --git a/03_卡木(木)/木叶_视频内容/小红书发布/脚本/xiaohongshu_publish.py b/03_卡木(木)/木叶_视频内容/小红书发布/脚本/xiaohongshu_publish.py index 039d477e..18d31191 100644 --- a/03_卡木(木)/木叶_视频内容/小红书发布/脚本/xiaohongshu_publish.py +++ b/03_卡木(木)/木叶_视频内容/小红书发布/脚本/xiaohongshu_publish.py @@ -54,14 +54,15 @@ TITLES = { } -async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, skip_dedup: bool = False) -> PublishResult: +async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, skip_dedup: bool = False, scheduled_time=None) -> PublishResult: from playwright.async_api import async_playwright from publish_result import is_published fname = Path(video_path).name fsize = Path(video_path).stat().st_size t0 = time.time() - print(f"\n[{idx}/{total}] {fname} ({fsize/1024/1024:.1f}MB)", flush=True) + time_hint = f" → 定时 {scheduled_time.strftime('%H:%M')}" if scheduled_time else "" + print(f"\n[{idx}/{total}] {fname} ({fsize/1024/1024:.1f}MB){time_hint}", flush=True) print(f" 标题: {title[:60]}", flush=True) if not skip_dedup and is_published("小红书", video_path): @@ -151,6 +152,13 @@ async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, await asyncio.sleep(1) + # 定时发布 + if scheduled_time: + from schedule_helper import set_scheduled_time + scheduled_ok = await set_scheduled_time(page, scheduled_time, "小红书") + if scheduled_ok: + print(f" [定时] 小红书定时发布已设置", flush=True) + await asyncio.sleep(1) print(" [4] 等待发布按钮启用...", flush=True) pub = page.locator('button:has-text("发布")').first diff --git a/03_卡木(木)/木叶_视频内容/小红书发布/脚本/xiaohongshu_storage_state.json b/03_卡木(木)/木叶_视频内容/小红书发布/脚本/xiaohongshu_storage_state.json index 4400e0d5..58fd100c 100644 --- a/03_卡木(木)/木叶_视频内容/小红书发布/脚本/xiaohongshu_storage_state.json +++ b/03_卡木(木)/木叶_视频内容/小红书发布/脚本/xiaohongshu_storage_state.json @@ -1 +1 @@ -{"cookies": [{"name": "xsecappid", "value": "ugc", "domain": ".xiaohongshu.com", "path": "/", "expires": 1804662063, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "a1", "value": "19cd60a9fc67sq38y42r4sqx5kmpc1i6ahui3k5mm30000687072", "domain": ".xiaohongshu.com", "path": "/", "expires": 1804653546, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "webId", "value": "5a9ea25c0c3028732e8d594ed19a4a4e", "domain": ".xiaohongshu.com", "path": "/", "expires": 1804653546, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gid", "value": "yjSfK800DW0KyjSfK80jixT2SKWMAqYv4JF4766MAC2T63q8USy3Kq888KYW8WJ8WqjSSYDi", "domain": ".xiaohongshu.com", "path": "/", "expires": 1807686065.84723, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "customer-sso-sid", "value": "68c5176154819623929937970htobts05deiiuxh", "domain": ".xiaohongshu.com", "path": "/", "expires": 1773722366.852965, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "x-user-id-creator.xiaohongshu.com", "value": "63b3cb6f000000002502c21d", "domain": ".xiaohongshu.com", "path": "/", "expires": 1807677567.852995, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "customerClientId", "value": "586477551116322", "domain": ".xiaohongshu.com", "path": "/", "expires": 1807677567.853006, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "access-token-creator.xiaohongshu.com", "value": "customer.creator.AT-68c517615481962393042947iutloo5r1fnkfqt3", "domain": ".xiaohongshu.com", "path": "/", "expires": 1775709566.853013, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "galaxy_creator_session_id", "value": "ksy02Mkehi3ye5IR60P01klUicMIL9V5Qscz", "domain": ".xiaohongshu.com", "path": "/", "expires": 1775709567.853097, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "galaxy.creator.beaker.session.id", "value": "1773117567623092062639", "domain": ".xiaohongshu.com", "path": "/", "expires": 1775709567.853107, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "acw_tc", "value": "0a0d0eb817731260369211379e71156a6d4f2a4944a12ab612246bdf85da66", "domain": "creator.xiaohongshu.com", "path": "/", "expires": 1773127836.850927, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "websectiga", "value": "82e85efc5500b609af1166aaf086ff8aa4261153a448ef0be5b17417e4512f28", "domain": ".xiaohongshu.com", "path": "/", "expires": 1773385237, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "sec_poison_id", "value": "3e7d16ee-ebf9-4fb7-b184-16f1bc4c04aa", "domain": ".xiaohongshu.com", "path": "/", "expires": 1773126642, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "acw_tc", "value": "0ad583f417731260377445867e00a839bfc45fec40b3e01c3ed7ef58dadbfd", "domain": "edith.xiaohongshu.com", "path": "/", "expires": 1773127837.689612, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "acw_tc", "value": "0a00dc2417731260540056198e18eb1db71fef1fe42675cbb7bfa569dbaae4", "domain": "www.xiaohongshu.com", "path": "/", "expires": 1773127853.936156, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "loadts", "value": "1773126063233", "domain": ".xiaohongshu.com", "path": "/", "expires": 1804662063, "httpOnly": false, "secure": false, "sameSite": "Lax"}], "origins": [{"origin": "https://creator.xiaohongshu.com", "localStorage": [{"name": "USER_INFO_FOR_BIZ", "value": "{\"userId\":\"63b3cb6f000000002502c21d\",\"userName\":\"#\u5361\u82e5\ud83d\udd25(4:00\u8d77\u5e8a\u7684\u7537\u4eba)\",\"userAvatar\":\"https://sns-avatar-qc.xhscdn.com/avatar/65a68110d4b53385b6a72ed1.jpg?imageView2/2/w/80/format/jpg\",\"redId\":\"6244231151\",\"role\":\"creator\",\"permissions\":[\"creatorCollege\",\"creatorWiki\",\"noteInspiration\",\"creatorHome\",\"creatorData\",\"USER_GROUP\",\"creatorActivityCenter\",\"ORIGINAL_STATEMENT\"],\"zone\":\"86\",\"phone\":\"15880802661\",\"relatedUserId\":null,\"relatedUserName\":null,\"kolCoOrder\":false}"}, {"name": "uploader-permit-video-spectrum", "value": "{\"\u5e7f\u70b9\u901a\u80fd\u6295Soul\u4e86\uff0c1000\u66dd\u51496\u523010\u5757.mp4-3033345\":null,\"\u7761\u7720\u4e0d\u597d\uff1f\u6bcf\u5929\u653e\u4e0b\u4e00\u4ef6\u4e8b\uff0c\u505a\u51cf\u6cd5.mp4-7022452\":null,\"\u6838\u5fc3\u5c31\u4e24\u4e2a\u5b57 \u7b5b\u9009\u3002\u80fd\u5f00\u6d3e\u5bf9\u575a\u63017\u5929\u7684\u4eba\u518d\u8c08.mp4-8324133\":null,\"\u8fd9\u5957\u4f53\u7cfb\u82b1\u4e86170\u4e07\uff0c\u4f46\u524d\u7aef\u51e0\u5341\u5757\u5c31\u80fd\u53c2\u4e0e.mp4-9668726\":null,\"\u65e9\u8d77\u4e0d\u662f\u4e3a\u4e86\u5f00\u6d3e\u5bf9\uff0c\u662f\u4e0d\u5435\u8001\u5a46\u7761\u89c9.mp4-5788932\":null,\"ICU\u51fa\u6765\u4e00\u5e74\u591a \u6d3b\u7740\u8981\u5728\u4e92\u8054\u7f51\u4e0a\u7559\u4e0b\u4e1c\u897f.mp4-9669632\":null,\"MBTI\u7597\u6108SOUL \u5e74\u8f7b\u4eba\u6d4bMBTI\uff0c40\u523060\u5c81\u8d70\u4e94\u884c\u516b\u5366.mp4-10459668\":null}"}, {"name": "publish-uploader-history-upload-speed", "value": "[{\"speed\":[0],\"domain\":\"ros-upload.xiaohongshu.com\",\"timestamp\":1773126068900},{\"speed\":[0],\"domain\":\"ros-upload-d4.xhscdn.com\",\"timestamp\":1773126073901}]"}, {"name": "snsWebPublishCurrentUser", "value": "63b3cb6f000000002502c21d"}, {"name": "USER_INFO", "value": "{\"user\":{\"type\":\"User\",\"value\":{\"userId\":\"63b3cb6f000000002502c21d\",\"loginUserType\":\"creator\"}}}"}, {"name": "NEW_XHS_ABTEST_REPORT_KEY", "value": "{\"5a9ea25c0c3028732e8d594ed19a4a4e63b3cb6f000000002502c21d\":\"2026-03-10\"}"}, {"name": "b1b1", "value": "1"}, {"name": "score_display", "value": "1"}, {"name": "p1", "value": "10"}, {"name": "nps-userId", "value": "63b3cb6f000000002502c21d"}, {"name": "_speedList", "value": "[{\"ts\":1773120809464,\"speed\":90950888.66666667},{\"ts\":1773120809466,\"speed\":50470266.333333336},{\"ts\":1773121636664,\"speed\":123234916.66666667},{\"ts\":1773121636683,\"speed\":59541241},{\"ts\":1773123445647,\"speed\":128041694.33333333},{\"ts\":1773123445681,\"speed\":42702664},{\"ts\":1773126043391,\"speed\":133890527.66666667},{\"ts\":1773126043409,\"speed\":80095987},{\"ts\":1773126068675,\"speed\":221171523.66666666},{\"ts\":1773126068698,\"speed\":40096813.333333336}]"}, {"name": "score_timestamp", "value": "1773119928816"}, {"name": "last_tiga_update_time", "value": "1773126037681"}, {"name": "uploader-permit-image-spectrum", "value": "{\"cover.jpeg-291551\":null,\"cover.jpeg-298713\":null,\"cover.jpeg-233484\":null,\"cover.jpeg-287062\":null,\"cover.jpeg-297342\":null}"}, {"name": "sdt_source_storage_key", "value": "{\"url\":\"https://fe-static.xhscdn.com/as/v2/fp/962356ead351e7f2422eb57edff6982d.js\",\"desVersion\":\"2\",\"signUrl\":\"https://fe-static.xhscdn.com/as/v1/f218/a15/public/04b29480233f4def5c875875b6bdc3b1.js\",\"xhsTokenUrl\":\"https://fe-static.xhscdn.com/as/v1/3e44/public/bf7d4e32677698655a5cadc581fd09b3.js\",\"reportUrl\":\"/api/sec/v1/shield/webprofile\",\"validate\":false,\"commonPatch\":[\"/fe_api/burdock/v2/note/post\",\"/api/sns/web/v1/comment/post\",\"/api/sns/web/v1/note/like\",\"/api/sns/web/v1/note/collect\",\"/api/sns/web/v1/user/follow\",\"/api/sns/web/v1/feed\",\"/api/sns/web/v1/login/activate\",\"/api/sns/web/v1/note/metrics_report\",\"/api/redcaptcha\",\"/api/store/jpd/main\",\"/phoenix/api/strategy/getAppStrategy\",\"/web_api/sns/v2/note\"],\"signVersion\":\"1\",\"extraInfo\":{}}"}, {"name": "b1", "value": "I38rHdgsjopgIvesdVwgIC+oIELmBZ5e3VwXLgFTIxS3bqwErFeexd0ekncAzMFYnqthIhJeSnMDKutRI3KsYorWHPtGrbi0P9WfIi/eWc6eYqtyQApPI37ekmR6QLQ5Ii6sdneeSfqYHqwl2qt5B0DBIx+PGDV/sutkIx0sxuwr4qtiIhuaIE3e3LV0I3VTIC7e0Vtl2ADmsLveDSKsSPw5IEvsiVtJOqw8BuwfPpdeTFWOIx4TIiu6ZPwrPut5IvlaLbgs3qtxIxes1VwHIkumIkIyejgsY/WTge7eSqte/D7sDcpipedeYrDtIC6eDVw2IENsSqtlnlSuNjVtIvoekqt3cZ7sVo4gIESyIhE2QnquIxhnqz8gIkIfoqwkICZWG73sdlOeVPw3IvAe0fged0MnIi5s3I4S2utAIiKsidvekZNeTPt4nAOeWPwEIvY/c06efqwvLBosDVw+I3TrIxE5Luwwaqw+rekhZANe1MNe0Pw9ICNsVLoeSbIFIkosSr7sVnFiIkgsVVtMIiudqqw+tqtWI30e3PwjIENeTVthIh/sYqtSGqwymPwDIvIkI3It4aGS4Y/eiutjIimrIEOsSVtzBoFM/9vej9ZvIiENGutzrutlIvve3PtUOpKeVWNsVpEyIEJekd/skPtsnPwqIvgejuwfIiJeTaroIvKejfKeDqt3Ixvs6qwu2fWBIEL4ICgsVM6ekgeedZosdVtmIiF9Ixiw8qw9IiHOIx3efe4nargeTPw6IxVAqVwbbn5eisos1VtMKut1IiFeIvTl+VtubuwMIxosVegeYuwu4qtvIv8kHqtoIkViwcVuIxoskSos1FvedqwgBqtdIxhWIk7s0VtmIv5ekgRwIhMiwj8XIE41IEKeWuwGqutWOqt8IiuqICosSloeDPwq8gi+IhLXzVtYOPt6IihHIk+IIx+8Iv/edoAsxBkeoPw0IEVHyPwINPwpIC5eYSHQIxhKqS5eVqtNHPtVNZFhgBMlIhR5zqwaIxOe6zuZIiWebuwkI34n+PtWrVtsIhIAIEpvIvQ+sPwcIiu/IhgsxuwSeI81IEuZIvesj95sdPwvIv8WIhW3GZDYIC+FgmH4Iv3sjS/eSuwBIh7s1ut1IhLNICAedVwQ"}, {"name": "_renderInfo", "value": "angle (google, vulkan 1.3.0 (swiftshader device (llvm 10.0.0) (0x0000c0de)), swiftshader driver)"}, {"name": "xhs_context_networkQuality", "value": "MODERATE"}]}]} \ No newline at end of file +{"cookies": [{"name": "xsecappid", "value": "ugc", "domain": ".xiaohongshu.com", "path": "/", "expires": 1804662968, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "a1", "value": "19cd60a9fc67sq38y42r4sqx5kmpc1i6ahui3k5mm30000687072", "domain": ".xiaohongshu.com", "path": "/", "expires": 1804653546, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "webId", "value": "5a9ea25c0c3028732e8d594ed19a4a4e", "domain": ".xiaohongshu.com", "path": "/", "expires": 1804653546, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "gid", "value": "yjSfK800DW0KyjSfK80jixT2SKWMAqYv4JF4766MAC2T63q8USy3Kq888KYW8WJ8WqjSSYDi", "domain": ".xiaohongshu.com", "path": "/", "expires": 1807686971.900933, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "customer-sso-sid", "value": "68c5176154819623929937970htobts05deiiuxh", "domain": ".xiaohongshu.com", "path": "/", "expires": 1773722366.852965, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "x-user-id-creator.xiaohongshu.com", "value": "63b3cb6f000000002502c21d", "domain": ".xiaohongshu.com", "path": "/", "expires": 1807677567.852995, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "customerClientId", "value": "586477551116322", "domain": ".xiaohongshu.com", "path": "/", "expires": 1807677567.853006, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "access-token-creator.xiaohongshu.com", "value": "customer.creator.AT-68c517615481962393042947iutloo5r1fnkfqt3", "domain": ".xiaohongshu.com", "path": "/", "expires": 1775709566.853013, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "galaxy_creator_session_id", "value": "ksy02Mkehi3ye5IR60P01klUicMIL9V5Qscz", "domain": ".xiaohongshu.com", "path": "/", "expires": 1775709567.853097, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "galaxy.creator.beaker.session.id", "value": "1773117567623092062639", "domain": ".xiaohongshu.com", "path": "/", "expires": 1775709567.853107, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "acw_tc", "value": "0a0d0eb817731260369211379e71156a6d4f2a4944a12ab612246bdf85da66", "domain": "creator.xiaohongshu.com", "path": "/", "expires": 1773127836.850927, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "acw_tc", "value": "0ad583f417731260377445867e00a839bfc45fec40b3e01c3ed7ef58dadbfd", "domain": "edith.xiaohongshu.com", "path": "/", "expires": 1773127837.689612, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "acw_tc", "value": "0a00dc2417731260540056198e18eb1db71fef1fe42675cbb7bfa569dbaae4", "domain": "www.xiaohongshu.com", "path": "/", "expires": 1773127853.936156, "httpOnly": true, "secure": false, "sameSite": "Lax"}, {"name": "websectiga", "value": "634d3ad75ffb42a2ade2c5e1705a73c845837578agb31ba0e442d75c648da36a", "domain": ".xiaohongshu.com", "path": "/", "expires": 1773386133, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "sec_poison_id", "value": "7e68f8b0-6d52-46d5-812f-a5c1ba39b7ea", "domain": ".xiaohongshu.com", "path": "/", "expires": 1773127538, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "loadts", "value": "1773126968902", "domain": ".xiaohongshu.com", "path": "/", "expires": 1804662968, "httpOnly": false, "secure": false, "sameSite": "Lax"}], "origins": [{"origin": "https://creator.xiaohongshu.com", "localStorage": [{"name": "USER_INFO_FOR_BIZ", "value": "{\"userId\":\"63b3cb6f000000002502c21d\",\"userName\":\"#\u5361\u82e5\ud83d\udd25(4:00\u8d77\u5e8a\u7684\u7537\u4eba)\",\"userAvatar\":\"https://sns-avatar-qc.xhscdn.com/avatar/65a68110d4b53385b6a72ed1.jpg?imageView2/2/w/80/format/jpg\",\"redId\":\"6244231151\",\"role\":\"creator\",\"permissions\":[\"creatorCollege\",\"creatorWiki\",\"noteInspiration\",\"creatorHome\",\"creatorData\",\"USER_GROUP\",\"creatorActivityCenter\",\"ORIGINAL_STATEMENT\"],\"zone\":\"86\",\"phone\":\"15880802661\",\"relatedUserId\":null,\"relatedUserName\":null,\"kolCoOrder\":false}"}, {"name": "uploader-permit-video-spectrum", "value": "{\"\u5e7f\u70b9\u901a\u80fd\u6295Soul\u4e86\uff0c1000\u66dd\u51496\u523010\u5757.mp4-3033345\":null,\"\u7761\u7720\u4e0d\u597d\uff1f\u6bcf\u5929\u653e\u4e0b\u4e00\u4ef6\u4e8b\uff0c\u505a\u51cf\u6cd5.mp4-7022452\":null,\"\u6838\u5fc3\u5c31\u4e24\u4e2a\u5b57 \u7b5b\u9009\u3002\u80fd\u5f00\u6d3e\u5bf9\u575a\u63017\u5929\u7684\u4eba\u518d\u8c08.mp4-8324133\":null,\"\u8fd9\u5957\u4f53\u7cfb\u82b1\u4e86170\u4e07\uff0c\u4f46\u524d\u7aef\u51e0\u5341\u5757\u5c31\u80fd\u53c2\u4e0e.mp4-9668726\":null,\"\u65e9\u8d77\u4e0d\u662f\u4e3a\u4e86\u5f00\u6d3e\u5bf9\uff0c\u662f\u4e0d\u5435\u8001\u5a46\u7761\u89c9.mp4-5788932\":null,\"ICU\u51fa\u6765\u4e00\u5e74\u591a \u6d3b\u7740\u8981\u5728\u4e92\u8054\u7f51\u4e0a\u7559\u4e0b\u4e1c\u897f.mp4-9669632\":null,\"MBTI\u7597\u6108SOUL \u5e74\u8f7b\u4eba\u6d4bMBTI\uff0c40\u523060\u5c81\u8d70\u4e94\u884c\u516b\u5366.mp4-10459668\":null,\"Soul\u4e1a\u52a1\u6a21\u578b \u6d3e\u5bf9+\u5207\u7247+\u5c0f\u7a0b\u5e8f\u5168\u94fe\u8def.mp4-10740368\":null,\"Soul\u5207\u724730\u79d2\u52308\u5206\u949f AI\u534a\u5c0f\u65f6\u80fd\u526a10\u523030\u4e2a.mp4-14677795\":null}"}, {"name": "publish-uploader-history-upload-speed", "value": "[{\"speed\":[0],\"domain\":\"ros-upload.xiaohongshu.com\",\"timestamp\":1773126975089},{\"speed\":[2.7720628045479154],\"domain\":\"ros-upload-d4.xhscdn.com\",\"timestamp\":1773126976937}]"}, {"name": "snsWebPublishCurrentUser", "value": "63b3cb6f000000002502c21d"}, {"name": "USER_INFO", "value": "{\"user\":{\"type\":\"User\",\"value\":{\"userId\":\"63b3cb6f000000002502c21d\",\"loginUserType\":\"creator\"}}}"}, {"name": "NEW_XHS_ABTEST_REPORT_KEY", "value": "{\"5a9ea25c0c3028732e8d594ed19a4a4e63b3cb6f000000002502c21d\":\"2026-03-10\"}"}, {"name": "b1b1", "value": "1"}, {"name": "score_display", "value": "1"}, {"name": "p1", "value": "12"}, {"name": "nps-userId", "value": "63b3cb6f000000002502c21d"}, {"name": "_speedList", "value": "[{\"ts\":1773123445647,\"speed\":128041694.33333333},{\"ts\":1773123445681,\"speed\":42702664},{\"ts\":1773126043391,\"speed\":133890527.66666667},{\"ts\":1773126043409,\"speed\":80095987},{\"ts\":1773126068675,\"speed\":221171523.66666666},{\"ts\":1773126068698,\"speed\":40096813.333333336},{\"ts\":1773126949519,\"speed\":243139166.33333334},{\"ts\":1773126949544,\"speed\":39166709},{\"ts\":1773126975497,\"speed\":173978750},{\"ts\":1773126975522,\"speed\":61798968}]"}, {"name": "score_timestamp", "value": "1773119928816"}, {"name": "last_tiga_update_time", "value": "1773126933524"}, {"name": "uploader-permit-image-spectrum", "value": "{\"cover.jpeg-291551\":null,\"cover.jpeg-298713\":null,\"cover.jpeg-233484\":null,\"cover.jpeg-287062\":null,\"cover.jpeg-297342\":null,\"cover.jpeg-286454\":null}"}, {"name": "sdt_source_storage_key", "value": "{\"xhsTokenUrl\":\"https://fe-static.xhscdn.com/as/v1/3e44/public/bf7d4e32677698655a5cadc581fd09b3.js\",\"extraInfo\":{},\"desVersion\":\"2\",\"commonPatch\":[\"/fe_api/burdock/v2/note/post\",\"/api/sns/web/v1/comment/post\",\"/api/sns/web/v1/note/like\",\"/api/sns/web/v1/note/collect\",\"/api/sns/web/v1/user/follow\",\"/api/sns/web/v1/feed\",\"/api/sns/web/v1/login/activate\",\"/api/sns/web/v1/note/metrics_report\",\"/api/redcaptcha\",\"/api/store/jpd/main\",\"/phoenix/api/strategy/getAppStrategy\",\"/web_api/sns/v2/note\"],\"signUrl\":\"https://fe-static.xhscdn.com/as/v1/f218/a15/public/04b29480233f4def5c875875b6bdc3b1.js\",\"signVersion\":\"1\",\"url\":\"https://fe-static.xhscdn.com/as/v2/fp/962356ead351e7f2422eb57edff6982d.js\",\"reportUrl\":\"/api/sec/v1/shield/webprofile\",\"validate\":false}"}, {"name": "b1", "value": "I38rHdgsjopgIvesdVwgIC+oIELmBZ5e3VwXLgFTIxS3bqwErFeexd0ekncAzMFYnqthIhJeSnMDKutRI3KsYorWHPtGrbi0P9WfIi/eWc6eYqtyQApPI37ekmR6QLQ5Ii6sdneeSfqYHqwl2qt5B0DBIx+PGDV/sutkIx0sxuwr4qtiIhuaIE3e3LV0I3VTIC7e0Vtl2ADmsLveDSKsSPw5IEvsiVtJOqw8BuwfPpdeTFWOIx4TIiu6ZPwrPut5IvlaLbgs3qtxIxes1VwHIkumIkIyejgsY/WTge7eSqte/D7sDcpipedeYrDtIC6eDVw2IENsSqtlnlSuNjVtIvoekqt3cZ7sVo4gIESyIhE2Q9quIxhnqz8gIkIfoqwkICZWG73sdlOeVPw3IvAe0fged0MnIi5s3I4S2utAIiKsidvekZNeTPt4nAOeWPwEIvY/c06efqwUgfgsDqwsI38rIxE5Luwwaqw+rekhZANe1MNe0Pw9ICNsVLoeSbIFIkosSr7sVnFiIkgsVVtMIiudqqw+tqtWI30e3PwjIENeTVthIh/sYqtSGqwymPwDIvIkI3It4aGS4Y/eiutjIimrIEOsSVtzBoFM/9vej9ZvIiENGutzrutlIvve3PtUOpKeVWNsVbmoIEJsVfOe3qtpLuwqIvvefVwvIioex0IbICdeS9ge0Pt9Ix7skqw6G9YaIhQgIvNs1M6e6gvedbgsYPwNIkqXIxk7rVwfIiP/I3OeDjYPaLdexPw0IxW02qweoodex/NsVVtvqqtWIkPtICSRNutYmVwAIk0s6zJe0qwI8qt7Ivm0PqtBIiqltzHxI30skSNsTp5eYqwFBqtrI3HxIi7s0ut4ICJeTgzqIETCNApXIE81IE/eDVwb2PtVoVt8IxIZIvosfmNefqw/4oI4IEuupPt7NVtCIkFHIkQIIxmHICdeS7esj9kWZPwkIhVQ4PwkOPwPIC/efMDbI3FKqM5eVVtyOqtdHshhrrkMIiGkrVwPIk3sV/WbIkLwrPtTIkYeBVtvoVtzIEPjICYDIhkPsqwRIkcXIEvskPwhZZkUIhGmIvAsfgNsxqw5IhRVIEqU/crgIC4k/zG0IC5sVp0eYuwZIh6sxPtHIEWVICJs0uwKI3RK"}, {"name": "_renderInfo", "value": "angle (google, vulkan 1.3.0 (swiftshader device (llvm 10.0.0) (0x0000c0de)), swiftshader driver)"}, {"name": "xhs_context_networkQuality", "value": "MODERATE"}]}]} \ No newline at end of file diff --git a/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_publish.py b/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_publish.py index a2dd042c..2ba19b8a 100644 --- a/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_publish.py +++ b/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_publish.py @@ -54,14 +54,15 @@ TITLES = { } -async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, skip_dedup: bool = False) -> PublishResult: +async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, skip_dedup: bool = False, scheduled_time=None) -> PublishResult: from playwright.async_api import async_playwright from publish_result import is_published fname = Path(video_path).name fsize = Path(video_path).stat().st_size t0 = time.time() - print(f"\n[{idx}/{total}] {fname} ({fsize/1024/1024:.1f}MB)", flush=True) + time_hint = f" → 定时 {scheduled_time.strftime('%H:%M')}" if scheduled_time else "" + print(f"\n[{idx}/{total}] {fname} ({fsize/1024/1024:.1f}MB){time_hint}", flush=True) print(f" 标题: {title[:60]}", flush=True) if not skip_dedup and is_published("快手", video_path): @@ -157,6 +158,13 @@ async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, # 清除可能的 tooltip await page.evaluate("""document.querySelectorAll('[data-tippy-root],[class*="tooltip"],[class*="popover"]').forEach(e => e.remove())""") + # 定时发布 + if scheduled_time: + from schedule_helper import set_scheduled_time + scheduled_ok = await set_scheduled_time(page, scheduled_time, "快手") + if scheduled_ok: + print(f" [定时] 快手定时发布已设置", flush=True) + print(" [4] 发布...", flush=True) await page.evaluate("window.scrollTo(0, document.body.scrollHeight)") await asyncio.sleep(1) diff --git a/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_storage_state.json b/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_storage_state.json index a1d4ba97..22768187 100644 --- a/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_storage_state.json +++ b/03_卡木(木)/木叶_视频内容/快手发布/脚本/kuaishou_storage_state.json @@ -1 +1 @@ -{"cookies": [{"name": "did", "value": "web_59afd87857628fadfacadff0c466f14cb3c9", "domain": ".kuaishou.com", "path": "/", "expires": 1807680283.271951, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "kwpsecproductname", "value": "account-zt-pc", "domain": "passport.kuaishou.com", "path": "/", "expires": 1775712260, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "kwpsecproductname", "value": "verification-captcha", "domain": "captcha.zt.kuaishou.com", "path": "/", "expires": 1775712266, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "kwfv1", "value": "PnGU+9+Y8008S+nH0U+0mjPf8fP08f+98f+nLlwnrIP9P78/DM+/cI8eWhPnHM+/GI8emj+BHF+nPEwnrMGfL980rhweGh+0pf+AY0+BH9P0rA+9zDG/L9+/mjP/YY8/WAwnP98nrM+0L9+/cA+eSS+/Gl+/PM+f8j8/mS8/cl+0ZA+APFG/LA+0GEG98f80cE8f+D+eQfGAbj+fQD8eqE+c==", "domain": ".kuaishou.com", "path": "/", "expires": 1775712266, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "didv", "value": "1773120283000", "domain": ".kuaishou.com", "path": "/", "expires": 1807680283.272001, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "bUserId", "value": "1000581252357", "domain": ".kuaishou.com", "path": "/", "expires": 1774416310.625656, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "bUserId", "value": "1000581252357", "domain": "id.kuaishou.com", "path": "/", "expires": 1774934710.419152, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "passToken", "value": "ChNwYXNzcG9ydC5wYXNzLXRva2VuEsABtfDxZXtPnjk15hJoTcYx1uyrt2hSh9FB2vixPMW8QbIw5tUZNIHAVEdpLCqdLrUQz21JzEsXkXkxcsydiVgBjqNRL_BX6WXjTbvGiVy9EgfMYI7dUwMzqXNxqpYs-6o1EqXYBw0oi42Zt9VJOjJep24Kfjemizr167KWJ89SJVrN7mt-M8d7m3MpG81IY9LTPLEF3Yaxo5talgc6DjHv7KsWzqAFIU9fwZ2TbHV7sKFWpdkOocwLhvVNSmtH1RjuGhI2r9gHVaFHkIbWYumijbjK4BsiIJTz8edocbgB9zeGNoP-jhNYGF5Y6ry53LhxjBIth1YKKAUwAQ", "domain": "id.kuaishou.com", "path": "/", "expires": 1774934710.41918, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "userId", "value": "463733910", "domain": ".kuaishou.com", "path": "/", "expires": 1774416310.625615, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "userId", "value": "463733910", "domain": "id.kuaishou.com", "path": "/", "expires": 1774934710.419174, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "kuaishou.web.cp.api_st", "value": "ChZrdWFpc2hvdS53ZWIuY3AuYXBpLnN0ErABXsXP7DjhNAzC26oKr6CLwjNPwvTIgdy4TmxM-wbBIBFjGlDHlqSORXEHhjV73QzvdVuxCaFJ9_OZxTYj4_dvj2giUG6D-8LYqWSyMEipzPPGZEcCrwcx_RKAReJGY_Mlva_zuKKCcXjgqT0tkc7pU5qipNlyAti8ZViYb5iWFCIe2yzWLmIL__8WPB-2noA9FpZWR7fD4iwNI4eWAB6HSgkurwjRgcjYxuMl7pwb_s0aEjXDFoga_Fxpw8r2Z4xly4zAfyIgKVPmoCN5ZeImWYJ24gBwV6mLBDX9XrynVXg0KxvL6LIoBTAB", "domain": ".kuaishou.com", "path": "/", "expires": 1774416310.625689, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "kuaishou.web.cp.api_ph", "value": "7f384b62e8e3f6e8e1afd657bd771846d551", "domain": ".kuaishou.com", "path": "/", "expires": 1774416310.62571, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "ks_onvideo_token", "value": "ZZOmMAIASPoaCz1VZqnGYg==", "domain": "onvideoapi.kuaishou.com", "path": "/", "expires": 1773206712.395114, "httpOnly": false, "secure": false, "sameSite": "Lax"}], "origins": [{"origin": "https://cp.kuaishou.com", "localStorage": [{"name": "OTHER_DEVICE_INCREASE_ID", "value": "1971"}, {"name": "refresh_last_time_0x0810", "value": "1773120256100"}, {"name": "ACTIVITY_SHOW_CLAIM_TOOLTIP", "value": "true"}, {"name": "PUBLISH_V2_TOUR", "value": "true"}, {"name": "LOAD_DEVICE_INCREASE_ID", "value": "27"}, {"name": "WEBLOGGER_CUSTOM_INCREAMENT_ID_KEY", "value": "139"}, {"name": "WEBLOGGER_INCREAMENT_ID_KEY", "value": "407"}]}, {"origin": "https://passport.kuaishou.com", "localStorage": [{"name": "WEBLOGGER_CHANNEL_SEQ_ID_NORMAL", "value": "13"}, {"name": "OTHER_DEVICE_INCREASE_ID", "value": "17"}, {"name": "kwfv1", "value": "PnGU+9+Y8008S+nH0U+0mjPf8fP08f+98f+nLlwnrIP9P78/DM+/cI8eWhPnHM+/GI8emj+BHF+nPEwnrMGfL980rIP/pfPeGlwemSPnp0G04fGAGU+eLE+fPlP0Gh+/DU80r78/ZA8ez08BQfPArI8nLMwncUwecl+0mS+eL9wnc="}, {"name": "WEBLOGGER_V2_SEQ_ID_showEvent", "value": "8"}, {"name": "LOAD_DEVICE_INCREASE_ID", "value": "3"}, {"name": "kwfcv1", "value": "1"}, {"name": "WEBLOGGER_CUSTOM_INCREAMENT_ID_KEY", "value": "19"}, {"name": "WEBLOGGER_V2_SEQ_ID_clickEvent", "value": "3"}, {"name": "WEBLOGGER_INCREAMENT_ID_KEY", "value": "13"}, {"name": "WEBLOGGER_V2_SEQ_ID_taskEvent", "value": "2"}]}, {"origin": "https://captcha.zt.kuaishou.com", "localStorage": [{"name": "WEBLOGGER_CHANNEL_SEQ_ID_NORMAL", "value": "6"}, {"name": "OTHER_DEVICE_INCREASE_ID", "value": "7"}, {"name": "kwfv1", "value": "PnGU+9+Y8008S+nH0U+0mjPf8fP08f+98f+nLlwnrIP9P78/DM+/cI8eWhPnHM+/GI8emj+BHF+nPEwnrMGfL980rhweGh+0pf+AY0+BH9P0rA+9zDG/L9+/mjP/YY8/WAwnP98nrM+0L9+/cA+eSS+/Gl+/PM+f8j8/mS8/cl+0ZA+APFG/LA+0GEG98f80cE8f+D+eQfGAbj+fQD8eqE+c=="}, {"name": "WEBLOGGER_V2_SEQ_ID_showEvent", "value": "2"}, {"name": "LOAD_DEVICE_INCREASE_ID", "value": "4"}, {"name": "kwfcv1", "value": "1"}, {"name": "WEBLOGGER_CUSTOM_INCREAMENT_ID_KEY", "value": "7"}, {"name": "WEBLOGGER_V2_SEQ_ID_clickEvent", "value": "1"}, {"name": "WEBLOGGER_INCREAMENT_ID_KEY", "value": "6"}, {"name": "WEBLOGGER_V2_SEQ_ID_taskEvent", "value": "3"}]}, {"origin": "https://app.m.kuaishou.com", "localStorage": [{"name": "CROSS_VERIFY_SESSION_d89a771b-87d8-4922-ba7b-ba9f09bb306f", "value": "{\"stateStack\":[],\"updateTime\":1773120283392}"}, {"name": "LOAD_DEVICE_INCREASE_ID", "value": "2"}, {"name": "OTHER_DEVICE_INCREASE_ID", "value": "7"}, {"name": "WEBLOGGER_CUSTOM_INCREAMENT_ID_KEY", "value": "6"}]}]} \ No newline at end of file +{"cookies": [{"name": "did", "value": "web_59afd87857628fadfacadff0c466f14cb3c9", "domain": ".kuaishou.com", "path": "/", "expires": 1807680283.271951, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "kwpsecproductname", "value": "account-zt-pc", "domain": "passport.kuaishou.com", "path": "/", "expires": 1775712260, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "kwpsecproductname", "value": "verification-captcha", "domain": "captcha.zt.kuaishou.com", "path": "/", "expires": 1775712266, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "kwfv1", "value": "PnGU+9+Y8008S+nH0U+0mjPf8fP08f+98f+nLlwnrIP9P78/DM+/cI8eWhPnHM+/GI8emj+BHF+nPEwnrMGfL980rhweGh+0pf+AY0+BH9P0rA+9zDG/L9+/mjP/YY8/WAwnP98nrM+0L9+/cA+eSS+/Gl+/PM+f8j8/mS8/cl+0ZA+APFG/LA+0GEG98f80cE8f+D+eQfGAbj+fQD8eqE+c==", "domain": ".kuaishou.com", "path": "/", "expires": 1775712266, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "didv", "value": "1773120283000", "domain": ".kuaishou.com", "path": "/", "expires": 1807680283.272001, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "bUserId", "value": "1000581252357", "domain": ".kuaishou.com", "path": "/", "expires": 1774416310.625656, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "bUserId", "value": "1000581252357", "domain": "id.kuaishou.com", "path": "/", "expires": 1774934710.419152, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "passToken", "value": "ChNwYXNzcG9ydC5wYXNzLXRva2VuEsABtfDxZXtPnjk15hJoTcYx1uyrt2hSh9FB2vixPMW8QbIw5tUZNIHAVEdpLCqdLrUQz21JzEsXkXkxcsydiVgBjqNRL_BX6WXjTbvGiVy9EgfMYI7dUwMzqXNxqpYs-6o1EqXYBw0oi42Zt9VJOjJep24Kfjemizr167KWJ89SJVrN7mt-M8d7m3MpG81IY9LTPLEF3Yaxo5talgc6DjHv7KsWzqAFIU9fwZ2TbHV7sKFWpdkOocwLhvVNSmtH1RjuGhI2r9gHVaFHkIbWYumijbjK4BsiIJTz8edocbgB9zeGNoP-jhNYGF5Y6ry53LhxjBIth1YKKAUwAQ", "domain": "id.kuaishou.com", "path": "/", "expires": 1774934710.41918, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "userId", "value": "463733910", "domain": ".kuaishou.com", "path": "/", "expires": 1774416310.625615, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "userId", "value": "463733910", "domain": "id.kuaishou.com", "path": "/", "expires": 1774934710.419174, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "kuaishou.web.cp.api_st", "value": "ChZrdWFpc2hvdS53ZWIuY3AuYXBpLnN0ErABXsXP7DjhNAzC26oKr6CLwjNPwvTIgdy4TmxM-wbBIBFjGlDHlqSORXEHhjV73QzvdVuxCaFJ9_OZxTYj4_dvj2giUG6D-8LYqWSyMEipzPPGZEcCrwcx_RKAReJGY_Mlva_zuKKCcXjgqT0tkc7pU5qipNlyAti8ZViYb5iWFCIe2yzWLmIL__8WPB-2noA9FpZWR7fD4iwNI4eWAB6HSgkurwjRgcjYxuMl7pwb_s0aEjXDFoga_Fxpw8r2Z4xly4zAfyIgKVPmoCN5ZeImWYJ24gBwV6mLBDX9XrynVXg0KxvL6LIoBTAB", "domain": ".kuaishou.com", "path": "/", "expires": 1774416310.625689, "httpOnly": true, "secure": true, "sameSite": "None"}, {"name": "kuaishou.web.cp.api_ph", "value": "7f384b62e8e3f6e8e1afd657bd771846d551", "domain": ".kuaishou.com", "path": "/", "expires": 1774416310.62571, "httpOnly": false, "secure": false, "sameSite": "Lax"}, {"name": "ks_onvideo_token", "value": "ZZOmMAIASPoaCz1VZqnGYg==", "domain": "onvideoapi.kuaishou.com", "path": "/", "expires": 1773206712.395114, "httpOnly": false, "secure": false, "sameSite": "Lax"}], "origins": [{"origin": "https://cp.kuaishou.com", "localStorage": [{"name": "OTHER_DEVICE_INCREASE_ID", "value": "2430"}, {"name": "refresh_last_time_0x0810", "value": "1773120256100"}, {"name": "ACTIVITY_SHOW_CLAIM_TOOLTIP", "value": "true"}, {"name": "PUBLISH_V2_TOUR", "value": "true"}, {"name": "LOAD_DEVICE_INCREASE_ID", "value": "33"}, {"name": "WEBLOGGER_CUSTOM_INCREAMENT_ID_KEY", "value": "170"}, {"name": "WEBLOGGER_INCREAMENT_ID_KEY", "value": "519"}]}, {"origin": "https://passport.kuaishou.com", "localStorage": [{"name": "WEBLOGGER_CHANNEL_SEQ_ID_NORMAL", "value": "13"}, {"name": "OTHER_DEVICE_INCREASE_ID", "value": "17"}, {"name": "kwfv1", "value": "PnGU+9+Y8008S+nH0U+0mjPf8fP08f+98f+nLlwnrIP9P78/DM+/cI8eWhPnHM+/GI8emj+BHF+nPEwnrMGfL980rIP/pfPeGlwemSPnp0G04fGAGU+eLE+fPlP0Gh+/DU80r78/ZA8ez08BQfPArI8nLMwncUwecl+0mS+eL9wnc="}, {"name": "WEBLOGGER_V2_SEQ_ID_showEvent", "value": "8"}, {"name": "LOAD_DEVICE_INCREASE_ID", "value": "3"}, {"name": "kwfcv1", "value": "1"}, {"name": "WEBLOGGER_CUSTOM_INCREAMENT_ID_KEY", "value": "19"}, {"name": "WEBLOGGER_V2_SEQ_ID_clickEvent", "value": "3"}, {"name": "WEBLOGGER_INCREAMENT_ID_KEY", "value": "13"}, {"name": "WEBLOGGER_V2_SEQ_ID_taskEvent", "value": "2"}]}, {"origin": "https://captcha.zt.kuaishou.com", "localStorage": [{"name": "WEBLOGGER_CHANNEL_SEQ_ID_NORMAL", "value": "6"}, {"name": "OTHER_DEVICE_INCREASE_ID", "value": "7"}, {"name": "kwfv1", "value": "PnGU+9+Y8008S+nH0U+0mjPf8fP08f+98f+nLlwnrIP9P78/DM+/cI8eWhPnHM+/GI8emj+BHF+nPEwnrMGfL980rhweGh+0pf+AY0+BH9P0rA+9zDG/L9+/mjP/YY8/WAwnP98nrM+0L9+/cA+eSS+/Gl+/PM+f8j8/mS8/cl+0ZA+APFG/LA+0GEG98f80cE8f+D+eQfGAbj+fQD8eqE+c=="}, {"name": "WEBLOGGER_V2_SEQ_ID_showEvent", "value": "2"}, {"name": "LOAD_DEVICE_INCREASE_ID", "value": "4"}, {"name": "kwfcv1", "value": "1"}, {"name": "WEBLOGGER_CUSTOM_INCREAMENT_ID_KEY", "value": "7"}, {"name": "WEBLOGGER_V2_SEQ_ID_clickEvent", "value": "1"}, {"name": "WEBLOGGER_INCREAMENT_ID_KEY", "value": "6"}, {"name": "WEBLOGGER_V2_SEQ_ID_taskEvent", "value": "3"}]}, {"origin": "https://app.m.kuaishou.com", "localStorage": [{"name": "CROSS_VERIFY_SESSION_d89a771b-87d8-4922-ba7b-ba9f09bb306f", "value": "{\"stateStack\":[],\"updateTime\":1773120283392}"}, {"name": "LOAD_DEVICE_INCREASE_ID", "value": "2"}, {"name": "OTHER_DEVICE_INCREASE_ID", "value": "7"}, {"name": "WEBLOGGER_CUSTOM_INCREAMENT_ID_KEY", "value": "6"}]}]} \ No newline at end of file diff --git a/03_卡木(木)/木叶_视频内容/抖音发布/脚本/douyin_pure_api.py b/03_卡木(木)/木叶_视频内容/抖音发布/脚本/douyin_pure_api.py index 9fd4efb8..dd762e52 100644 --- a/03_卡木(木)/木叶_视频内容/抖音发布/脚本/douyin_pure_api.py +++ b/03_卡木(木)/木叶_视频内容/抖音发布/脚本/douyin_pure_api.py @@ -541,14 +541,20 @@ async def create_v2( async def publish_one( video_path: str, title: str, - timing_ts: int = 0, idx: int = 1, total: int = 1, -) -> bool: + skip_dedup: bool = False, + scheduled_time=None, +) -> "PublishResult": global USER_ID + sys.path.insert(0, str(SCRIPT_DIR.parent.parent / "多平台分发" / "脚本")) + from publish_result import PublishResult, is_published + fname = Path(video_path).name fsize = Path(video_path).stat().st_size - timing_str = datetime.datetime.fromtimestamp(timing_ts).strftime("%m-%d %H:%M") if timing_ts > 0 else "立即" + timing_ts = int(scheduled_time.timestamp()) if scheduled_time else 0 + timing_str = scheduled_time.strftime("%m-%d %H:%M") if scheduled_time else "立即" + t0 = time.time() print(f"\n{'='*60}") print(f" [{idx}/{total}] {fname}") @@ -556,6 +562,11 @@ async def publish_one( print(f" 标题: {title[:60]}") print(f"{'='*60}") + if not skip_dedup and is_published("抖音", video_path): + print(f" [跳过] 该视频已发布到抖音", flush=True) + return PublishResult(platform="抖音", video_path=video_path, title=title, + success=True, status="skipped", message="去重跳过(已发布)") + try: keys = SecurityKeys(COOKIE_FILE) async with httpx.AsyncClient(timeout=60.0, follow_redirects=True) as client: @@ -564,32 +575,45 @@ async def publish_one( ) uid_data = resp.json() if uid_data.get("status_code") != 0: - print(f" [✗] Cookie 已过期,请重新运行 douyin_login.py") - return False + return PublishResult(platform="抖音", video_path=video_path, title=title, + success=False, status="error", message="Cookie 已过期", + elapsed_sec=time.time()-t0) user = uid_data.get("user") or uid_data.get("user_info") or {} USER_ID = str(user.get("uid", "") or user.get("user_id", "")) auth = await get_upload_auth(client, keys) info = await apply_upload(client, auth, fsize) if not await upload_chunks(client, info, video_path): - print(" [✗] 上传失败") - return False + return PublishResult(platform="抖音", video_path=video_path, title=title, + success=False, status="failed", message="上传失败", + elapsed_sec=time.time()-t0) video_id = await commit_upload(client, auth, info["session_key"]) if not video_id: - print(" [✗] 未获取到 video_id") - return False + return PublishResult(platform="抖音", video_path=video_path, title=title, + success=False, status="failed", message="未获取到 video_id", + elapsed_sec=time.time()-t0) result = await create_v2(client, keys, video_id, title, timing_ts) + elapsed = time.time() - t0 if result.get("status_code") == 0: item_id = result.get("item_id", "") - print(f" [✓] 发布成功! item_id={item_id}") - return True + msg = f"发布成功 item_id={item_id}" + if timing_ts > 0: + msg += f" (定时 {timing_str})" + print(f" [✓] {msg}") + return PublishResult(platform="抖音", video_path=video_path, title=title, + success=True, status="reviewing", message=msg, + elapsed_sec=elapsed) else: - print(f" [✗] 发布失败: {result}") - return False + msg = f"发布失败: {str(result)[:80]}" + print(f" [✗] {msg}") + return PublishResult(platform="抖音", video_path=video_path, title=title, + success=False, status="failed", message=msg, + elapsed_sec=elapsed) except Exception as e: - print(f" [✗] 异常: {e}") - return False + return PublishResult(platform="抖音", video_path=video_path, title=title, + success=False, status="error", message=f"异常: {str(e)[:80]}", + elapsed_sec=time.time()-t0) # ═══════════════════════════════════════════════════════════ @@ -626,36 +650,27 @@ async def main(): return 1 print(f"[i] 共 {len(videos)} 条视频") - now_ts = int(time.time()) - base_ts = ((now_ts + 3600) // 3600 + 1) * 3600 + sys.path.insert(0, str(SCRIPT_DIR.parent.parent / "多平台分发" / "脚本")) + from publish_result import print_summary, save_results + from schedule_generator import generate_schedule, format_schedule - schedule = [] - for i, vp in enumerate(videos): - ts = base_ts + i * 3600 - title = TITLES.get(vp.name, f"{vp.stem} #Soul派对 #创业日记") - schedule.append((vp, title, ts)) - dt_str = datetime.datetime.fromtimestamp(ts).strftime("%m-%d %H:%M") - print(f" {i+1:2d}. {dt_str} | {vp.name[:50]}") + schedule_times = generate_schedule(len(videos)) + print(f"\n排期:") + print(format_schedule([v.name for v in videos], schedule_times)) results = [] - for i, (vp, title, ts) in enumerate(schedule): - ok = await publish_one(str(vp), title, ts, i + 1, len(schedule)) - results.append((vp.name, ok, ts)) - if i < len(schedule) - 1: - wait = 3 if ok else 1 - print(f" 等待 {wait}s...") - await asyncio.sleep(wait) + for i, (vp, stime) in enumerate(zip(videos, schedule_times)): + title = TITLES.get(vp.name, f"{vp.stem} #Soul派对 #创业日记") + r = await publish_one(str(vp), title, i + 1, len(videos), scheduled_time=stime) + results.append(r) + if i < len(videos) - 1: + await asyncio.sleep(3) - print(f"\n{'='*60}") - print(" 发布汇总") - print(f"{'='*60}") - for name, ok, ts in results: - s = "✓" if ok else "✗" - t = datetime.datetime.fromtimestamp(ts).strftime("%m-%d %H:%M") - print(f" [{s}] {t} | {name}") - success = sum(1 for _, ok, _ in results if ok) - print(f"\n 成功: {success}/{len(results)}") - return 0 if success == len(results) else 1 + actual = [r for r in results if r.status != "skipped"] + print_summary(actual) + save_results(actual) + ok = sum(1 for r in actual if r.success) + return 0 if ok == len(actual) else 1 if __name__ == "__main__": diff --git a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_publish.py b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_publish.py index a3823fb7..1b3e6900 100644 --- a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_publish.py +++ b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_publish.py @@ -54,14 +54,15 @@ TITLES = { } -async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, skip_dedup: bool = False) -> PublishResult: +async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, skip_dedup: bool = False, scheduled_time=None) -> PublishResult: from playwright.async_api import async_playwright from publish_result import is_published fname = Path(video_path).name fsize = Path(video_path).stat().st_size t0 = time.time() - print(f"\n[{idx}/{total}] {fname} ({fsize/1024/1024:.1f}MB)", flush=True) + time_hint = f" → 定时 {scheduled_time.strftime('%H:%M')}" if scheduled_time else "" + print(f"\n[{idx}/{total}] {fname} ({fsize/1024/1024:.1f}MB){time_hint}", flush=True) print(f" 标题: {title[:60]}", flush=True) if not skip_dedup and is_published("视频号", video_path): @@ -145,6 +146,13 @@ async def publish_one(video_path: str, title: str, idx: int = 1, total: int = 1, }""", title) await asyncio.sleep(0.5) + # 定时发布 + if scheduled_time: + from schedule_helper import set_scheduled_time + scheduled_ok = await set_scheduled_time(page, scheduled_time, "视频号") + if scheduled_ok: + print(f" [定时] 视频号定时发布已设置", flush=True) + # 滚动到底部找发表按钮 await page.evaluate("window.scrollTo(0, document.body.scrollHeight)") await asyncio.sleep(1) diff --git a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_storage_state.json b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_storage_state.json index 2379282a..770be35f 100644 --- a/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_storage_state.json +++ b/03_卡木(木)/木叶_视频内容/视频号发布/脚本/channels_storage_state.json @@ -1 +1 @@ -{"cookies": [{"name": "sessionid", "value": "BgAAhwULqGfw5gClpw57W0xp6S%2Bv1xxG%2BtoX5MZUGea90WpFZ6g2CZzSm9%2FgiC3wDqiqTpyuGduYwaeCxtofVE6i7hzfyyZmtkIUkktbCus%3D", "domain": "channels.weixin.qq.com", "path": "/", "expires": 1807677423.042462, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "wxuin", "value": "3873206396", "domain": "channels.weixin.qq.com", "path": "/", "expires": 1807677423.042529, "httpOnly": false, "secure": true, "sameSite": "None"}], "origins": [{"origin": "https://channels.weixin.qq.com", "localStorage": [{"name": "finder_uin", "value": ""}, {"name": "__ml::page_a32df29f-5920-415a-a2cd-12ec324ba685", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"1ef23431-eaaf-46b4-8029-bcb651e5e122\",\"step\":1}"}, {"name": "__ml::page_51552276-5296-41a8-a2f7-a8b0ab36bc16", "value": "{\"pageId\":\"PostList\",\"accessId\":\"39b9bbbc-2e13-48c4-be00-91a70adf6859\",\"step\":2,\"refAccessId\":\"0b8cc40b-a714-4283-9a05-6085c50a799c\",\"refPageId\":\"PostCreate\"}"}, {"name": "__ml::hb_ts", "value": "1773123379242"}, {"name": "__ml::page_edf1bbb5-ccc0-465b-9912-4cd0dcaf1b65", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"9a803740-2527-4199-8e3d-8c358c8e75e0\",\"step\":1}"}, {"name": "__ml::aid", "value": "\"5749fb2e-51db-48f2-bab1-0d77038fb31a\""}, {"name": "__ml::page_8a0d0b1a-65d6-4a5c-b9f0-fde73bdfa9db", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"8f302ca1-c107-42bc-a227-bee6cc8fb44e\",\"step\":1}"}, {"name": "__ml::page_d5bd19e5-ae9b-486e-95d8-0b4d8baabfb6", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"e6ad3eae-f209-4ef4-871d-ef447601fc31\",\"step\":1}"}, {"name": "__rx::aid", "value": "\"5749fb2e-51db-48f2-bab1-0d77038fb31a\""}, {"name": "__ml::page", "value": "[\"72a13cf3-369b-4424-b69d-7ed0deebcc4f\",\"a2988245-e0e8-476b-85dc-106b7c6f5288\",\"ba0e3072-ab8d-43e2-ba6c-7ac71cd8611c\",\"8a0d0b1a-65d6-4a5c-b9f0-fde73bdfa9db\",\"654f47c4-50e7-47ab-b504-f4b90d806cb0\",\"1398bdf4-70b2-409a-b516-4d77923e0f18\",\"edf1bbb5-ccc0-465b-9912-4cd0dcaf1b65\",\"7fc5f55c-5b2c-49c0-ab88-7a31c2c6035a\",\"e2bab444-0f1a-47b2-b1f7-b3acb2ff73ce\",\"b7782d0f-29e4-4123-8184-7c5084b8c2d1\",\"51552276-5296-41a8-a2f7-a8b0ab36bc16\",\"fb0cd2dc-c646-4f56-8c37-c674f100db33\",\"5f9b5814-959c-4caa-9c5f-4cb1d0e9953e\",\"a32df29f-5920-415a-a2cd-12ec324ba685\",\"d5bd19e5-ae9b-486e-95d8-0b4d8baabfb6\",\"b8ecafac-8955-4a99-b94b-6ead27d18fe9\",\"94ac1c67-0c26-4720-921d-17efd5cd63ee\",\"b603ac69-c1d1-432e-b06f-1fc4beffa0a0\",\"a858d2a9-6c92-49de-bb68-cec198a86aac\"]"}, {"name": "__ml::page_ba0e3072-ab8d-43e2-ba6c-7ac71cd8611c", "value": "{\"pageId\":\"Home\",\"accessId\":\"ebadf8a0-665a-4c1a-840a-6917618f7414\",\"step\":1}"}, {"name": "finder_login_token", "value": ""}, {"name": "__ml::page_a2988245-e0e8-476b-85dc-106b7c6f5288", "value": "{\"pageId\":\"LoginForIframe\",\"accessId\":\"74bd878b-c591-4a54-b9f1-168fb21538c4\",\"step\":1}"}, {"name": "__ml::page_e2bab444-0f1a-47b2-b1f7-b3acb2ff73ce", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"31466641-845f-430f-9853-8c51b07d8721\",\"step\":1}"}, {"name": "__ml::page_b603ac69-c1d1-432e-b06f-1fc4beffa0a0", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"b879f622-4908-4ccf-9dd7-76072bb469f5\",\"step\":1}"}, {"name": "__ml::page_a858d2a9-6c92-49de-bb68-cec198a86aac", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"b0821916-a9cd-4466-aa3a-7104af4c6e3e\",\"step\":1}"}, {"name": "__ml::page_72a13cf3-369b-4424-b69d-7ed0deebcc4f", "value": "{\"pageId\":\"LoginForIframe\",\"accessId\":\"bd5e50a0-fc11-477c-9cc9-9c76e2d15205\",\"step\":1}"}, {"name": "finder_username", "value": "v2_060000231003b20faec8c5e48919cbd5cb05e53db077dd1924028a806c10cffd891eb5a80ce7@finder"}, {"name": "__ml::page_b7782d0f-29e4-4123-8184-7c5084b8c2d1", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"bf8c3e8f-bd8d-445d-93a3-ff942287906d\",\"step\":2,\"refAccessId\":\"0ec1591b-605a-4783-91f5-4c4b56baf2cd\",\"refPageId\":\"MicroPost\"}"}, {"name": "__ml::page_fb0cd2dc-c646-4f56-8c37-c674f100db33", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"ece1a13f-8fe9-4b07-ad56-9428b1a4c49a\",\"step\":2,\"refAccessId\":\"15108cd8-2794-4c73-b959-5fbb3f3c8d83\",\"refPageId\":\"MicroPost\"}"}, {"name": "_finger_print_device_id", "value": "6fd704941768442b12a996d2652fc61e"}, {"name": "MICRO_VISITED_NAME", "value": "{\"content\":10}"}, {"name": "__ml::page_b8ecafac-8955-4a99-b94b-6ead27d18fe9", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"062b5dba-e293-4f6e-9f74-f8e3ae2a233b\",\"step\":1}"}, {"name": "__ml::page_5f9b5814-959c-4caa-9c5f-4cb1d0e9953e", "value": "{\"pageId\":\"PostList\",\"accessId\":\"b6ec417c-3b78-4538-93c1-adf298573f3c\",\"step\":2,\"refAccessId\":\"66744497-c4ab-4d3f-b3fc-ac9d0635c405\",\"refPageId\":\"PostCreate\"}"}, {"name": "UvFirstReportLocalKey", "value": "1773072000000"}, {"name": "__ml::page_7fc5f55c-5b2c-49c0-ab88-7a31c2c6035a", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"e21b55a2-3558-45b7-bdc1-5bef0d9976a3\",\"step\":1}"}, {"name": "__ml::page_1398bdf4-70b2-409a-b516-4d77923e0f18", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"e3254f30-b8a3-44d2-9511-9f087c6e0f7e\",\"step\":1}"}, {"name": "__ml::page_94ac1c67-0c26-4720-921d-17efd5cd63ee", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"0c216b86-3594-4ed5-bfed-cf1a187ab0c6\",\"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_654f47c4-50e7-47ab-b504-f4b90d806cb0", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"1843fcab-97c8-4b58-9d1a-c75a67ab6432\",\"step\":1}"}, {"name": "finder_route_meta", "value": "micro.content/post/create;index;1;1773123430965"}]}]} \ No newline at end of file +{"cookies": [{"name": "sessionid", "value": "BgAAhwULqGfw5gClpw57W0xp6S%2Bv1xxG%2BtoX5MZUGea90WpFZ6g2CZzSm9%2FgiC3wDqiqTpyuGduYwaeCxtofVE6i7hzfyyZmtkIUkktbCus%3D", "domain": "channels.weixin.qq.com", "path": "/", "expires": 1807677423.042462, "httpOnly": false, "secure": true, "sameSite": "None"}, {"name": "wxuin", "value": "3873206396", "domain": "channels.weixin.qq.com", "path": "/", "expires": 1807677423.042529, "httpOnly": false, "secure": true, "sameSite": "None"}], "origins": [{"origin": "https://channels.weixin.qq.com", "localStorage": [{"name": "finder_uin", "value": ""}, {"name": "__ml::hb_ts", "value": "1773126932891"}, {"name": "__ml::page_d5bd19e5-ae9b-486e-95d8-0b4d8baabfb6", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"e6ad3eae-f209-4ef4-871d-ef447601fc31\",\"step\":1}"}, {"name": "__ml::page", "value": "[\"1398bdf4-70b2-409a-b516-4d77923e0f18\",\"edf1bbb5-ccc0-465b-9912-4cd0dcaf1b65\",\"7fc5f55c-5b2c-49c0-ab88-7a31c2c6035a\",\"e2bab444-0f1a-47b2-b1f7-b3acb2ff73ce\",\"b7782d0f-29e4-4123-8184-7c5084b8c2d1\",\"51552276-5296-41a8-a2f7-a8b0ab36bc16\",\"fb0cd2dc-c646-4f56-8c37-c674f100db33\",\"5f9b5814-959c-4caa-9c5f-4cb1d0e9953e\",\"a32df29f-5920-415a-a2cd-12ec324ba685\",\"d5bd19e5-ae9b-486e-95d8-0b4d8baabfb6\",\"b8ecafac-8955-4a99-b94b-6ead27d18fe9\",\"94ac1c67-0c26-4720-921d-17efd5cd63ee\",\"b603ac69-c1d1-432e-b06f-1fc4beffa0a0\",\"a858d2a9-6c92-49de-bb68-cec198a86aac\",\"7550280d-869b-4af8-aa07-d80bc23c3354\",\"a29278b3-123f-4605-9890-111a418e92bd\",\"fadebca2-9461-4007-8611-e2481c7433af\",\"14a51c94-7c14-4b01-b38f-5f3cc2fcb295\",\"cb36f4aa-56d1-4eef-9d60-20e4cebccfd7\",\"bbca8ab0-f32a-4d5d-a965-5ad3e7268709\"]"}, {"name": "__ml::page_fadebca2-9461-4007-8611-e2481c7433af", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"c250515e-324a-4e86-93b5-64505e2216b5\",\"step\":1}"}, {"name": "__ml::page_b7782d0f-29e4-4123-8184-7c5084b8c2d1", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"bf8c3e8f-bd8d-445d-93a3-ff942287906d\",\"step\":2,\"refAccessId\":\"0ec1591b-605a-4783-91f5-4c4b56baf2cd\",\"refPageId\":\"MicroPost\"}"}, {"name": "__ml::page_fb0cd2dc-c646-4f56-8c37-c674f100db33", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"ece1a13f-8fe9-4b07-ad56-9428b1a4c49a\",\"step\":2,\"refAccessId\":\"15108cd8-2794-4c73-b959-5fbb3f3c8d83\",\"refPageId\":\"MicroPost\"}"}, {"name": "AssistantUploadedInfoStorageKey_3899420810", "value": "[{\"fileUploadedInfoKey\":\"Soul\u5207\u724730\u79d2\u52308\u5206\u949f AI\u534a\u5c0f\u65f6\u80fd\u526a10\u523030\u4e2a.mp4:1773047996920:14677795:video/mp4:d0cc03e2c83010468ac032bde23a34c4\",\"isUsedQuickUpload\":false,\"uploadChunkRecord\":[{\"index\":1,\"reqTime\":1773126989472,\"resTime\":1773126993669,\"cost\":4197,\"success\":true},{\"index\":0,\"reqTime\":1773126989506,\"resTime\":1773126996483,\"cost\":6977,\"success\":true}],\"uuid\":\"bc913b4e-2dd7-4b69-a370-05fe1f3b9677\",\"uploadTaskId\":\"CkRjMGU0ODQ4Y2NkMjZjMGQ0NWZhMjMwYmMxMDY5ZTY2NzlmNDc0MDI2MTlmZDQzZWE4ZWZkNjBjNDQwNTZiNDAwZmYwYxI+NTY5YWZjNTRkMDAwNzlhYzRlODZjNzA4YTAwMDAwMGZiMDAwMDRmNGU1MzVhMWFjOTNiYjBiNmE5YmE4YTAwo+7/Bg==\",\"uploadTaskIdTimeStamp\":1773126989436,\"transFlag\":\"0_0\",\"partInfo\":[{\"PartNumber\":1,\"ETag\":\"\\\"6bd65e37a7ddc29930d13b89ee6cbcb726e83fe7\\\"\"},{\"PartNumber\":2,\"ETag\":\"\\\"e71ac3977b96899846550b50ac3700ac6d1dffd3\\\"\"}],\"uploadSuccessResp\":{\"data\":{\"DownloadURL\":\"http://wxapp.tc.qq.com/251/20302/stodownload?bizid=1023&dotrans=0&encfilekey=Cvvj5Ix3eewK0tHtibORqcsqchXNh0Gf3YiaX8QrZIfDcibhjOkN9vtQYYoMyYcavUfcpMpH2EMFF8icPY3jVlsVma6ktBqXKibyS6cDw7yo6qD8R89HYib95oYbPw8LHs8HxC&findertoken=088ae1b1c30e10d48abfcd061800223b66696e64657275706c6f616475726c5f333839393432303831305f313737333132363939363639365f3239353131343533353837383030393135312a2036373435396666316465333833323133336434363133346630326465343037653801400348005000580260ce9e01&hy=SZ&idx=1&m=&scene=2&token=AxricY7RBHdXJjF0pXeKDHtQISCCRSicxaZtjcVzq1tibmbL1ZUcS7kEsA0779fLtr6S2iciaUXRict9bUt3mJ0u7YEBHicsHNeicUNkf8B34p82V6eRoptiaHcOl7w&uzid=7a260\",\"httpsUrl\":\"https://finder.video.qq.com/251/20302/stodownload?bizid=1023&dotrans=0&encfilekey=Cvvj5Ix3eewK0tHtibORqcsqchXNh0Gf3YiaX8QrZIfDcibhjOkN9vtQYYoMyYcavUfcpMpH2EMFF8icPY3jVlsVma6ktBqXKibyS6cDw7yo6qD8R89HYib95oYbPw8LHs8HxC&findertoken=088ae1b1c30e10d48abfcd061800223b66696e64657275706c6f616475726c5f333839393432303831305f313737333132363939363639365f3239353131343533353837383030393135312a2036373435396666316465333833323133336434363133346630326465343037653801400348005000580260ce9e01&hy=SZ&idx=1&m=&scene=2&token=AxricY7RBHdXJjF0pXeKDHtQISCCRSicxaZtjcVzq1tibmbL1ZUcS7kEsA0779fLtr6S2iciaUXRict9bUt3mJ0u7YEBHicsHNeicUNkf8B34p82V6eRoptiaHcOl7w&uzid=7a260\"}}}]"}, {"name": "__ml::page_5f9b5814-959c-4caa-9c5f-4cb1d0e9953e", "value": "{\"pageId\":\"PostList\",\"accessId\":\"b6ec417c-3b78-4538-93c1-adf298573f3c\",\"step\":2,\"refAccessId\":\"66744497-c4ab-4d3f-b3fc-ac9d0635c405\",\"refPageId\":\"PostCreate\"}"}, {"name": "__ml::page_7fc5f55c-5b2c-49c0-ab88-7a31c2c6035a", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"e21b55a2-3558-45b7-bdc1-5bef0d9976a3\",\"step\":1}"}, {"name": "__ml::page_bbca8ab0-f32a-4d5d-a965-5ad3e7268709", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"e512a00b-6456-4284-a64f-6aa450d463ab\",\"step\":1}"}, {"name": "__ml::page_1398bdf4-70b2-409a-b516-4d77923e0f18", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"e3254f30-b8a3-44d2-9511-9f087c6e0f7e\",\"step\":1}"}, {"name": "__ml::page_14a51c94-7c14-4b01-b38f-5f3cc2fcb295", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"5ee0546e-4047-4cf3-b6fc-c2d8e5fd20ad\",\"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_cb36f4aa-56d1-4eef-9d60-20e4cebccfd7", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"a1beba77-e7cc-4b9a-98d3-2f338c4ead22\",\"step\":1}"}, {"name": "__ml::page_a32df29f-5920-415a-a2cd-12ec324ba685", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"1ef23431-eaaf-46b4-8029-bcb651e5e122\",\"step\":1}"}, {"name": "__ml::page_51552276-5296-41a8-a2f7-a8b0ab36bc16", "value": "{\"pageId\":\"PostList\",\"accessId\":\"39b9bbbc-2e13-48c4-be00-91a70adf6859\",\"step\":2,\"refAccessId\":\"0b8cc40b-a714-4283-9a05-6085c50a799c\",\"refPageId\":\"PostCreate\"}"}, {"name": "__ml::page_edf1bbb5-ccc0-465b-9912-4cd0dcaf1b65", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"9a803740-2527-4199-8e3d-8c358c8e75e0\",\"step\":1}"}, {"name": "__ml::page_7550280d-869b-4af8-aa07-d80bc23c3354", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"1fcd60c6-1acf-4b7b-94a2-3af0e6324bb1\",\"step\":1}"}, {"name": "__ml::aid", "value": "\"5749fb2e-51db-48f2-bab1-0d77038fb31a\""}, {"name": "__rx::aid", "value": "\"5749fb2e-51db-48f2-bab1-0d77038fb31a\""}, {"name": "finder_login_token", "value": ""}, {"name": "__ml::page_e2bab444-0f1a-47b2-b1f7-b3acb2ff73ce", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"31466641-845f-430f-9853-8c51b07d8721\",\"step\":1}"}, {"name": "__ml::page_a858d2a9-6c92-49de-bb68-cec198a86aac", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"b0821916-a9cd-4466-aa3a-7104af4c6e3e\",\"step\":1}"}, {"name": "__ml::page_b603ac69-c1d1-432e-b06f-1fc4beffa0a0", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"b879f622-4908-4ccf-9dd7-76072bb469f5\",\"step\":1}"}, {"name": "finder_username", "value": "v2_060000231003b20faec8c5e48919cbd5cb05e53db077dd1924028a806c10cffd891eb5a80ce7@finder"}, {"name": "_finger_print_device_id", "value": "6fd704941768442b12a996d2652fc61e"}, {"name": "MICRO_VISITED_NAME", "value": "{\"content\":13}"}, {"name": "__ml::page_b8ecafac-8955-4a99-b94b-6ead27d18fe9", "value": "{\"pageId\":\"MicroPost\",\"accessId\":\"062b5dba-e293-4f6e-9f74-f8e3ae2a233b\",\"step\":1}"}, {"name": "UvFirstReportLocalKey", "value": "1773072000000"}, {"name": "__ml::page_94ac1c67-0c26-4720-921d-17efd5cd63ee", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"0c216b86-3594-4ed5-bfed-cf1a187ab0c6\",\"step\":1}"}, {"name": "__ml::page_a29278b3-123f-4605-9890-111a418e92bd", "value": "{\"pageId\":\"PostCreate\",\"accessId\":\"326b7850-95ba-4ce1-a3ac-4e7d5fa045ae\",\"step\":1}"}, {"name": "finder_route_meta", "value": "micro.content/post/create;index;1;1773126986400"}]}]} \ No newline at end of file diff --git a/运营中枢/工作台/gitea_push_log.md b/运营中枢/工作台/gitea_push_log.md index f6b9d96b..11212d94 100644 --- a/运营中枢/工作台/gitea_push_log.md +++ b/运营中枢/工作台/gitea_push_log.md @@ -262,3 +262,4 @@ | 2026-03-10 13:34:41 | 🔄 卡若AI 同步 2026-03-10 13:34 | 更新:水桥平台对接、卡木、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-10 13:48:50 | 🔄 卡若AI 同步 2026-03-10 13:48 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | | 2026-03-10 14:18:01 | 🔄 卡若AI 同步 2026-03-10 14:17 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | +| 2026-03-10 15:02:53 | 🔄 卡若AI 同步 2026-03-10 15:02 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | diff --git a/运营中枢/工作台/代码管理.md b/运营中枢/工作台/代码管理.md index 91a433f8..de68c845 100644 --- a/运营中枢/工作台/代码管理.md +++ b/运营中枢/工作台/代码管理.md @@ -265,3 +265,4 @@ | 2026-03-10 13:34:41 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 13:34 | 更新:水桥平台对接、卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-10 13:48:50 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 13:48 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | | 2026-03-10 14:18:01 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 14:17 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) | +| 2026-03-10 15:02:53 | 成功 | 成功 | 🔄 卡若AI 同步 2026-03-10 15:02 | 更新:卡木、运营中枢工作台 | 排除 >20MB: 11 个 | [仓库](http://open.quwanzhi.com:3000/fnvtk/karuo-ai) [百科](http://open.quwanzhi.com:3000/fnvtk/karuo-ai/wiki) |