# QR Code Endpoint Migration: Playwright → Requests

## Problem

The we-mp-rss QR code authorization was broken because:
1. Playwright was configured to use `webkit` but only `chromium` was installed
2. UUID was extracted from wrong place (cookies/headers instead of JSON body)
3. Race condition: `GetCode()` returned before the Playwright thread generated the QR image

## Solution: Migrate from Playwright to pure HTTP requests

### File: `apis/auth.py`

**Before (broken):**
```python
from driver.success import Success
from driver.wx_api import get_qr_code #通过API登录
from driver.wx import WX_API

@router.get("/qr/code")
async def get_qrcode(current_user=Depends(get_current_user)):
    code_url=WX_API.GetCode(Success)  # Playwright thread, race condition
    return success_response(code_url)

@router.get("/qr/image")
async def qr_image(current_user=Depends(get_current_user)):
    return success_response(WX_API.GetHasCode())

@router.get("/qr/status")
async def qr_status(current_user=Depends(get_current_user)):
    return success_response(WX_API.QrStatus())
```

**After (working):**
```python
from driver.success import Success
from driver.wx_api import get_qr_code, WeChat_api
from driver.wx import WX_API

@router.get("/qr/code")
async def get_qrcode(current_user=Depends(get_current_user)):
    result = get_qr_code(Success)
    code = result.get("code", "")
    if code:
        import re
        match = re.search(r'(/static/wx_qrcode\.png\?t=\d+(?:\.\d+)?)', code)
        if match:
            code = match.group(1)
    return success_response({
        "code": code,
        "is_exists": result.get("is_exists", False),
        "msg": result.get("msg", "")
    })

@router.get("/qr/image")
async def qr_image(current_user=Depends(get_current_user)):
    return success_response(WeChat_api.GetHasCode())

@router.get("/qr/status")
async def qr_status(current_user=Depends(get_current_user)):
    return success_response({
        "login_status": WeChat_api._islogin,
        "qr_code": WeChat_api.GetHasCode()
    })
```

### File: `driver/wx_api.py` — UUID fix

```python
# Line ~291, in start_login():
# Before:
uuid = response.cookies.get('uuid') or response.headers.get('X-UUID')

# After:
try:
    resp_json = response.json()
    uuid = resp_json.get('uuid')
    if not uuid:
        uuid = response.cookies.get('uuid') or response.headers.get('X-UUID')
except Exception:
    uuid = response.cookies.get('uuid') or response.headers.get('X-UUID')
```

### File: `driver/wx.py` — Browser type fix

```python
# In Wx.__init__():
# Before:
self.controller = PlaywrightController()  # defaults to webkit

# After:
browser_type = os.environ.get("BROWSER_TYPE", "chromium")
self.controller = PlaywrightController(browser_type=browser_type)
```

## Verification

```bash
# Start service
cd ~/project/we-mp-rss-main源文件/we-mp-rss-main && \
source venv/bin/activate && \
DB="sqlite:////home/agentuser/project/we-mp-rss-data/db.db" \
ENABLE_JOB=True PORT=8001 BROWSER_TYPE=chromium \
python main.py -job True

# Test QR code
TOKEN=$(curl -s -X POST 'http://localhost:8001/api/v1/wx/auth/login' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'username=admin&password=admin' | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['access_token'])")

curl -s "http://localhost:8001/api/v1/wx/auth/qr/code" \
  -H "Authorization: Bearer $TOKEN"
# Expected: {"data": {"is_exists": true, "code": "/static/wx_qrcode.png?t=..."}}
```
