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

219 lines
8.2 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

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.

"""
固定代理IP下小红书登录发文功能测试脚本
测试使用固定代理IP进行小红书登录和发文功能
"""
import asyncio
import json
import sys
from xhs_login import XHSLoginService
from xhs_publish import XHSPublishService
from damai_proxy_config import get_proxy_config
async def test_login_with_proxy(proxy_index: int = 0):
"""使用指定代理测试小红书登录"""
print(f"\n{'='*60}")
print(f"🔍 开始测试代理登录: 代理{proxy_index + 1}")
print(f"{'='*60}")
# 获取代理配置
try:
proxy_config = get_proxy_config(proxy_index)
proxy_url = f"http://{proxy_config['username']}:{proxy_config['password']}@{proxy_config['server'][7:]}" # 移除http://前缀再重新组装
print(f"✅ 获取代理配置成功: 代理{proxy_index + 1}")
print(f" 代理服务器: {proxy_config['server']}")
except Exception as e:
print(f"❌ 获取代理配置失败: {str(e)}")
return None
# 创建登录服务实例
login_service = XHSLoginService()
try:
# 初始化浏览器(使用代理)
print(f"\n🚀 正在启动浏览器(使用代理)...")
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📍 访问小红书创作者平台...")
await login_service.page.goto('https://creator.xiaohongshu.com/login', wait_until='networkidle', timeout=30000)
await asyncio.sleep(2)
title = await login_service.page.title()
url = login_service.page.url
print(f"✅ 访问成功")
print(f" 页面标题: {title}")
print(f" 当前URL: {url}")
# 检查是否被代理拦截或出现验证码
content = await login_service.page.content()
if "验证" in content or "captcha" in content.lower() or "block" in content.lower():
print("⚠️ 检测到可能的验证或拦截")
print(f"\n✅ 代理{proxy_index + 1} 连接测试完成")
return login_service
except Exception as e:
print(f"❌ 代理{proxy_index + 1} 测试失败: {str(e)}")
import traceback
traceback.print_exc()
return None
finally:
# 注意:这里不关闭浏览器,让调用者决定何时关闭
pass
async def test_publish_with_proxy(cookies, proxy_index: int = 0):
"""使用指定代理测试小红书发文"""
print(f"\n{'='*60}")
print(f"📝 开始测试代理发文: 代理{proxy_index + 1}")
print(f"{'='*60}")
# 获取代理配置
try:
proxy_config = get_proxy_config(proxy_index)
proxy_url = f"http://{proxy_config['username']}:{proxy_config['password']}@{proxy_config['server'][7:]}" # 移除http://前缀再重新组装
print(f"✅ 获取代理配置成功: 代理{proxy_index + 1}")
print(f" 代理服务器: {proxy_config['server']}")
except Exception as e:
print(f"❌ 获取代理配置失败: {str(e)}")
return None
# 准备测试数据
title = "【代理测试】固定IP代理发布测试"
content = """这是一条通过固定IP代理发布的测试笔记 📝
测试内容:
- 验证代理IP是否正常工作
- 检查发布功能是否正常
- 确认网络连接稳定性
如果你看到这条笔记,说明代理发布成功了!
#代理测试 #自动化发布 #网络测试"""
# 测试图片(可选)
images = [] # 可以添加图片路径进行测试
# 标签
tags = ["代理测试", "自动化发布", "网络测试"]
try:
# 创建发布服务
print(f"\n🚀 创建发布服务(使用代理: 代理{proxy_index + 1}...")
publisher = XHSPublishService(cookies, proxy=proxy_url)
# 执行发布
print(f"\n📤 开始发布笔记...")
result = await publisher.publish(
title=title,
content=content,
images=images if images else None,
tags=tags
)
# 显示结果
print(f"\n{'='*50}")
print("发布结果:")
print(json.dumps(result, ensure_ascii=False, indent=2))
print("="*50)
if result.get('success'):
print(f"\n✅ 代理{proxy_index + 1} 发布测试成功!")
if 'url' in result:
print(f"📎 笔记链接: {result['url']}")
else:
print(f"\n❌ 代理{proxy_index + 1} 发布测试失败: {result.get('error')}")
return result
except Exception as e:
print(f"❌ 代理{proxy_index + 1} 发布测试异常: {str(e)}")
import traceback
traceback.print_exc()
return None
async def main():
"""主测试函数"""
print("\n" + "="*60)
print("🎯 固定代理IP下小红书登录发文功能测试")
print("="*60)
# 测试代理连接
login_service = None
for i in range(2): # 测试两个代理
login_service = await test_login_with_proxy(i)
if login_service:
print(f"✅ 代理{i+1} 连接测试成功,可以用于后续操作")
break
else:
print(f"⚠️ 代理{i+1} 连接测试失败,尝试下一个代理...")
if not login_service:
print("\n❌ 所有代理都无法连接,测试终止")
return
try:
# 验证登录状态虽然我们没有真正的登录但可以检查Cookie是否有效
print(f"\n🔍 验证当前浏览器状态...")
verify_result = await login_service.verify_login_status()
print(f"验证结果: {verify_result.get('message', '未知状态')}")
except Exception as e:
print(f"验证状态时出错: {str(e)}")
# 如果有cookies.json文件可以尝试使用已保存的cookies进行发布测试
cookies = None
try:
with open('cookies.json', 'r', encoding='utf-8') as f:
cookies = json.load(f)
print(f"\n✅ 成功读取 cookies.json包含 {len(cookies)} 个Cookie")
except FileNotFoundError:
print(f"\n⚠️ cookies.json 文件不存在,跳过发布测试")
print(" 如需测试发布功能请先登录获取Cookie")
if cookies:
# 使用第一个有效的代理进行发布测试
for i in range(2):
proxy_config = get_proxy_config(i)
proxy_url = f"http://{proxy_config['username']}:{proxy_config['password']}@{proxy_config['server'][7:]}"
# 测试代理连接
temp_login = 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 temp_login.init_browser(cookies=cookies, proxy=proxy_url, user_agent=user_agent)
# 验证登录状态
verify_result = await temp_login.verify_login_status()
if verify_result.get('logged_in'):
print(f"\n✅ 代理{i+1} + Cookie 组合验证成功,开始发布测试")
await test_publish_with_proxy(cookies, i)
break
else:
print(f"⚠️ 代理{i+1} + Cookie 组合验证失败")
except Exception as e:
print(f"⚠️ 代理{i+1} 连接测试失败: {str(e)}")
finally:
await temp_login.close_browser()
else:
print("\n❌ 所有代理都无法与Cookie配合使用发布测试终止")
# 清理资源
if login_service:
await login_service.close_browser()
print(f"\n{'='*60}")
print("🎉 测试完成!")
print("="*60)
if __name__ == "__main__":
# Windows环境下设置事件循环策略
if sys.platform == 'win32':
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
# 运行测试
asyncio.run(main())