vServer因Path of Exile API请求超限被Cloudflare拦截,求验证方案
解决Path of Exile API触发Cloudflare拦截的问题
我在调用Path of Exile的外部API时,因为请求频率过高触发了上限,导致我的vServer被Cloudflare拦截了。现在访问这个API会出现「One more step Please complete the security check to access www.pathofexile.com」的提示,理论上会弹出Google Captcha,但服务器环境没有图形浏览器没法完成验证。我想知道:
- 最佳解决方案是什么?
- 是否可以通过隧道让本地浏览器模拟服务器访问?如果可行,相关搜索关键词有哪些?
- 有没有仅在控制台操作的简单方案?
- 用PHP脚本(比如通过
file_put_contents生成临时文件嵌入iframe并替换路径)处理的可行性如何?
下面是我当前使用的PHP代码:
$realm = "pc"; $league = "Standard"; $uiagent = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Ubuntu Chromium/32.0.1700.107 Chrome/32.0.1700.107 Safari/537.36'; $poeurl = 'https://www.pathofexile.com/character-window/get-stash-items?league=' . $league . '&realm=' . $realm . '&accountName=' . $_COOKIE["accountname"] . '&tabs=0&tabIndex=' . $_GET['no']; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $poeurl); curl_setopt($ch, CURLOPT_USERAGENT, $uiagent); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIESESSION, true); curl_setopt($ch, CURLOPT_COOKIEJAR, 'POESESSID'); curl_setopt($ch, CURLOPT_COOKIEFILE,'/var/www/vhosts/XXXXXXXXX.de/www/html/poe/cookie.txt'); curl_setopt($ch, CURLOPT_COOKIE, "POESESSID=b34637XXXXXXXXXXXXXXX"); curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/vhosts/XXXXXXXXX.de/www/html/poe/cookie.txt'); $answer = curl_exec($ch); if (curl_error($ch)) { echo curl_error($ch); } else { echo $answer; file_put_contents(getcwd() . "/cache/" . $_COOKIE["accountname"] . "/stash-" . $_GET['no'] . ".json", $answer); }
最佳解决方案分析
1. 优先解决:降低请求频率,合规调用API
Cloudflare的拦截本质是因为你的请求触发了反爬阈值,所以最根本的解决方案是严格遵守Path of Exile API的调用限制:
- 先查官方文档的请求频率限制(一般是每分钟最多若干次请求),在你的PHP代码里加入请求间隔控制,比如用
sleep()或者队列机制批量处理请求 - 检查是否可以使用官方的认证方式(比如API密钥),认证后的请求通常会有更高的阈值,也更容易被服务器识别为合法请求
2. 隧道转发让本地浏览器完成验证(可行)
如果你的vServer已经被IP封禁/拦截,确实可以通过隧道把API请求转发到本地浏览器,让本地完成Captcha验证后,把验证后的Cookie同步回服务器。相关搜索关键词:
SSH local port forwarding Cloudflare CaptchaReverse tunnel for API Captcha verificationBrowser proxy tunnel server-side API calls
具体思路:
- 在vServer上建立SSH本地端口转发,把API请求的端口映射到本地机器
- 本地浏览器访问映射后的地址,完成Captcha验证,此时浏览器会保存Cloudflare的验证Cookie
- 把本地浏览器的Cookie(主要是Cloudflare的
cf_clearance和相关会话Cookie)导出,同步到vServer的Cookie文件中,后续curl请求就可以带上这些验证过的Cookie
3. 控制台操作的简单方案
如果不想用图形浏览器,可以尝试以下控制台工具:
- 使用
curl配合cfscrape(Python库):cfscrape专门用来绕过Cloudflare的反爬验证,支持自动处理Captcha(需要额外的验证码服务,或者手动输入)。你可以在vServer上安装Python和cfscrape,编写简单的脚本获取API数据,再让PHP调用这个脚本的输出 - 使用无头浏览器:比如
puppeteer(Node.js)或者playwright,它们可以在控制台环境模拟浏览器行为,自动完成Captcha验证(部分简单验证可以自动过,复杂的可能需要手动介入)。相关关键词:puppeteer Cloudflare Captcha bypass
4. PHP脚本嵌入iframe方案的可行性
你提到的用file_put_contents生成临时HTML文件嵌入iframe的方式,仅在用户通过浏览器访问你的PHP页面时可行:
- 原理是让用户的本地浏览器加载iframe中的API地址,完成Captcha验证,然后把验证后的Cookie传递回你的PHP脚本
- 但这种方式的局限性很大:需要用户手动完成验证,而且只能处理当前用户的请求,无法解决服务器端批量调用API的问题
- 如果你的场景是给用户提供查询工具,这种方式可以临时救急,但不是长期解决方案
代码优化建议
针对你当前的PHP代码,有几个可以调整的地方:
- 你重复设置了
CURLOPT_COOKIEFILE两次,这是冗余的,只需要保留一次即可 CURLOPT_COOKIESESSION设为true会强制开启新的会话,可能导致之前的验证Cookie失效,建议改为false- 加入请求频率控制,比如在每次请求后加入
sleep(1),避免短时间内发送大量请求
优化后的代码片段:
// 加入请求间隔,避免触发阈值 sleep(1); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $poeurl); curl_setopt($ch, CURLOPT_USERAGENT, $uiagent); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIESESSION, false); // 保留会话Cookie curl_setopt($ch, CURLOPT_COOKIEJAR, '/var/www/vhosts/XXXXXXXXX.de/www/html/poe/cookie.txt'); curl_setopt($ch, CURLOPT_COOKIEFILE, '/var/www/vhosts/XXXXXXXXX.de/www/html/poe/cookie.txt'); // 不需要手动设置POESESSID,让cookie文件自动管理
内容的提问来源于stack exchange,提问作者Nerdpraxis
相关产品推荐
相关产品推荐

