首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >php-curl遇到cloudflare“请等待”屏幕

php-curl遇到cloudflare“请等待”屏幕
EN

Stack Overflow用户
提问于 2021-05-08 11:27:20
回答 1查看 1.4K关注 0票数 1

我为一个外部站点提供了一个简单的解析器,用于确认提交的链接用户是否指向该用户拥有的帐户(通过从链接页面解析到其配置文件的链接)。它使用了很长一段时间,只使用这个wordpress函数:

代码语言:javascript
复制
function fetch_body_url($fetch_link){
    $response = wp_remote_get($fetch_link, array('timeout' => 120));
    return wp_remote_retrieve_body($response);
}

但后来网站改变了他们的云彩防御,现在这导致了“请等.”cloudflare页面,没有传递它的选项。

问题是,我甚至不需要它自动完成-如果有一个captcha,用户可以完成它。但是,除了无休止地旋转“检查你的浏览器”之外,它不会显示其他任何东西。

谷歌搜索了一堆卷发例子,到目前为止,我能找到的最好的例子是:

代码语言:javascript
复制
<?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>';
?>

然而,它仍然返回浏览器检查屏幕。向它添加随机的免费代理似乎也不起作用,或者可能我没有幸运地找到一个工作的代理(或者无法在本例中找到正确的插入方法)。有什么办法可以绕过吗?或者可能还有其他方法来查看页面上是否有特定的关键字/链接?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-08 22:03:59

好的,我花了一天的大部分时间在这个问题上,似乎我或多或少地解决了这个问题。不完全像我想象的那样,但是,嘿,它很有效.说大也大吧。

我最终没有在服务器端解决这个问题,而是在我自己的PC上寻找解析它的解决方案(它比我的主机服务器有更好的正常运行时间)。事实证明,有很多现成的开源刮刀器,包括那些知道如何绕过cloudflare的人是毫无理由的额外防御。

像我这样的python虚拟人的解决方案:

如果您还没有安装python,请安装

  1. .

cmd型pip install cloudscraper中的

  1. Open (它与Anaconda一起提供)并粘贴如下:

import cloudscraper

scraper = cloudscraper.create_scraper()

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

  1. 将它保存到任何地方,然后点击run按钮进行测试。如果成功,您可以在同一应用程序的控制台窗口中获取数据.

  1. 用你要用这些数据做的任何事情来代替打印。

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67447003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档