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的主要内容,如果未能解决你的问题,请参考以下文章
Angular 应用程序无法从 Cloudflare 背后启用 CORS 的站点获取数据