# 位置自动匹配功能说明

## 功能概述

当启用代理发布时，系统会自动使用代理所在地区作为发布位置，避免账号地区与发布位置不一致触发风控。

## 实现方式

### 1. 自动提取代理地区

```python
# 在 app.py 中
if proxy_payload.get('enabled'):
    proxy_city = proxy_payload.get('city', '').strip()
    if proxy_city:
        location = proxy_city  # 自动设置为代理地区
```

### 2. 传递给发布器

```python
params = PublishParams(
    title=title,
    video_path=video_path,
    location=location  # 使用代理地区
)
```

### 3. 设置位置（微信视频号）

```python
# 在 weixin.py 的 add_title_tags 方法中
if params.location:
    await self.set_location(params.location)
```

## 使用方法

### 方式 1: 自动从代理配置提取（推荐）

```json
POST /publish/ai-assisted
{
  "platform": "weixin",
  "proxy": {
    "enabled": true,
    "provider": "shenlong",
    "productKey": "xxx",
    "signature": "xxx",
    "regionCode": "310000",
    "city": "上海"  // ← 自动使用这个
  }
}
```

**系统会自动：**
1. 提取 `city` 字段
2. 设置为发布位置
3. 避免地区不一致

### 方式 2: 手动指定位置

```json
{
  "platform": "weixin",
  "location": "北京",  // ← 手动指定
  "proxy": {
    "enabled": true,
    ...
  }
}
```

## 优先级

1. **手动指定的 location** > **代理配置的 city** > **默认值（重庆市）**

## 注意事项

### 微信视频号位置设置

微信视频号发布页面的位置选择 UI 可能因版本/账号而异。当前实现了以下查找策略：

1. 查找位置输入框：
   - `input[placeholder*="位置"]`
   - `input[placeholder*="所在"]`
   - `input[placeholder*="地点"]`

2. 查找位置按钮：
   - `div:has-text("所在位置")`
   - `div:has-text("添加位置")`

3. 输入并选择：
   - 填充位置名称
   - 等待建议出现
   - 选择匹配项

### 如果位置未生效

1. **检查代理配置**：
   ```json
   {
     "proxy": {
       "city": "上海"  // 确保这个字段存在
     }
   }
   ```

2. **查看日志**：
   ```
   [weixin] 准备设置位置: 上海
   [weixin] 正在设置位置: 上海
   [weixin] 找到位置元素: xxx
   [weixin] ✓ 位置设置成功: 上海
   ```

3. **手动指定位置**：
   ```json
   {
     "location": "上海"  // 手动指定
   }
   ```

## 调试建议

### 查看完整日志

```bash
# 启动服务时禁用缓冲
PYTHONUNBUFFERED=1 python app.py --headless false
```

### 检查截图

发布完成后的截图会显示最终的位置设置状态。

### 有头模式观察

```json
{
  "headless": false  // 显示浏览器窗口
}
```

在浏览器窗口中观察位置设置过程。

## 已知问题

### 1. 微信视频号位置UI变化

如果微信更新了发布页面UI，位置选择器可能失效。

**解决方法**：更新 `weixin.py` 中的 `set_location` 方法的选择器列表。

### 2. 位置建议不匹配

如果输入的位置没有精确匹配的建议项，系统会尝试选择第一个建议。

**解决方法**：使用标准城市名称（如"上海"而非"上海市"）。

## 测试验证

### 测试脚本

```javascript
const response = await fetch('http://localhost:5005/publish/ai-assisted', {
  method: 'POST',
  headers: {'Content-Type': 'application/json'},
  body: JSON.stringify({
    platform: 'weixin',
    proxy: {
      enabled: true,
      city: '上海'  // 测试自动匹配
    }
  })
});
```

### 预期结果

```
✅ 使用代理地区作为发布位置: 上海
✅ 准备设置位置: 上海
✅ 正在设置位置: 上海
✅ 找到位置元素
✅ 位置设置成功: 上海
```

## 其他平台

不同平台的位置设置方式不同：

- **抖音**: 需要单独实现
- **小红书**: 需要单独实现
- **快手**: 需要单独实现

如需支持其他平台，请在对应的 `platforms/xxx.py` 中实现 `set_location` 方法。
