Puppeteer配置代理后IP查询网站仍显示真实IP的问题排查
Puppeteer代理在IP查询站失效的原因与修复方案
核心原因分析
请求拦截未正确处理
你开启了page.setRequestInterception(true)但未添加请求监听逻辑,导致所有网络请求被拦截后无法继续执行。这种情况下浏览器可能 fallback 到直接连接,从而暴露真实IP。代理类型不匹配
如果使用的是透明代理,whatismyipaddress这类IP查询站能通过HTTP头中的X-Forwarded-For获取你的真实IP,因此显示的不是代理IP。WebRTC IP泄露
Puppeteer默认允许WebRTC,即使浏览器级代理生效,WebRTC也可能绕过代理直接连接网络,泄露真实IP。IP查询站通常会检测WebRTC返回的IP。代理配置冲突
你导入了puppeteer-page-proxy但未实际使用,同时又通过--proxy-server配置浏览器级代理,可能存在潜在冲突,导致部分请求未走代理。
修复方案与代码调整
1. 修复请求拦截逻辑
开启请求拦截后必须监听request事件并调用request.continue(),确保请求正常走代理:
import puppeteer from "puppeteer-extra"; import Stealth from 'puppeteer-extra-plugin-stealth' import { executablePath } from "puppeteer"; puppeteer.use(Stealth()) async function main(url) { const proxy = 'http://135.181.40.86:8080'; const browser = await puppeteer.launch({ headless: false, defaultViewport: null , executablePath: executablePath() , args: [`--proxy-server=${proxy}`] }) const page = await browser.newPage() // 开启请求拦截后必须添加监听逻辑 await page.setRequestInterception(true); page.on('request', (request) => { request.continue(); // 确保请求正常执行 }); // 禁用WebRTC防止IP泄露 await page.evaluateOnNewDocument(() => { window.RTCPeerConnection = undefined; Object.defineProperty(navigator, 'webrtc', { get: () => undefined, }); }); await page.goto(url) await page.waitForTimeout(10000000) await browser.close() } main("https://www.whatismyipaddress.com/")
2. 更换为高匿代理
如果当前代理是透明/匿名代理,更换为高匿代理(Elite Proxy),这类代理不会在HTTP头中暴露真实IP,IP查询站只会显示代理IP。
3. 二选一使用代理配置
要么使用浏览器级的--proxy-server,要么使用puppeteer-page-proxy(需正确调用),避免两种方式混用。若选择puppeteer-page-proxy,可去掉--proxy-server参数,改为:
// 替换原page.goto相关代码 await useProxy(page, proxy); await page.goto(url);
内容的提问来源于stack exchange,提问作者geniar99s
相关产品推荐
相关产品推荐

