196 lines
5.7 KiB
Python
196 lines
5.7 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
小红书视频笔记上传示例
|
||
|
||
展示如何使用XiaoHongShuVideoNote类上传视频笔记
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
import asyncio
|
||
from pathlib import Path
|
||
from datetime import datetime, timedelta
|
||
|
||
# 添加项目根目录到系统路径
|
||
current_dir = os.path.dirname(os.path.abspath(__file__))
|
||
project_root = os.path.dirname(current_dir)
|
||
sys.path.append(project_root)
|
||
|
||
from conf import BASE_DIR
|
||
from uploader.xhs_note_uploader.main import (
|
||
XiaoHongShuVideoNote,
|
||
xiaohongshu_note_setup
|
||
)
|
||
|
||
|
||
async def upload_video_note_example():
|
||
"""视频笔记上传示例"""
|
||
|
||
print("=" * 60)
|
||
print("小红书视频笔记上传示例")
|
||
print("=" * 60)
|
||
|
||
# ========== 配置参数 ==========
|
||
|
||
# 标题(最多30字符)
|
||
title = "一分钟学会做蛋糕🍰"
|
||
|
||
# 正文内容(最多1000字符)
|
||
content = """超简单的蛋糕教程来啦!
|
||
|
||
📝 材料清单:
|
||
🥚 鸡蛋 3个
|
||
🍬 白糖 50g
|
||
🌾 低筋面粉 60g
|
||
🥛 牛奶 30ml
|
||
|
||
新手也能一次成功
|
||
快来试试吧~
|
||
|
||
完整配方在评论区👇"""
|
||
|
||
# 话题标签(建议最多3个)
|
||
tags = ["美食教程", "烘焙", "蛋糕"]
|
||
|
||
# 视频文件路径
|
||
video_path = str(Path(BASE_DIR) / "videos" / "demo.mp4")
|
||
|
||
# 视频封面路径(可选,不设置则使用视频第一帧)
|
||
thumbnail_path = None # str(Path(BASE_DIR) / "videos" / "thumbnail.jpg")
|
||
|
||
# Cookie文件路径
|
||
account_file = Path(BASE_DIR) / "cookies" / "xiaohongshu_note" / "account.json"
|
||
account_file.parent.mkdir(parents=True, exist_ok=True)
|
||
|
||
# 发布时间设置
|
||
# 方式1: 立即发布
|
||
publish_date = 0
|
||
|
||
# 方式2: 定时发布(明天上午10点)
|
||
# publish_date = datetime.now() + timedelta(days=1)
|
||
# publish_date = publish_date.replace(hour=10, minute=0, second=0)
|
||
|
||
# 可选参数
|
||
location = "北京市·朝阳区" # 地点(可选)
|
||
|
||
# 是否使用无头模式(不推荐)
|
||
headless = False
|
||
|
||
# ========== 检查Cookie ==========
|
||
|
||
print(f"\n[1/3] 检查Cookie...")
|
||
cookie_valid = await xiaohongshu_note_setup(str(account_file), handle=True)
|
||
|
||
if not cookie_valid:
|
||
print("❌ Cookie无效,请重新登录")
|
||
return
|
||
|
||
print("✅ Cookie有效")
|
||
|
||
# ========== 验证视频文件 ==========
|
||
|
||
print(f"\n[2/3] 验证视频文件...")
|
||
|
||
if not os.path.exists(video_path):
|
||
print(f"❌ 视频文件不存在: {video_path}")
|
||
print(f"提示: 请将视频放在 {Path(BASE_DIR) / 'videos'} 目录下")
|
||
return
|
||
|
||
file_size_mb = os.path.getsize(video_path) / (1024 * 1024)
|
||
print(f"✅ 视频文件: {os.path.basename(video_path)}")
|
||
print(f" 大小: {file_size_mb:.2f} MB")
|
||
|
||
if thumbnail_path and not os.path.exists(thumbnail_path):
|
||
print(f"⚠️ 封面文件不存在: {thumbnail_path}")
|
||
print(f" 将使用视频第一帧作为封面")
|
||
thumbnail_path = None
|
||
|
||
# ========== 创建上传器并执行上传 ==========
|
||
|
||
print(f"\n[3/3] 开始上传视频笔记...")
|
||
print(f"标题: {title}")
|
||
print(f"标签: {tags}")
|
||
print(f"地点: {location}")
|
||
print(f"发布方式: {'立即发布' if publish_date == 0 else f'定时发布({publish_date})'}")
|
||
print()
|
||
|
||
try:
|
||
# 创建视频笔记上传器
|
||
note = XiaoHongShuVideoNote(
|
||
title=title,
|
||
content=content,
|
||
tags=tags,
|
||
video_path=video_path,
|
||
publish_date=publish_date,
|
||
account_file=str(account_file),
|
||
thumbnail_path=thumbnail_path,
|
||
location=location,
|
||
headless=headless
|
||
)
|
||
|
||
# 执行上传
|
||
await note.main()
|
||
|
||
print("\n" + "=" * 60)
|
||
print("🎉 视频笔记上传成功!")
|
||
print("=" * 60)
|
||
|
||
except Exception as e:
|
||
print("\n" + "=" * 60)
|
||
print(f"❌ 上传失败: {e}")
|
||
print("=" * 60)
|
||
raise
|
||
|
||
|
||
async def upload_video_with_schedule_example():
|
||
"""定时发布视频笔记示例"""
|
||
|
||
print("=" * 60)
|
||
print("小红书视频笔记定时发布示例")
|
||
print("=" * 60)
|
||
|
||
account_file = Path(BASE_DIR) / "cookies" / "xiaohongshu_note" / "account.json"
|
||
account_file.parent.mkdir(parents=True, exist_ok=True)
|
||
|
||
# 检查Cookie
|
||
cookie_valid = await xiaohongshu_note_setup(str(account_file), handle=True)
|
||
if not cookie_valid:
|
||
print("❌ Cookie无效")
|
||
return
|
||
|
||
# 配置定时发布
|
||
video_path = str(Path(BASE_DIR) / "videos" / "demo.mp4")
|
||
|
||
# 设置发布时间(明天下午3点)
|
||
publish_time = datetime.now() + timedelta(days=1)
|
||
publish_time = publish_time.replace(hour=15, minute=0, second=0, microsecond=0)
|
||
|
||
print(f"定时发布时间: {publish_time.strftime('%Y-%m-%d %H:%M:%S')}")
|
||
|
||
try:
|
||
note = XiaoHongShuVideoNote(
|
||
title="定时发布测试🕐",
|
||
content="这是一条定时发布的视频笔记",
|
||
tags=["测试", "定时发布"],
|
||
video_path=video_path,
|
||
publish_date=publish_time,
|
||
account_file=str(account_file),
|
||
headless=False
|
||
)
|
||
|
||
await note.main()
|
||
|
||
print(f"\n✅ 视频已设置为定时发布: {publish_time.strftime('%Y-%m-%d %H:%M:%S')}")
|
||
|
||
except Exception as e:
|
||
print(f"\n❌ 设置失败: {e}")
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# 运行单个视频笔记上传示例
|
||
asyncio.run(upload_video_note_example())
|
||
|
||
# 如果需要定时发布,注释掉上面一行,取消下面的注释
|
||
# asyncio.run(upload_video_with_schedule_example())
|
||
|