You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 Captcha
  • Reverse tunnel for API Captcha verification
  • Browser 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 10:07:31