commit
This commit is contained in:
230
backend/verify_proxy_usage.py
Normal file
230
backend/verify_proxy_usage.py
Normal file
@@ -0,0 +1,230 @@
|
||||
"""
|
||||
Playwright代理IP验证脚本
|
||||
验证Playwright浏览器是否使用了代理IP而不是本机IP
|
||||
"""
|
||||
import asyncio
|
||||
from playwright.async_api import async_playwright
|
||||
import requests
|
||||
import json
|
||||
|
||||
|
||||
async def get_my_ip_requests():
|
||||
"""使用requests获取当前IP(不使用代理)"""
|
||||
try:
|
||||
response = requests.get('http://httpbin.org/ip', timeout=10)
|
||||
if response.status_code == 200:
|
||||
data = response.json()
|
||||
return data.get('origin', 'Unknown')
|
||||
except Exception as e:
|
||||
print(f"获取本机IP失败: {str(e)}")
|
||||
return None
|
||||
|
||||
|
||||
async def get_browser_ip_via_playwright(proxy_url=None):
|
||||
"""使用Playwright获取IP,可选择是否使用代理"""
|
||||
try:
|
||||
async with async_playwright() as p:
|
||||
# 启动浏览器
|
||||
launch_kwargs = {
|
||||
"headless": True, # 无头模式
|
||||
}
|
||||
|
||||
# 如果提供了代理,则使用代理
|
||||
if proxy_url:
|
||||
launch_kwargs["proxy"] = {"server": proxy_url}
|
||||
|
||||
browser = await p.chromium.launch(**launch_kwargs)
|
||||
context = await browser.new_context()
|
||||
page = await context.new_page()
|
||||
|
||||
# 访问IP检测网站
|
||||
await page.goto('http://httpbin.org/ip', wait_until='networkidle', timeout=10000)
|
||||
|
||||
# 获取页面内容
|
||||
content = await page.content()
|
||||
|
||||
# 关闭浏览器
|
||||
await browser.close()
|
||||
|
||||
# 解析IP信息
|
||||
try:
|
||||
import re
|
||||
import json
|
||||
# 查找JSON内容
|
||||
json_match = re.search(r'\{.*\}', content, re.DOTALL)
|
||||
if json_match:
|
||||
ip_data = json.loads(json_match.group())
|
||||
return ip_data.get('origin', 'Unknown')
|
||||
except:
|
||||
pass
|
||||
|
||||
return 'Parse Error'
|
||||
|
||||
except Exception as e:
|
||||
print(f"通过Playwright获取IP失败: {str(e)}")
|
||||
return None
|
||||
|
||||
|
||||
async def verify_proxy_usage():
|
||||
"""验证代理IP使用情况"""
|
||||
print("="*60)
|
||||
print("🔍 Playwright代理IP使用验证")
|
||||
print("="*60)
|
||||
|
||||
# 1. 获取本机IP
|
||||
print("\n1️⃣ 获取本机IP地址...")
|
||||
local_ip = await get_my_ip_requests()
|
||||
if local_ip:
|
||||
print(f" ✅ 本机IP: {local_ip}")
|
||||
else:
|
||||
print(" ❌ 无法获取本机IP")
|
||||
return
|
||||
|
||||
# 2. 测试不使用代理时的IP
|
||||
print("\n2️⃣ 测试不使用代理时的IP...")
|
||||
browser_ip_no_proxy = await get_browser_ip_via_playwright()
|
||||
print(f" 🌐 Playwright无代理IP: {browser_ip_no_proxy}")
|
||||
|
||||
# 3. 测试使用代理时的IP
|
||||
print("\n3️⃣ 测试使用代理时的IP...")
|
||||
|
||||
# 从代理配置中获取代理信息
|
||||
from damai_proxy_config import get_proxy_config
|
||||
|
||||
for i in range(2):
|
||||
try:
|
||||
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']}")
|
||||
|
||||
# 获取使用代理时的IP
|
||||
browser_ip_with_proxy = await get_browser_ip_via_playwright(proxy_url)
|
||||
print(f" 🌐 Playwright使用代理{i+1}的IP: {browser_ip_with_proxy}")
|
||||
|
||||
# 比较IP地址
|
||||
if browser_ip_with_proxy == local_ip:
|
||||
print(f" ❌ 代理{i+1}测试失败: IP与本机IP相同,代理未生效")
|
||||
elif browser_ip_with_proxy == proxy_server.split(':')[0]: # 检查是否是代理服务器IP
|
||||
print(f" ✅ 代理{i+1}测试成功: 使用了代理IP")
|
||||
elif browser_ip_with_proxy != 'Parse Error' and browser_ip_with_proxy != local_ip:
|
||||
print(f" ✅ 代理{i+1}测试成功: IP已改变,代理生效")
|
||||
else:
|
||||
print(f" ⚠️ 代理{i+1}测试结果不确定: {browser_ip_with_proxy}")
|
||||
|
||||
except Exception as e:
|
||||
print(f" ❌ 代理{i+1}测试出错: {str(e)}")
|
||||
|
||||
print() # 空行分隔
|
||||
|
||||
|
||||
async def advanced_proxy_verification():
|
||||
"""高级代理验证 - 使用多个IP检测服务"""
|
||||
print("="*60)
|
||||
print("🔬 高级代理IP验证")
|
||||
print("="*60)
|
||||
|
||||
# IP检测服务列表
|
||||
ip_services = [
|
||||
'http://httpbin.org/ip',
|
||||
'https://api.ipify.org?format=json',
|
||||
'https://jsonip.com',
|
||||
'https://httpbin.org/ip'
|
||||
]
|
||||
|
||||
from damai_proxy_config import get_proxy_config
|
||||
|
||||
for i in range(2):
|
||||
try:
|
||||
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"\n📊 验证代理 {i+1}: {proxy_config['server']}")
|
||||
print("-" * 50)
|
||||
|
||||
async with async_playwright() as p:
|
||||
launch_kwargs = {"headless": True, "proxy": {"server": proxy_url}}
|
||||
browser = await p.chromium.launch(**launch_kwargs)
|
||||
context = await browser.new_context()
|
||||
page = await context.new_page()
|
||||
|
||||
for service in ip_services:
|
||||
try:
|
||||
print(f" 正在测试: {service}")
|
||||
await page.goto(service, wait_until='networkidle', timeout=10000)
|
||||
content = await page.content()
|
||||
|
||||
# 尝试解析IP
|
||||
import re
|
||||
import json
|
||||
json_match = re.search(r'\{.*\}', content, re.DOTALL)
|
||||
if json_match:
|
||||
try:
|
||||
data = json.loads(json_match.group())
|
||||
ip = data.get('origin') or data.get('ip') or 'Unknown'
|
||||
print(f" ✅ {service}: {ip}")
|
||||
except:
|
||||
print(f" ❌ {service}: JSON解析失败")
|
||||
else:
|
||||
print(f" ❌ {service}: 未找到JSON数据")
|
||||
except Exception as e:
|
||||
print(f" ❌ {service}: {str(e)}")
|
||||
|
||||
await browser.close()
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ 代理{i+1}高级验证失败: {str(e)}")
|
||||
|
||||
|
||||
def show_proxy_format():
|
||||
"""显示代理格式"""
|
||||
print("="*60)
|
||||
print("🔧 Playwright代理格式参考")
|
||||
print("="*60)
|
||||
|
||||
from damai_proxy_config import get_proxy_config
|
||||
|
||||
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"\n代理{i+1}:")
|
||||
print(f" 原始地址: {proxy_config['server']}")
|
||||
print(f" 用户名: {proxy_config['username']}")
|
||||
print(f" 密码: {proxy_config['password']}")
|
||||
print(f" Playwright格式: {proxy_url}")
|
||||
print(f" 使用示例:")
|
||||
print(f" browser = await playwright.chromium.launch(")
|
||||
print(f" proxy={{'server': '{proxy_url}'}}")
|
||||
print(f" )")
|
||||
|
||||
|
||||
async def main():
|
||||
"""主函数"""
|
||||
# 显示代理格式
|
||||
show_proxy_format()
|
||||
|
||||
print("\n" + "="*60)
|
||||
|
||||
# 基础验证
|
||||
await verify_proxy_usage()
|
||||
|
||||
# 高级验证(可选,可能会比较耗时)
|
||||
user_input = input("\n是否进行高级验证? 这将测试多个IP服务 (y/N): ")
|
||||
if user_input.lower() == 'y':
|
||||
await advanced_proxy_verification()
|
||||
|
||||
print(f"\n{'='*60}")
|
||||
print("✅ 验证完成!")
|
||||
print("="*60)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
import sys
|
||||
if sys.platform == 'win32':
|
||||
asyncio.set_event_loop_policy(asyncio.WindowsProactorEventLoopPolicy())
|
||||
|
||||
asyncio.run(main())
|
||||
Reference in New Issue
Block a user