commit
This commit is contained in:
230
backend/proxy_usage_example.py
Normal file
230
backend/proxy_usage_example.py
Normal file
@@ -0,0 +1,230 @@
|
||||
"""
|
||||
固定代理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 login_with_proxy(phone: str, code: str, proxy_index: int = 0):
|
||||
"""
|
||||
使用代理进行小红书登录
|
||||
|
||||
Args:
|
||||
phone: 手机号
|
||||
code: 验证码
|
||||
proxy_index: 代理索引 (0 或 1)
|
||||
"""
|
||||
print(f"\n{'='*60}")
|
||||
print(f"📱 使用代理登录小红书")
|
||||
print(f"{'='*60}")
|
||||
|
||||
# 获取代理配置
|
||||
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']}")
|
||||
|
||||
# 创建登录服务
|
||||
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("✅ 浏览器初始化成功(已启用代理)")
|
||||
|
||||
# 执行登录
|
||||
result = await login_service.login(phone, code)
|
||||
|
||||
if result.get('success'):
|
||||
print("✅ 登录成功!")
|
||||
|
||||
# 保存Cookies到文件
|
||||
cookies_full = result.get('cookies_full', [])
|
||||
if cookies_full:
|
||||
with open('cookies_proxy.json', 'w', encoding='utf-8') as f:
|
||||
json.dump(cookies_full, f, ensure_ascii=False, indent=2)
|
||||
print("✅ 已保存登录Cookies到 cookies_proxy.json")
|
||||
|
||||
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)}
|
||||
finally:
|
||||
await login_service.close_browser()
|
||||
|
||||
|
||||
async def publish_with_proxy(title: str, content: str, images: list = None, tags: list = None, proxy_index: int = 0, cookies_file: str = 'cookies.json'):
|
||||
"""
|
||||
使用代理发布小红书笔记
|
||||
|
||||
Args:
|
||||
title: 笔记标题
|
||||
content: 笔记内容
|
||||
images: 图片路径列表
|
||||
tags: 标签列表
|
||||
proxy_index: 代理索引 (0 或 1)
|
||||
cookies_file: Cookies文件路径
|
||||
"""
|
||||
print(f"\n{'='*60}")
|
||||
print(f"📝 使用代理发布小红书笔记")
|
||||
print(f"{'='*60}")
|
||||
|
||||
# 获取代理配置
|
||||
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']}")
|
||||
|
||||
# 读取Cookies
|
||||
try:
|
||||
with open(cookies_file, 'r', encoding='utf-8') as f:
|
||||
cookies = json.load(f)
|
||||
print(f"✅ 成功读取Cookies: {len(cookies)} 个")
|
||||
except FileNotFoundError:
|
||||
print(f"❌ Cookies文件不存在: {cookies_file}")
|
||||
return {"success": False, "error": f"Cookies文件不存在: {cookies_file}"}
|
||||
except Exception as e:
|
||||
print(f"❌ 读取Cookies失败: {str(e)}")
|
||||
return {"success": False, "error": str(e)}
|
||||
|
||||
# 准备发布数据
|
||||
images = images or []
|
||||
tags = tags or []
|
||||
|
||||
print(f"📝 发布内容:")
|
||||
print(f" 标题: {title}")
|
||||
print(f" 内容: {content[:50]}...") # 只显示前50个字符
|
||||
print(f" 图片: {len(images)} 张")
|
||||
print(f" 标签: {tags}")
|
||||
|
||||
# 创建发布服务
|
||||
try:
|
||||
publisher = XHSPublishService(cookies, proxy=proxy_url)
|
||||
|
||||
# 执行发布
|
||||
result = await publisher.publish(
|
||||
title=title,
|
||||
content=content,
|
||||
images=images,
|
||||
tags=tags
|
||||
)
|
||||
|
||||
if result.get('success'):
|
||||
print("✅ 发布成功!")
|
||||
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_proxy_functionality():
|
||||
"""测试代理功能的完整流程"""
|
||||
print("🚀 开始测试代理功能完整流程")
|
||||
|
||||
# 1. 测试代理连接
|
||||
print(f"\n{'-'*40}")
|
||||
print("1. 测试代理连接...")
|
||||
|
||||
for i in range(2):
|
||||
proxy_config = get_proxy_config(i)
|
||||
proxy_server = proxy_config['server'].replace('http://', '')
|
||||
proxy_url = f"http://{proxy_config['username']}:{proxy_config['password']}@{proxy_server}"
|
||||
|
||||
print(f" 代理{i+1}: {proxy_config['server']} - {proxy_url}")
|
||||
|
||||
# 2. 演示如何使用代理登录(仅展示,不实际执行)
|
||||
print(f"\n{'-'*40}")
|
||||
print("2. 代理登录示例(代码演示)...")
|
||||
print("""
|
||||
# 登录示例代码:
|
||||
async def example_login():
|
||||
result = await login_with_proxy(
|
||||
phone="你的手机号", # 实际手机号
|
||||
code="验证码", # 实际验证码
|
||||
proxy_index=0 # 使用代理1
|
||||
)
|
||||
return result
|
||||
""")
|
||||
|
||||
# 3. 演示如何使用代理发布(仅展示,不实际执行)
|
||||
print(f"\n{'-'*40}")
|
||||
print("3. 代理发布示例(代码演示)...")
|
||||
print("""
|
||||
# 发布示例代码:
|
||||
async def example_publish():
|
||||
result = await publish_with_proxy(
|
||||
title="测试标题",
|
||||
content="测试内容",
|
||||
images=["图片路径1", "图片路径2"], # 可选
|
||||
tags=["标签1", "标签2"], # 可选
|
||||
proxy_index=1, # 使用代理2
|
||||
cookies_file="cookies.json" # Cookies文件路径
|
||||
)
|
||||
return result
|
||||
""")
|
||||
|
||||
# 4. 代理轮换策略
|
||||
print(f"\n{'-'*40}")
|
||||
print("4. 代理轮换策略...")
|
||||
print("""
|
||||
# 代理轮换示例:
|
||||
class ProxyManager:
|
||||
def __init__(self):
|
||||
self.current_proxy = 0
|
||||
|
||||
def get_next_proxy(self):
|
||||
proxy_config = get_proxy_config(self.current_proxy)
|
||||
self.current_proxy = (self.current_proxy + 1) % 2 # 循环使用两个代理
|
||||
return proxy_config
|
||||
""")
|
||||
|
||||
print(f"\n{'-'*40}")
|
||||
print("✅ 代理功能演示完成!")
|
||||
|
||||
|
||||
def main():
|
||||
"""主函数"""
|
||||
print("="*60)
|
||||
print("🎯 固定代理IP下小红书登录发文功能示例")
|
||||
print("="*60)
|
||||
|
||||
# 运行测试
|
||||
asyncio.run(test_proxy_functionality())
|
||||
|
||||
print(f"\n{'='*60}")
|
||||
print("💡 使用说明:")
|
||||
print(" 1. 使用 login_with_proxy() 函数进行带代理的登录")
|
||||
print(" 2. 使用 publish_with_proxy() 函数进行带代理的发布")
|
||||
print(" 3. 可以轮换使用两个代理IP以提高稳定性")
|
||||
print(" 4. 代理配置在 damai_proxy_config.py 中管理")
|
||||
print("="*60)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
# Windows环境下设置事件循环策略
|
||||
if sys.platform == 'win32':
|
||||
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
|
||||
|
||||
main()
|
||||
Reference in New Issue
Block a user