""" 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())