""" 固定代理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())