簡體   English   中英

php-curl 遇到 cloudflare “請稍候”屏幕

[英]php-curl encounters cloudflare "please wait" screen

我有一個用於外部站點的簡單解析器,需要確認用戶提交的鏈接指向該用戶擁有的帳戶(通過從鏈接頁面解析指向其個人資料的鏈接)。 僅使用此 wordpress function,它就可以工作很長時間:

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

但后來網站改變了他們的 cloudflare 防御,現在這導致 cloudflare 的“請稍候...”頁面沒有通過它的選項。

問題是,我什至不需要它自動完成——如果有驗證碼,用戶就可以完成它。 但除了無休止地旋轉“檢查您的瀏覽器”之外,它不會顯示任何內容。

谷歌搜索了一堆 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>';
?>

然而它仍然返回瀏覽器檢查屏幕。 向它添加隨機的免費代理似乎也不起作用,或者我可能沒有幸運地找到一個有效的代理(或者在這種情況下無法弄清楚如何正確插入它)。 有什么辦法嗎? 或者也許還有其他方法可以查看頁面上是否有特定的關鍵字/鏈接?

好的,我大部分時間都花在這個問題上,似乎我或多或少地把它整理好了。 不完全是我預期的方式,但是,嘿,它工作......有點。

我最終沒有在服務器端解決這個問題,而是尋找在我自己的 PC 上解析它的解決方案(無論如何,它的正常運行時間比我的托管服務器更好)。 事實證明,有很多現成的開源抓取工具,包括那些知道如何繞過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 腳本將不時檢查該表,以查看是否有任何需要驗證的內容。 它將獲取頁面的內容並將其保存回 mysql。 然后舊的 php 解析器將像以前一樣完成它的工作,但從 mysql 獲取而不是實際網站。

也許有更好的解決方案不需要訴諸諸如創建單獨的本地解析器之類的措施,但這可能會對遇到類似問題的人有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM