219 lines
8.2 KiB
Python
219 lines
8.2 KiB
Python
|
|
"""
|
|||
|
|
固定代理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())
|