212 lines
6.3 KiB
Python
212 lines
6.3 KiB
Python
# -*- coding: utf-8 -*-
|
||
"""
|
||
小红书图文笔记上传示例
|
||
|
||
展示如何使用XiaoHongShuImageNote类上传图文笔记
|
||
"""
|
||
|
||
import sys
|
||
import os
|
||
import asyncio
|
||
from pathlib import Path
|
||
|
||
# 添加项目根目录到系统路径
|
||
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 (
|
||
XiaoHongShuImageNote,
|
||
xiaohongshu_note_setup
|
||
)
|
||
|
||
|
||
async def upload_image_note_example():
|
||
"""图文笔记上传示例"""
|
||
|
||
print("=" * 60)
|
||
print("小红书图文笔记上传示例")
|
||
print("=" * 60)
|
||
|
||
# ========== 配置参数 ==========
|
||
|
||
# 标题(最多30字符)
|
||
title = "今天的下午茶时光☕️"
|
||
|
||
# 正文内容(最多1000字符,支持换行)
|
||
content = """分享一下今天的下午茶时光~
|
||
|
||
这家新开的咖啡馆环境超级好
|
||
阳光透过落地窗洒进来
|
||
感觉整个人都被治愈了💕
|
||
|
||
点了他们家的招牌拿铁
|
||
还有手工曲奇
|
||
味道真的绝了!
|
||
|
||
推荐给爱喝咖啡的小伙伴们~
|
||
|
||
#下午茶 #咖啡馆 #生活记录"""
|
||
|
||
# 话题标签(建议最多3个,不需要加#号)
|
||
tags = ["下午茶", "咖啡馆", "生活记录"]
|
||
|
||
# 图片路径列表(1-9张)
|
||
# 请将你的图片放在videos目录下,或使用绝对路径
|
||
image_paths = [
|
||
str(Path(BASE_DIR) / "videos" / "demo.png"), # 示例图片1
|
||
# str(Path(BASE_DIR) / "videos" / "photo2.jpg"), # 示例图片2
|
||
# str(Path(BASE_DIR) / "videos" / "photo3.jpg"), # 示例图片3
|
||
]
|
||
|
||
# Cookie文件路径
|
||
account_file = Path(BASE_DIR) / "cookies" / "xiaohongshu_note" / "account.json"
|
||
account_file.parent.mkdir(parents=True, exist_ok=True)
|
||
|
||
# 发布时间(0表示立即发布,也可以传入datetime对象)
|
||
publish_date = 0
|
||
|
||
# 可选参数
|
||
cover_index = 0 # 封面索引(0表示第一张图)
|
||
filter_name = None # 滤镜名称(如:"清新"、"复古"等)
|
||
location = "上海市·静安区" # 地点(可选)
|
||
|
||
# 是否使用无头模式(不推荐,建议设为False)
|
||
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] 验证图片文件...")
|
||
for i, img_path in enumerate(image_paths):
|
||
if not os.path.exists(img_path):
|
||
print(f"❌ 图片文件不存在: {img_path}")
|
||
print(f"提示: 请将图片放在 {Path(BASE_DIR) / 'videos'} 目录下")
|
||
return
|
||
print(f"✅ 图片 {i+1}: {os.path.basename(img_path)}")
|
||
|
||
# ========== 创建上传器并执行上传 ==========
|
||
|
||
print(f"\n[3/3] 开始上传图文笔记...")
|
||
print(f"标题: {title}")
|
||
print(f"图片数量: {len(image_paths)}")
|
||
print(f"标签: {tags}")
|
||
print(f"地点: {location}")
|
||
print()
|
||
|
||
try:
|
||
# 创建图文笔记上传器
|
||
note = XiaoHongShuImageNote(
|
||
title=title,
|
||
content=content,
|
||
tags=tags,
|
||
image_paths=image_paths,
|
||
publish_date=publish_date,
|
||
account_file=str(account_file),
|
||
cover_index=cover_index,
|
||
filter_name=filter_name,
|
||
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_multiple_notes_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
|
||
|
||
# 笔记列表
|
||
notes_config = [
|
||
{
|
||
"title": "早餐分享🍳",
|
||
"content": "今天的早餐超级丰盛~",
|
||
"tags": ["早餐", "美食", "健康生活"],
|
||
"images": [str(Path(BASE_DIR) / "videos" / "demo.png")],
|
||
},
|
||
{
|
||
"title": "好物推荐💄",
|
||
"content": "最近入手的宝藏好物分享!",
|
||
"tags": ["好物推荐", "种草", "护肤"],
|
||
"images": [str(Path(BASE_DIR) / "videos" / "demo.png")],
|
||
},
|
||
# 可以继续添加更多笔记...
|
||
]
|
||
|
||
# 逐个上传
|
||
for i, config in enumerate(notes_config):
|
||
print(f"\n[{i+1}/{len(notes_config)}] 上传笔记: {config['title']}")
|
||
|
||
try:
|
||
note = XiaoHongShuImageNote(
|
||
title=config["title"],
|
||
content=config["content"],
|
||
tags=config["tags"],
|
||
image_paths=config["images"],
|
||
publish_date=0,
|
||
account_file=str(account_file),
|
||
headless=False
|
||
)
|
||
|
||
await note.main()
|
||
|
||
print(f"✅ 笔记 {i+1} 上传成功")
|
||
|
||
# 上传间隔10-15分钟(避免风控)
|
||
if i < len(notes_config) - 1:
|
||
import random
|
||
wait_time = random.randint(600, 900) # 10-15分钟
|
||
print(f"⏰ 等待 {wait_time//60} 分钟后上传下一篇...")
|
||
await asyncio.sleep(wait_time)
|
||
|
||
except Exception as e:
|
||
print(f"❌ 笔记 {i+1} 上传失败: {e}")
|
||
continue
|
||
|
||
print("\n" + "=" * 60)
|
||
print("🎉 批量上传完成!")
|
||
print("=" * 60)
|
||
|
||
|
||
if __name__ == "__main__":
|
||
# 运行单个笔记上传示例
|
||
asyncio.run(upload_image_note_example())
|
||
|
||
# 如果需要批量上传,注释掉上面一行,取消下面的注释
|
||
# asyncio.run(upload_multiple_notes_example())
|
||
|