curl:由于 CloudFlare,无法从网站获取 RSS

Posted

技术标签:

【中文标题】curl:由于 CloudFlare,无法从网站获取 RSS【英文标题】:curl: can't fetch rss from website because of CloudFlare 【发布时间】:2012-08-06 20:57:14 【问题描述】:

我注意到在服务器上使用 curl 连接此站点 http://www.youm7.com/newtkarirrss.asp

但我可以从 localhost 毫无问题地访问它

这是测试

http://www.tjreb.com/xml_grabber.php?feed=http://www.youm7.com/newtkarirrss.asp&stack=1

试试 CNN RSS 提要

http://www.tjreb.com/xml_grabber.php?feed=http://rss.cnn.com/rss/edition_meast.rss&stack=0

如何绕过这个错误

这是我的源代码

<?php
  class xml_grabber
        
            private $xml_file       = '' ;
            private $xml_link       = '' ;
            private $xml_dom        = '' ;
            private $xml_type       = '' ;
            private $xml_content    = '' ;
            private $xml_errors     = array() ;
            public  $xml_stack      = 0  ;

            public function __construct($link_file_com = '')
                   
                       if(!$link_file_com)
                            
                              $this->xml_errors['construct'] = 'No Xml In Construct' ;
                              return false;
                            
                       elseif(!function_exists('simplexml_load_file') || !function_exists('simplexml_load_string') || !function_exists('simplexml_import_dom'))
                            
                              $this->xml_errors['functions'] = 'simple xml function not exists' ;
                              return false;
                            
                       else
                            
                             $this->set_xml($link_file_com) ;
                            
                      // ini_set('memory_limit', '100M');
                   

             public function set_xml($xml)
                   
                      if(isset($xml3))
                        
                           if(file_exists($xml))
                              
                                $this->xml_type = 1 ;
                                $this->xml_file = $xml ;
                              
                          elseif(filter_var($xml, FILTER_VALIDATE_URL))
                              
                                $this->xml_type = 2 ;
                                $this->xml_link = $xml ;
                              
                          else
                              
                                $this->xml_type = 3 ;
                                $this->xml_dom  = $xml ;
                              
                        
                      else
                        
                          $this->xml_type = '' ;
                        
                   

             public function get_xml()
                   
                      if($this->xml_type == '')
                            
                              return false ;
                            
                      elseif($this->xml_type == 1)
                            
                              return $this->xml_file ;
                            
                      elseif($this->xml_type == 2)
                            
                              return $this->xml_link ;
                            
                      elseif($this->xml_type == 3)
                            
                              return $this->xml_dom ;
                            
                   

             public function set_columns($new_columns= array())
                   
                      return $this->xml_columns = $new_columns ;
                   
             public function get_columns()
                   
                     return $this->xml_columns ;
                   

             public function load()
                   
                     if($this->xml_type == '')
                            
                              $this->xml_errors['loader'] = 'Unknown XML type' ;
                              return false;
                            
                      elseif($this->xml_type == 1)
                            
                              $dom = simplexml_load_file($this->xml_file,null, LIBXML_NOCDATA) ;
                              $this->xml_content = $dom ;
                            
                      elseif($this->xml_type == 2)
                            
                               $con = $this->connect($this->xml_link);
                               if($this->xml_stack == 1)
                                    
                                       echo $con; die();
                                           
                               $this->xml_content = simplexml_load_string($con,null, LIBXML_NOCDATA) ;
                            
                      elseif($this->xml_type == 3)
                            
                              return $this->xml_dom ;
                            
                   

             public function fetch($return = 'array')
                    
                        if($this->xml_content != '')
                            
                               $rss_feed = $this->xml_content ;

                               $rss_title = (string) $rss_feed->channel->title ;
                               $rss_link  = (string) $rss_feed->channel->link  ;
                               $rss_cat   = (string) $rss_feed->channel->category  ;
                               $rss_image = (string) $rss_feed->channel->image->url  ;

                               $rss_summary =
                                            array
                                            (
                                              'info' =>
                                                        array(
                                                                'title'=>$rss_title ,
                                                                'link'=>$rss_link ,
                                                                'cat'=>$rss_cat ,
                                                                'image'=>$rss_image
                                                                ) ,
                                              'item' =>  array()

                                            ) ;



                               foreach($rss_feed->channel->item as $item)
                                       

                                           if($item->enclosure && $item->enclosure->attributes())
                                                
                                                    $image0 = $item->enclosure->attributes() ;
                                                    $image_url = $image0 ['url'] ;
                                                

                                          $rss_summary['item'][] =
                                                                    array(
                                                                        'title' => (string) $item->title ,
                                                                        'description' => (string) $item->description ,
                                                                        'link' => (string) $item->link ,
                                                                        'date' => (string) $item->pubDate ,
                                                                        'image' => (string) $item->image ,
                                                                        'image2' =>  (string) $image0
                                                                    ) ;
                                       

                                if($return == 'json')
                                       
                                         return json_encode($rss_summary) ;
                                       
                                elseif($return == 'serialize')
                                       
                                         return serialize($rss_summary) ;
                                       
                                elseif($return == 'xml')
                                       
                                         return xml_encode($rss_summary) ;
                                       
                                else
                                       
                                         return $rss_summary ;
                                       

                            
                        else
                            
                              $this->xml_errors['fetch'] = 'No Xml Content' ;
                            
                    

             protected function connect($link)
                    
                      if(!filter_var($link, FILTER_VALIDATE_URL))
                              
                                $this->xml_errors['connect'] = 'Not Vaild Link To Get data' ;
                                return false ;
                              
                      if(function_exists('curl_init'))
                           
                             $cu = curl_init();
                             curl_setopt($cu, CURLOPT_URL, $link);
                             curl_setopt($cu, CURLOPT_SSL_VERIFYPEER, false);
                             curl_setopt($cu, CURLOPT_SSL_VERIFYHOST, false);
                             //curl_setopt($cu, CURLOPT_REFERER, "http://www.tjreb.com");
                             //curl_setopt($cu, CURLOPT_HEADER, true);
                 //curl_setopt($cu, CURLOPT_FOLLOWLOCATION, false);
                 curl_setopt($cu, CURLOPT_RETURNTRANSFER, TRUE);
                             $co = curl_exec($cu) ;
                               if($co)
                                    
                                        $con = $co ;
                                    
                               else
                                    
                                      $this->xml_errors['connect'] = 'No Result From Curl' ;
                                      $this->xml_errors['curl']  = curl_error($cu);
                                    
                              curl_close($cu) ;
                              return $con ;
                           

                    if(!$con and function_exists('ini_get'))
                        

                             $url_fopen = ini_get('allow_url_fopen') ;

                             if($url_fopen == 0)
                                
                                   if(function_exists('ini_set'))
                                        
                                          ini_set('allow_url_fopen', 1) ;
                                        
                                   $check_fopen = 1 ;
                                
                             else
                                
                                   $check_fopen = 0 ;
                                

                             if($check_fopen == 1)
                                
                                  $url_fopen = ini_get('allow_url_fopen') ;
                                

                             if($url_fopen == 1)
                                

                                  if(function_exists('file_get_contents') and !$con)
                                   
                                        $con = @file_get_contents($link) ;
                                        if($con)
                                            
                                              return $con ;
                                            
                                       else
                                            
                                              $this->xml_errors['connect'] = 'No Result From file_get_contents' ;
                                            
                                   

                              elseif(function_exists('readfile') and !$con)
                                   
                                        $con = @readfile($link);
                                        if($con)
                                            
                                              return $con ;
                                            
                                       else
                                            
                                              $this->xml_errors['connect'] = 'No Result From readfile' ;
                                            
                                   

                              elseif(function_exists('file') and !$con)
                                   
                                        $con = @file($link)  ;
                                        if($con)
                                            
                                              return  $con ;
                                            
                                       else
                                            
                                              $this->xml_errors['connect'] = 'No Result From file' ;
                                            
                                   

                                
                        

                      if(!$con)
                           
                             $this->xml_errors['connect'] = 'Curl And Allow Url Fopen Disabled On Server' ;
                             return false ;
                           
                    

             public function get_error()
                    
                       return $this->xml_errors ;
                    

        


if(isset($_GET['feed']))
    
       $url = addslashes($_GET['feed']) ;
    
else
    
       $url = 'http://rss.cnn.com/rss/edition_meast.rss' ;
    

$fetch = $_GET['fetch'] ;
$stack = $_GET['stack'] ;

$xml = new xml_grabber($url) ;

/*
 http://www.youm7.com/new3agelrss.asp
 http://www.youm7.com/newtkarirrss.asp
 http://www.almasryalyoum.com/rss_feed_term/223241/rss.xml
 http://gdata.youtube.com/feeds/api/playlists/18A7E36C33EF4B5D?v=2
 http://rss.cnn.com/rss/edition_meast.rss
 https://www.facebook.com/feeds/page.php?format=atom10&id=40796308305
 https://www.facebook.com/feeds/page.php?format=rss20&id=40796308305
 http://www.fwasl.com/feed
 https://www.facebook.com/feeds/page.php?format=atom10&id=378156838895039
 */

if(isset($stack))

  $xml -> xml_stack = intval($stack) ; 
   


$res    = $xml -> load()    ;

$result = $xml -> fetch($fetch)   ;

if($result)
    
      print_r ( $result ) ;
    
else
    
      print_r ( $xml->get_error() ) ;
    

?>

【问题讨论】:

我的项目mujaz.awcore.com 【参考方案1】:

您需要告诉他们的网站您使用的是什么浏览器。

curl_setopt ($cu, CURLOPT_USERAGENT, $user_agent);

例如Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)

或使用 $_SERVER['HTTP_USER_AGENT'] 使用当前用户自己的浏览器代理

【讨论】:

悄悄地对自己吹口哨,思考生活和事物的意义 哦!看风滚草! 没有使用 Cloudflare,很抱歉这没有帮助。很高兴@burak-emre 能够解决这个 +1【参考方案2】:

您无法轻松绕过 Cloudflare。但是,您可以破解保护系统。 :)

首先,解析页面(Cloudflare 保护页面)并计算 3+13*7(很可能每个请求都会有所不同)。

$(function()setTimeout(
            function()
                $('#jschl_answer').val(3+13*7);
                $('#ChallengeForm').submit();
            ,
            5850
));

然后使用您从解析数据中获得的#ChallengeForm 中的“jschl_vc”值和“jschl_answer”值作为 3+13*7 发送发布请求。然后尝试使用 Cloudflare 添加的 cookie 值再次获取该页面。添加 Cloudflare 白名单后,您将不会再看到该页面。

【讨论】:

谢谢@burak emre 的回答我喜欢你的回答,但是我没有结果我向服务器发送请求并获得了 claudflare 页面,所以我从 jquery val 获得了验证码值并将其发送给使用 curl post 方法的表单中的其他输入, 我认为服务器应该保存 cookie,但我不知道 curl 如何返回 cookie 或使用它 @MonaAbdelmajeed 看看这里:***.com/questions/895786/… 我试过你的想法重新发布数据到 curl 并从 cookie 中获取 cookie 没有结果,这里是测试的 url tjreb.com/xml_grabber.php?feed=http://www.youm7.com/… 我只是在页面中添加了一些信息,这里是标题解析我用***.com/a/895858/1019618 ...等待你的回答 实际上它返回一个cookie值。例如,您共享的页面必须使用“__cfduid=dae00b9d3a19db1891fb83e3f7fd5d15d1345008603;”请求。 (看看页面的源代码)你能再检查一下吗?【参考方案3】:

您可以使用 PhantomJS http://phantomjs.org/ 通过 cloudflare 保护 它可以使用以下小脚本“delay.js”在浏览器外执行cloudflare JS:

"use strict";
var page = require('webpage').create(),
    system = require('system'),
    address, delay;

if (system.args.length < 3 || system.args.length > 5) 
    console.log('Usage: delay.js URL delay');
    phantom.exit(1);
 else 
    address = system.args[1];
    delay = system.args[2];
    page.open(address, function (status) 
        if (status !== 'success') 
            console.log('Unable to load the address!');
            phantom.exit(1);
         else 
            window.setTimeout(function () 
                var content = page.content;
                console.log(content);
                phantom.exit();
            , delay);
        
    );

运行它 phantomjs delay.js http://protected.url 5000

这将获得“protected.url”并等待 5000 毫秒,让 cloudflare 代码加载真实页面并将其转储到标准输出。

【讨论】:

以上是关于curl:由于 CloudFlare,无法从网站获取 RSS的主要内容,如果未能解决你的问题,请参考以下文章

由于 cloudflare,无法从 url 读取数据

PHP爬取一个使用cloudflare的网站

cURL - 加载具有 CloudFlare 保护的站点

Angular 应用程序无法从 Cloudflare 背后启用 CORS 的站点获取数据

由于 Cloudflare,从今天开始无法使用 BeautifulSoup 解析 coin gecko 页面

cloudflare api 将 curl 转换为 php curl 并发送 CNAME 更新