# 微信公众号图文上传器使用说明

## 概述
微信公众号图文上传器支持自动化上传图片和视频到微信公众号，并自动填写标题、内容和标签。

## 功能特性
- ✅ 自动点击图文创作按钮
- ✅ 支持新页面和当前页面跳转
- ✅ 自动填写文章标题
- ✅ 自动填写内容和标签
- ✅ 支持图片和视频上传
- ✅ 智能识别透明上传按钮
- ✅ 自动发布文章
- ✅ Cookie自动管理

## 安装依赖

```bash
pip install playwright
pip install asyncio
playwright install chromium
```

## 使用方法

### 1. 获取微信公众号 Cookies

第一次使用时，程序会自动打开浏览器让您登录：

```python
from uploader.wechat_public_uploader.main import wechat_setup
import asyncio

async def get_cookies():
    account_file = "cookies/wechat_uploader/account.json"
    await wechat_setup(account_file, handle=True)

asyncio.run(get_cookies())
```

### 2. 基本使用示例

```python
import asyncio
from pathlib import Path
from datetime import datetime
from playwright.async_api import async_playwright
from uploader.wechat_public_uploader.main import WechatVideo, wechat_setup

async def upload_to_wechat():
    # Cookie 文件路径
    account_file = "cookies/wechat_uploader/account.json"
    
    # 确保 Cookie 有效
    if not await wechat_setup(account_file, handle=True):
        print("Cookie 设置失败")
        return
    
    # 创建上传对象
    wechat_video = WechatVideo(
        title="我的文章标题",
        file_path="videos/demo.png",  # 图片或视频路径
        tags=["标签1", "标签2", "标签3"],
        publish_date=datetime.now(),
        account_file=account_file,
        headless=False  # 推荐使用有头模式，避免反自动化检测
    )
    
    # 执行上传
    async with async_playwright() as playwright:
        await wechat_video.upload(playwright)

# 运行
asyncio.run(upload_to_wechat())
```

### 3. 参数说明

| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| title | str | 是 | 文章标题 |
| file_path | str | 是 | 图片或视频文件路径 |
| tags | list | 否 | 文章标签列表 |
| publish_date | datetime | 是 | 发布时间 |
| account_file | str | 是 | Cookie 文件路径 |
| thumbnail_path | str | 否 | 封面图片路径（暂未使用） |
| headless | bool | 否 | 是否使用无头模式，默认 True |

### 4. 无头模式说明

**无头模式 (headless=True)**：
- ✅ 优点：运行时不显示浏览器窗口，适合服务器环境
- ✅ 优点：运行速度更快，占用资源较少
- ❌ 缺点：**容易被微信公众号检测和阻止**
- ❌ 缺点：页面元素可能无法正确加载
- ⚠️ 缺点：调试时无法观察浏览器行为

**有头模式 (headless=False)**：
- ✅ 优点：可以观察浏览器操作过程，便于调试
- ✅ 优点：**避免反自动化检测，成功率更高**
- ✅ 优点：页面元素加载更稳定
- ⚠️ 缺点：需要图形界面环境
- ⚠️ 缺点：占用更多系统资源

**建议**：
- **微信公众号推荐使用 `headless=False`**（避免检测）
- 开发调试时使用 `headless=False`
- 如果必须使用无头模式，请先测试元素是否正常加载

### 5. 支持的文件格式

**图片格式：**
- JPG/JPEG
- PNG  
- GIF
- BMP

**视频格式：**
- MP4
- AVI
- MOV
- WMV

### 6. 完整示例

```python
# examples/upload_video_to_wechat.py

import asyncio
from pathlib import Path
from datetime import datetime, timedelta
from playwright.async_api import async_playwright
from uploader.wechat_public_uploader.main import wechat_setup, WechatVideo

async def batch_upload():
    """批量上传示例"""
    account_file = "cookies/wechat_uploader/account.json"
    
    # 确保登录
    if not await wechat_setup(account_file, handle=True):
        return
    
    # 定义上传列表
    upload_list = [
        {
            "title": "技术分享：如何使用Python自动化",
            "file_path": "videos/python_tutorial.mp4",
            "tags": ["Python", "自动化", "编程"],
        },
        {
            "title": "AI最新进展分享",
            "file_path": "videos/ai_news.png", 
            "tags": ["AI", "人工智能", "科技"],
        }
    ]
    
    async with async_playwright() as playwright:
        for item in upload_list:
            wechat_video = WechatVideo(
                title=item["title"],
                file_path=item["file_path"],
                tags=item["tags"],
                publish_date=datetime.now(),
                account_file=account_file
            )
            
            try:
                await wechat_video.upload(playwright)
                print(f"✅ 成功上传: {item['title']}")
                
                # 等待一段时间避免频繁操作
                await asyncio.sleep(30)
                
            except Exception as e:
                print(f"❌ 上传失败: {item['title']}, 错误: {e}")

if __name__ == '__main__':
    asyncio.run(batch_upload())
```

## 注意事项

1. **首次使用**：需要手动登录微信公众号获取 Cookie
2. **文件路径**：确保文件路径正确且文件存在
3. **网络环境**：需要稳定的网络连接
4. **频率控制**：避免频繁上传，建议间隔30秒以上
5. **Cookie有效期**：Cookie过期时会自动提示重新登录

## 故障排除

### 常见问题

**1. Cookie过期**
```
解决方案：重新运行 wechat_setup(account_file, handle=True)
```

**2. 文件上传失败**
```
检查项：
- 文件是否存在
- 文件格式是否支持  
- 文件大小是否符合要求
- 网络连接是否正常
```

**3. 无头模式下找不到页面元素/截图全黑**
```
原因：微信公众号具有反自动化检测机制，在无头模式下可能：
- 页面结构发生变化
- 关键元素被隐藏或动态加载失败
- 触发安全验证机制

解决方案：
- 推荐使用有头模式：headless=False
- 程序已添加反检测措施（User-Agent、浏览器参数等）
- 使用调试方法分析页面状态
- 如果必须使用无头模式，可尝试其他反检测技术
```

**4. 页面元素找不到**
```
原因：微信公众号页面结构变化
解决：等待作者更新选择器或手动调整
```

**5. 浏览器启动失败**
```bash
# 重新安装 playwright
playwright install chromium
```

## 更新日志

- **v1.0.0**: 基础功能实现
- **v1.1.0**: 支持新页面跳转检测
- **v1.2.0**: 优化透明按钮点击逻辑
- **v1.3.0**: 改进鼠标悬停机制

## 技术支持

如遇问题，请检查：
1. 依赖是否正确安装
2. 文件路径是否正确
3. Cookie是否有效
4. 网络连接是否正常

---

**提示**：本工具仅供学习和研究使用，请遵守微信公众号的使用条款。
