php-curl遇到cloudflare"please wait"屏幕

php-curl encounters cloudflare "please wait" screen

我有一个用于外部站点的简单解析器,它需要确认 link 用户提交的内容指向该用户拥有的帐户(通过将 link 从 [=25] 解析到他们的个人资料=]编辑页面)。它仅使用这个 wordpress 功能就可以工作很长时间:

function fetch_body_url($fetch_link){
    $response = wp_remote_get($fetch_link, array('timeout' => 120));
    return wp_remote_retrieve_body($response);
}

但是后来该网站在他们的 cloudflare 防御中改变了一些东西,现在这导致 cloudflare 的“请稍候...”页面无法通过它。

事实是,我什至不需要它自动完成 - 如果有验证码,用户就可以完成它。但除了不断旋转“正在检查您的浏览器”之外,它不会显示任何内容。

用 Google 搜索了一堆 curl 示例,到目前为止我能得到的最好的是:

<?php
$url='https://ficbook.net/authors/1000'; //random profile from requrested website
$agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36';
$ch = curl_init();
curl_setopt($ch, CURLOPT_USERAGENT, $agent);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookies.txt');
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_URL,$url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 120);
curl_setopt($ch, CURLOPT_TIMEOUT, 120);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_REFERER, 'https://facebook.com/');
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_AUTOREFERER, true);
$response = curl_exec($ch);
curl_close($ch);
echo '<textarea>'.$response.'</textarea>';
?>

但它仍然是 returns 浏览器检查屏幕。向其中添加随机免费代理似乎也不起作用,或者也许我没有幸运地找到一个可用的代理(或者在这种情况下无法弄清楚如何正确插入它)。有什么办法吗?或者也许还有其他方法可以查看页面上是否有特定的 keyword/link?

好吧,我一天的大部分时间都花在了这个问题上,看起来我或多或少地解决了这个问题。不完全是我预期的方式,但是,嘿,它有效……有点。

我没有在服务器端解决这个问题,而是寻找在我自己的 PC 上解析它的解决方案(无论如何它的正常运行时间比我托管的服务器更好)。事实证明,有很多现成的开源 scrapers,包括那些知道如何绕过 cloudflare 的人无缘无故地具有额外的防御能力。

像我这样的 python 傻瓜的解决方案:

  1. 如果尚未安装 python,请安装 Anaconda。

  2. 在cmd中输入pip install cloudscraper

  3. 打开 Spyder(它与 Anaconda 一起提供)并粘贴:

    import cloudscraper

    scraper = cloudscraper.create_scraper()

    print(scraper.get("https://your-parse-target/").text)

  4. 将其保存在任何地方并戳运行按钮进行测试。如果成功,您将在同一应用程序的控制台 window 中获取数据。

  5. 将 print 替换为您要对该数据执行的任何操作。

对于我的具体情况,它还需要安装 mysql-connector-python 并启用 mysql 数据库的远程访问(而且我的主机一直免费提供它,是吧?)。因此,与其直接验证用户是他们输入的配置文件的所有者,不如现在有一个队列 - 这并不完美,但是哦,好吧,他们将不得不等待。

首先,用户请求被保存到mysql。我的本地 python 脚本会不时检查 table 以查看是否有任何内容需要验证。它将获取页面的内容并将其保存回 mysql。然后旧的 php 解析器将像以前一样完成它的工作,但是从 mysql 获取而不是实际网站。

也许有更好的解决方案,不需要采取诸如创建单独的本地解析器之类的措施,但也许这会对 运行遇到类似问题的人有所帮助。