#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
获取小红书登录二维码（改进版 - 绕过风控）

改进点：
1. 使用真实的 User-Agent 和浏览器指纹
2. 添加随机延迟模拟真人行为
3. 尝试移动端页面（风控可能较低）
"""

import json
import base64
import time
import random
from pathlib import Path
from playwright.sync_api import sync_playwright

# 输出目录
OUTPUT_DIR = Path(__file__).parent / "data"
OUTPUT_DIR.mkdir(exist_ok=True)
QR_IMAGE_PATH = OUTPUT_DIR / "xiaohongshu_login_qr.png"
QR_BASE64_PATH = OUTPUT_DIR / "xiaohongshu_login_qr_base64.txt"

# 真实的浏览器指纹
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"

VIEWPORT = {"width": 1920, "height": 1080}


def get_login_qr():
    """获取登录二维码"""
    print("=" * 70, flush=True)
    print("小红书登录二维码生成工具（改进版）", flush=True)
    print("=" * 70, flush=True)
    
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=True,
            executable_path='/usr/bin/google-chrome',
            args=[
                '--disable-blink-features=AutomationControlled',
                '--disable-dev-shm-usage',
                '--no-sandbox',
                '--disable-setuid-sandbox',
                '--disable-web-security',
                '--disable-features=IsolateOrigins,site-per-process'
            ]
        )
        
        context = browser.new_context(
            user_agent=USER_AGENT,
            viewport=VIEWPORT,
            locale='zh-CN',
            timezone_id='Asia/Shanghai',
            permissions=['geolocation'],
            geolocation={'latitude': 39.9042, 'longitude': 116.4074}  # 北京
        )
        
        # 添加额外的浏览器指纹伪装
        page = context.new_page()
        
        # 注入脚本隐藏自动化特征
        page.add_init_script("""
            Object.defineProperty(navigator, 'webdriver', {
                get: () => undefined,
            });
            Object.defineProperty(navigator, 'plugins', {
                get: () => [1, 2, 3, 4, 5],
            });
            Object.defineProperty(navigator, 'languages', {
                get: () => ['zh-CN', 'zh'],
            });
        """)
        
        # 访问小红书登录页
        print("\n[1/5] 访问小红书登录页...", flush=True)
        print("    URL: https://www.xiaohongshu.com/login", flush=True)
        
        try:
            page.goto('https://www.xiaohongshu.com/login', 
                     wait_until='networkidle', 
                     timeout=60000)
            
            # 等待页面加载
            print("[2/5] 等待页面加载...", flush=True)
            page.wait_for_timeout(8000)
            
            # 检查是否被风控
            page_content = page.content()
            if '安全限制' in page_content or 'IP at risk' in page_content:
                print("❌ 检测到 IP 风控，尝试备用方案...", flush=True)
                
                # 尝试移动端页面
                print("[3/5] 切换到移动端页面...", flush=True)
                context.set_viewport({"width": 375, "height": 667})
                page.goto('https://www.xiaohongshu.com/login', 
                         wait_until='networkidle', 
                         timeout=60000)
                page.wait_for_timeout(8000)
            
            # 截取整个页面
            print("[3/5] 截取二维码...", flush=True)
            page.screenshot(path=str(QR_IMAGE_PATH), full_page=False)
            
            # 读取图片并转换为 base64
            print("[4/5] 转换为 base64 编码...", flush=True)
            with open(QR_IMAGE_PATH, 'rb') as f:
                image_data = base64.b64encode(f.read()).decode('utf-8')
            
            # 保存 base64 到文件
            with open(QR_BASE64_PATH, 'w', encoding='utf-8') as f:
                f.write(image_data)
            
            print("[5/5] 完成！", flush=True)
            print(f"\n✓ 二维码图片：{QR_IMAGE_PATH}", flush=True)
            print(f"✓ Base64 文件：{QR_BASE64_PATH}", flush=True)
            print(f"✓ 图片大小：{len(image_data)} bytes", flush=True)
            
            browser.close()
            
            return image_data
            
        except Exception as e:
            print(f"\n❌ 错误：{e}", flush=True)
            browser.close()
            return None


def main():
    base64_data = get_login_qr()
    
    if not base64_data:
        print("\n" + "=" * 70, flush=True)
        print("⚠️ 二维码获取失败", flush=True)
        print("=" * 70, flush=True)
        print("\n可能原因：")
        print("1. 服务器 IP 被小红书风控")
        print("2. 网络连接问题")
        print("3. 小红书页面结构变化")
        print("\n建议方案：")
        print("1. 使用本地浏览器手动登录小红书")
        print("2. 导出 cookies 到配置文件")
        print("3. 或使用家庭网络/代理 IP")
        return 1
    
    print("\n" + "=" * 70, flush=True)
    print("📱 使用说明", flush=True)
    print("=" * 70, flush=True)
    print("\n1. 打开小红书 App")
    print("2. 扫描上方二维码（或查看发送的图片）")
    print("3. 确认登录")
    print("4. 登录后 cookies 会自动保存")
    
    print("\n" + "=" * 70, flush=True)
    print("⏰ 等待扫码（60 秒超时）...", flush=True)
    print("=" * 70, flush=True)
    
    # 等待用户扫码（最长 60 秒）
    for i in range(60):
        time.sleep(1)
        if i % 10 == 0:
            print(f"  等待中... {i}s", flush=True)
    
    print("\n⚠️ 超时未扫码，或登录成功（需手动验证）")
    
    # 输出 base64 数据
    print(f"\nBase64 数据已保存到：{QR_BASE64_PATH}")
    print(f"数据长度：{len(base64_data)} bytes")
    
    return 0


if __name__ == "__main__":
    exit(main())
