253 lines
7.6 KiB
Python
253 lines
7.6 KiB
Python
|
|
#!/usr/bin/env python3
|
|||
|
|
"""
|
|||
|
|
演示测试 - 测试基础功能(不实际发布)
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
import asyncio
|
|||
|
|
import sys
|
|||
|
|
from pathlib import Path
|
|||
|
|
|
|||
|
|
# 简化的模型定义(基于working_solution.py)
|
|||
|
|
from dataclasses import dataclass, field
|
|||
|
|
from enum import Enum
|
|||
|
|
from typing import List, Optional
|
|||
|
|
|
|||
|
|
class PlatformType(Enum):
|
|||
|
|
XIAOHONGSHU = "xiaohongshu"
|
|||
|
|
DOUYIN = "douyin"
|
|||
|
|
|
|||
|
|
@dataclass
|
|||
|
|
class ImageNote:
|
|||
|
|
title: str
|
|||
|
|
description: str
|
|||
|
|
images: List[str] = field(default_factory=list)
|
|||
|
|
tags: List[str] = field(default_factory=list)
|
|||
|
|
visibility: str = "public"
|
|||
|
|
cover_image: Optional[str] = None
|
|||
|
|
|
|||
|
|
@dataclass
|
|||
|
|
class VideoContent:
|
|||
|
|
title: str
|
|||
|
|
description: str
|
|||
|
|
video_path: str
|
|||
|
|
tags: List[str] = field(default_factory=list)
|
|||
|
|
visibility: str = "public"
|
|||
|
|
cover_image: Optional[str] = None
|
|||
|
|
|
|||
|
|
@dataclass
|
|||
|
|
class AccountInfo:
|
|||
|
|
platform: PlatformType
|
|||
|
|
username: str
|
|||
|
|
cookie_file: str
|
|||
|
|
is_active: bool = True
|
|||
|
|
|
|||
|
|
# 测试基础功能
|
|||
|
|
def test_basic_functionality():
|
|||
|
|
"""测试基础功能"""
|
|||
|
|
print("🚀 开始基础功能测试")
|
|||
|
|
print("=" * 50)
|
|||
|
|
|
|||
|
|
# 1. 测试内容创建
|
|||
|
|
print("📝 1. 测试内容创建")
|
|||
|
|
|
|||
|
|
note = ImageNote(
|
|||
|
|
title="我的旅行分享 🏔️",
|
|||
|
|
description="今天去了很美的地方,和大家分享一些照片!",
|
|||
|
|
images=["img1.jpg", "img2.jpg", "img3.jpg"],
|
|||
|
|
tags=["旅行", "美景", "分享", "生活"]
|
|||
|
|
)
|
|||
|
|
print(f"✅ 图文笔记创建成功: {note.title}")
|
|||
|
|
print(f" 描述: {note.description[:30]}...")
|
|||
|
|
print(f" 图片数量: {len(note.images)}")
|
|||
|
|
print(f" 标签: {', '.join(note.tags)}")
|
|||
|
|
|
|||
|
|
video = VideoContent(
|
|||
|
|
title="我的日常生活vlog 📸",
|
|||
|
|
description="记录一些日常生活的美好瞬间,希望大家喜欢!",
|
|||
|
|
video_path="daily_vlog.mp4",
|
|||
|
|
tags=["vlog", "日常", "生活记录", "分享"]
|
|||
|
|
)
|
|||
|
|
print(f"\n✅ 视频内容创建成功: {video.title}")
|
|||
|
|
print(f" 描述: {video.description[:30]}...")
|
|||
|
|
print(f" 视频路径: {video.video_path}")
|
|||
|
|
print(f" 标签: {', '.join(video.tags)}")
|
|||
|
|
|
|||
|
|
# 2. 测试账号信息
|
|||
|
|
print(f"\n👤 2. 测试账号信息")
|
|||
|
|
|
|||
|
|
xhs_account = AccountInfo(
|
|||
|
|
platform=PlatformType.XIAOHONGSHU,
|
|||
|
|
username="my_xhs_account",
|
|||
|
|
cookie_file="my_xhs_account.json"
|
|||
|
|
)
|
|||
|
|
print(f"✅ 小红书账号: {xhs_account.platform.value}/{xhs_account.username}")
|
|||
|
|
|
|||
|
|
douyin_account = AccountInfo(
|
|||
|
|
platform=PlatformType.DOUYIN,
|
|||
|
|
username="my_douyin_account",
|
|||
|
|
cookie_file="my_douyin_account.json"
|
|||
|
|
)
|
|||
|
|
print(f"✅ 抖音账号: {douyin_account.platform.value}/{douyin_account.username}")
|
|||
|
|
|
|||
|
|
# 3. 测试内容验证逻辑
|
|||
|
|
print(f"\n✅ 3. 测试内容验证")
|
|||
|
|
|
|||
|
|
def validate_content(content, platform):
|
|||
|
|
"""基础内容验证"""
|
|||
|
|
errors = []
|
|||
|
|
|
|||
|
|
if not content.title.strip():
|
|||
|
|
errors.append("标题不能为空")
|
|||
|
|
elif len(content.title) > 100:
|
|||
|
|
errors.append("标题过长")
|
|||
|
|
|
|||
|
|
if not content.description.strip():
|
|||
|
|
errors.append("描述不能为空")
|
|||
|
|
elif len(content.description) > 1000:
|
|||
|
|
errors.append("描述过长")
|
|||
|
|
|
|||
|
|
if isinstance(content, ImageNote):
|
|||
|
|
if not content.images:
|
|||
|
|
errors.append("图文笔记必须包含图片")
|
|||
|
|
elif len(content.images) > 9:
|
|||
|
|
errors.append("图片数量不能超过9张")
|
|||
|
|
|
|||
|
|
elif isinstance(content, VideoContent):
|
|||
|
|
if not content.video_path:
|
|||
|
|
errors.append("视频路径不能为空")
|
|||
|
|
|
|||
|
|
return errors
|
|||
|
|
|
|||
|
|
# 验证图文笔记
|
|||
|
|
note_errors = validate_content(note, PlatformType.XIAOHONGSHU)
|
|||
|
|
print(f"✅ 图文笔记验证: {'通过' if not note_errors else f'失败 - {note_errors}'}")
|
|||
|
|
|
|||
|
|
# 验证视频内容
|
|||
|
|
video_errors = validate_content(video, PlatformType.DOUYIN)
|
|||
|
|
print(f"✅ 视频内容验证: {'通过' if not video_errors else f'失败 - {video_errors}'}")
|
|||
|
|
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
async def test_playwright_basic():
|
|||
|
|
"""测试Playwright基础功能"""
|
|||
|
|
print(f"\n🌐 4. 测试Playwright基础功能")
|
|||
|
|
|
|||
|
|
try:
|
|||
|
|
from playwright.async_api import async_playwright
|
|||
|
|
|
|||
|
|
async with async_playwright() as p:
|
|||
|
|
print("✅ Playwright启动成功")
|
|||
|
|
|
|||
|
|
# 创建浏览器实例(有头模式用于演示)
|
|||
|
|
browser = await p.chromium.launch(headless=False)
|
|||
|
|
print("✅ Chromium浏览器启动成功")
|
|||
|
|
|
|||
|
|
# 创建页面
|
|||
|
|
page = await browser.new_page()
|
|||
|
|
print("✅ 新页面创建成功")
|
|||
|
|
|
|||
|
|
# 测试基本导航
|
|||
|
|
await page.goto("https://www.baidu.com")
|
|||
|
|
title = await page.title()
|
|||
|
|
print(f"✅ 页面导航成功: {title}")
|
|||
|
|
|
|||
|
|
# 获取截图(可选)
|
|||
|
|
try:
|
|||
|
|
await page.screenshot(path="demo_screenshot.png")
|
|||
|
|
print("✅ 截图保存成功: demo_screenshot.png")
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"⚠️ 截图保存失败: {e}")
|
|||
|
|
|
|||
|
|
# 关闭浏览器
|
|||
|
|
await browser.close()
|
|||
|
|
print("✅ 浏览器关闭成功")
|
|||
|
|
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
except ImportError:
|
|||
|
|
print("❌ Playwright未安装")
|
|||
|
|
return False
|
|||
|
|
except Exception as e:
|
|||
|
|
print(f"❌ Playwright测试失败: {e}")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
def test_file_preparation():
|
|||
|
|
"""测试文件准备"""
|
|||
|
|
print(f"\n📁 5. 测试文件准备")
|
|||
|
|
|
|||
|
|
# 创建必要的目录
|
|||
|
|
dirs_to_create = [
|
|||
|
|
"media/images",
|
|||
|
|
"media/videos",
|
|||
|
|
"auth/cookies/xiaohongshu",
|
|||
|
|
"auth/cookies/douyin",
|
|||
|
|
"logs"
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
created_dirs = []
|
|||
|
|
for dir_path in dirs_to_create:
|
|||
|
|
path = Path(dir_path)
|
|||
|
|
if not path.exists():
|
|||
|
|
path.mkdir(parents=True, exist_ok=True)
|
|||
|
|
created_dirs.append(dir_path)
|
|||
|
|
print(f"✅ 创建目录: {dir_path}")
|
|||
|
|
else:
|
|||
|
|
print(f"✅ 目录已存在: {dir_path}")
|
|||
|
|
|
|||
|
|
# 创建测试文件
|
|||
|
|
test_files = [
|
|||
|
|
("media/images/test_image.jpg", "测试图片文件"),
|
|||
|
|
("media/videos/test_video.mp4", "测试视频文件")
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
created_files = []
|
|||
|
|
for file_path, description in test_files:
|
|||
|
|
path = Path(file_path)
|
|||
|
|
if not path.exists():
|
|||
|
|
# 创建一个占位文件
|
|||
|
|
path.touch()
|
|||
|
|
created_files.append(file_path)
|
|||
|
|
print(f"✅ 创建占位文件: {file_path} ({description})")
|
|||
|
|
else:
|
|||
|
|
print(f"✅ 文件已存在: {file_path}")
|
|||
|
|
|
|||
|
|
return True
|
|||
|
|
|
|||
|
|
async def main():
|
|||
|
|
"""主测试函数"""
|
|||
|
|
print("🎭 社交媒体自动发布器 - 功能演示测试")
|
|||
|
|
print("📋 这个测试不会实际发布任何内容,只测试基础功能")
|
|||
|
|
print("=" * 60)
|
|||
|
|
|
|||
|
|
success = True
|
|||
|
|
|
|||
|
|
# 1. 基础功能测试
|
|||
|
|
if not test_basic_functionality():
|
|||
|
|
success = False
|
|||
|
|
|
|||
|
|
# 2. 文件准备测试
|
|||
|
|
if not test_file_preparation():
|
|||
|
|
success = False
|
|||
|
|
|
|||
|
|
# 3. Playwright测试
|
|||
|
|
playwright_success = await test_playwright_basic()
|
|||
|
|
if not playwright_success:
|
|||
|
|
print("⚠️ Playwright测试失败,但基础功能正常")
|
|||
|
|
|
|||
|
|
print("\n" + "=" * 60)
|
|||
|
|
if success:
|
|||
|
|
print("🎉 基础功能测试完成!")
|
|||
|
|
print("\n📝 接下来你可以:")
|
|||
|
|
print("1. 安装浏览器: playwright install chromium")
|
|||
|
|
print("2. 运行实际测试(需要扫码登录)")
|
|||
|
|
print("3. 开始使用项目进行内容发布")
|
|||
|
|
print("\n⚠️ 注意: 实际发布前请准备好真实的图片和视频文件")
|
|||
|
|
return True
|
|||
|
|
else:
|
|||
|
|
print("❌ 部分测试失败,请检查环境配置")
|
|||
|
|
return False
|
|||
|
|
|
|||
|
|
if __name__ == "__main__":
|
|||
|
|
# 运行测试
|
|||
|
|
result = asyncio.run(main())
|
|||
|
|
sys.exit(0 if result else 1)
|