Files
ai_wht_wechat/backend/test_login_flow.py
2026-01-06 19:36:42 +08:00

261 lines
8.4 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""
小红书验证码登录流程测试脚本
测试完整的验证码发送和登录流程
"""
import asyncio
import sys
from xhs_login import XHSLoginService
async def test_send_verification_code(phone: str, proxy_index: int = 0):
"""
测试发送验证码流程
Args:
phone: 手机号
proxy_index: 代理索引 (0 或 1)
"""
print(f"\n{'='*60}")
print(f"📱 测试发送验证码流程")
print(f"{'='*60}")
# 从代理配置获取代理信息
from damai_proxy_config import get_proxy_config
proxy_config = get_proxy_config(proxy_index)
proxy_server = proxy_config['server'].replace('http://', '')
proxy_url = f"http://{proxy_config['username']}:{proxy_config['password']}@{proxy_server}"
print(f"✅ 使用代理: 代理{proxy_index + 1}")
print(f" 代理服务器: {proxy_config['server']}")
print(f" 手机号: {phone}")
# 创建登录服务
login_service = XHSLoginService()
try:
# 初始化浏览器(使用代理)
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'
await login_service.init_browser(proxy=proxy_url, user_agent=user_agent)
print("✅ 浏览器初始化成功(已启用代理)")
# 发送验证码
print(f"\n📤 正在发送验证码到 {phone}...")
result = await login_service.send_verification_code(phone)
if result.get('success'):
print(f"✅ 验证码发送成功!")
print(f" 消息: {result.get('message')}")
return login_service # 返回服务实例供后续登录使用
else:
print(f"❌ 验证码发送失败: {result.get('error')}")
return None
except Exception as e:
print(f"❌ 发送验证码过程异常: {str(e)}")
import traceback
traceback.print_exc()
return None
async def test_login_with_code(login_service: XHSLoginService, phone: str, code: str):
"""
测试使用验证码登录
Args:
login_service: XHSLoginService实例
phone: 手机号
code: 验证码
"""
print(f"\n{'='*60}")
print(f"🔑 测试使用验证码登录")
print(f"{'='*60}")
print(f" 手机号: {phone}")
print(f" 验证码: {code}")
try:
# 执行登录
result = await login_service.login(phone, code)
if result.get('success'):
print("✅ 登录成功!")
# 显示获取到的Cookies信息
cookies = result.get('cookies', {})
print(f" 获取到 {len(cookies)} 个Cookie")
# 保存完整Cookies到文件
cookies_full = result.get('cookies_full', [])
if cookies_full:
import json
with open('cookies.json', 'w', encoding='utf-8') as f:
json.dump(cookies_full, f, ensure_ascii=False, indent=2)
print(" ✅ 已保存完整Cookies到 cookies.json")
# 显示用户信息
user_info = result.get('user_info', {})
if user_info:
print(f" 用户信息: {list(user_info.keys())}")
return result
else:
print(f"❌ 登录失败: {result.get('error')}")
return result
except Exception as e:
print(f"❌ 登录过程异常: {str(e)}")
import traceback
traceback.print_exc()
return {"success": False, "error": str(e)}
async def test_complete_login_flow(phone: str, code: str = None, proxy_index: int = 0):
"""
测试完整的登录流程
Args:
phone: 手机号
code: 验证码如果为None则只测试发送验证码
proxy_index: 代理索引
"""
print("="*60)
print("🔄 测试完整登录流程")
print("="*60)
# 步骤1: 发送验证码
print("\n📋 步骤1: 发送验证码")
login_service = await test_send_verification_code(phone, proxy_index)
if not login_service:
print("❌ 发送验证码失败,终止流程")
return
# 如果提供了验证码,则执行登录
if code:
print("\n📋 步骤2: 使用验证码登录")
result = await test_login_with_code(login_service, phone, code)
if result.get('success'):
print("\n🎉 完整登录流程成功!")
else:
print(f"\n❌ 完整登录流程失败: {result.get('error')}")
else:
print("\n⚠️ 提供了验证码参数才可完成登录步骤")
print(" 请在手机上查看验证码,然后调用登录方法")
# 清理资源
await login_service.close_browser()
async def test_multiple_proxies_login(phone: str, proxy_indices: list = [0, 1]):
"""
测试使用多个代理进行登录
Args:
phone: 手机号
proxy_indices: 代理索引列表
"""
print("="*60)
print("🔄 测试多代理登录")
print("="*60)
for i, proxy_idx in enumerate(proxy_indices):
print(f"\n🧪 测试代理 {proxy_idx + 1} (第 {i+1} 次尝试)")
# 由于验证码只能发送一次,这里只测试发送验证码
login_service = await test_send_verification_code(phone, proxy_idx)
if login_service:
print(f" ✅ 代理 {proxy_idx + 1} 发送验证码成功")
await login_service.close_browser()
else:
print(f" ❌ 代理 {proxy_idx + 1} 发送验证码失败")
# 在测试之间添加延迟
if i < len(proxy_indices) - 1:
print(" ⏳ 等待3秒后测试下一个代理...")
await asyncio.sleep(3)
def show_usage_examples():
"""显示使用示例"""
print("="*60)
print("💡 使用示例")
print("="*60)
print("\n1⃣ 仅发送验证码:")
print(" # 发送验证码到手机号使用代理1")
print(" await test_send_verification_code('13800138000', proxy_index=0)")
print("\n2⃣ 完整登录流程:")
print(" # 完整流程:发送验证码 + 登录")
print(" await test_complete_login_flow('13800138000', '123456', proxy_index=0)")
print("\n3⃣ 多代理测试:")
print(" # 测试多个代理")
print(" await test_multiple_proxies_login('13800138000', [0, 1])")
async def main():
"""主函数"""
show_usage_examples()
print(f"\n{'='*60}")
print("🎯 选择测试模式")
print("="*60)
print("\n1. 发送验证码测试")
print("2. 完整登录流程测试")
print("3. 多代理测试")
try:
choice = input("\n请选择测试模式 (1-3, 默认为1): ").strip()
if choice not in ['1', '2', '3']:
choice = '1'
phone = input("请输入手机号: ").strip()
if not phone:
print("❌ 手机号不能为空")
return
if choice == '1':
proxy_choice = input("请选择代理 (0 或 1, 默认为0): ").strip()
if proxy_choice not in ['0', '1']:
proxy_choice = '0'
proxy_idx = int(proxy_choice)
await test_send_verification_code(phone, proxy_idx)
elif choice == '2':
code = input("请输入验证码 (留空则只测试发送): ").strip()
proxy_choice = input("请选择代理 (0 或 1, 默认为0): ").strip()
if proxy_choice not in ['0', '1']:
proxy_choice = '0'
proxy_idx = int(proxy_choice)
await test_complete_login_flow(phone, code if code else None, proxy_idx)
elif choice == '3':
await test_multiple_proxies_login(phone)
print(f"\n{'='*60}")
print("✅ 测试完成!")
print("="*60)
except KeyboardInterrupt:
print("\n\n⚠️ 测试被用户中断")
except Exception as e:
print(f"\n❌ 测试过程中出现错误: {str(e)}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
# Windows环境下设置事件循环策略
if sys.platform == 'win32':
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
# 运行测试
asyncio.run(main())