curl 或 file_get_contents 获取需要授权页面的方法

原文:http://blog.csdn.net/fdipzone/article/details/44475801

原文看的更清晰,因为博客园的编辑器太烂了。转来备份。

今天因工作需要,需要用 curl / file_get_contents 获取需要授权(Authorization)的页面内容,解决后写了这篇文章分享给大家

php curl 扩展,能够在服务器端发起POST/GET请求,访问页面,并能获取页面的返回数据。

例如要获取的页面:http://localhost/server.php

<?php
$content = isset($_POST[‘content‘])? $_POST[‘content‘] : ‘‘;
header(‘content-type:application/json‘);
echo json_encode(array(‘content‘=>$content));
?>

使用curl获取server.php页面

<?php
$url = ‘http://localhost/server.php‘;
$param = array(‘content‘=>‘fdipzone blog‘);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$ret = curl_exec($ch);
$retinfo = curl_getinfo($ch);
curl_close($ch);

if($retinfo[‘http_code‘]==200){
    $data = json_decode($ret, true);
    print_r($data);
}else{
    echo ‘POST Fail‘;
}
?>

如果服务没有安装php curl扩展,使用file_get_contents也可以实现发起请求,获取页面返回数据

<?php
$url = ‘http://localhost/server.php‘;
$param = array(‘content‘=>‘fdipzone blog‘);

$opt = array(
    ‘http‘ => array(
        ‘method‘ => ‘POST‘,
        ‘header‘ => ‘content-type:application/x-www-form-urlencoded‘,
        ‘content‘ => http_build_query($param)
    )
);

$context = stream_context_create($opt);

$ret = file_get_contents($url, false, $context);

if($ret){
    $data = json_decode($ret, true);
    print_r($data);
}else{
    echo ‘POST Fail‘;
}
?>

使用curl 和 file_get_contents 返回的结果都是一样的。

Array
(
    [content] => fdipzone blog
)

对于需要授权的页面,例如使用了htpasswd+.htaccess设置目录访问权限的页面,直接用上面的方法会返回401 Unauthorized错误。

这次的例子先不使用htpasswd+.htaccess来控制访问权限,而使用
$_SERVER[‘PHP_AUTH_USER‘] 和 $_SERVER[‘PHP_AUTH_PW‘]这两个服务器参数。

想了解htpasswd+.htaccess的朋友,可以访问我之前写的文章 《使用apache htpasswd生成加密的密码文件,并使用.htaccess控制目录访问》

http://localhost/server.php 修改为:

<?php
if(!isset($_SERVER[‘PHP_AUTH_USER‘]))
{
    header(‘WWW-Authenticate: Basic realm="localhost"‘);
    header("HTTP/1.0 401 Unauthorized");
    exit;
}else{
    if (($_SERVER[‘PHP_AUTH_USER‘]!= "fdipzone" || $_SERVER[‘PHP_AUTH_PW‘]!="654321")) {
        header(‘WWW-Authenticate: Basic realm="localhost"‘);
        header("HTTP/1.0 401 Unauthorized");
        exit;
    }
}

$content = isset($_POST[‘content‘])? $_POST[‘content‘] : ‘‘;
header(‘content-type:application/json‘);
echo json_encode(array(‘content‘=>$content));
?>

设定帐号:fdipzone 密码:654321

curl中,有一个参数是 CURLOPT_USERPWD,我们可以利用这个参数把帐号密码在请求时发送过去。

<?php
$url = ‘http://localhost/server.php‘;
$param = array(‘content‘=>‘fdipzone blog‘);

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($param));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERPWD, ‘fdipzone:654321‘); // 加入这句
$ret = curl_exec($ch);
$retinfo = curl_getinfo($ch);
curl_close($ch);

if($retinfo[‘http_code‘]==200){
    $data = json_decode($ret, true);
    print_r($data);
}else{
    echo ‘POST Fail‘;
}
?>

而file_get_contents 如果要发送帐号和密码,需要手动拼接header

file_get_contents 请求的程序修改为:

<?php
$url = ‘http://localhost/server.php‘;
$param = array(‘content‘=>‘fdipzone blog‘);

$auth = sprintf(‘Authorization: Basic %s‘, base64_encode(‘fdipzone:654321‘)); // 加入这句

$opt = array(
    ‘http‘ => array(
        ‘method‘ => ‘POST‘,
        ‘header‘ => "content-type:application/x-www-form-urlencoded\r\n".$auth."\r\n", // 把$auth加入到header
        ‘content‘ => http_build_query($param)
    )
);

$context = stream_context_create($opt);

$ret = file_get_contents($url, false, $context);

if($ret){
    $data = json_decode($ret, true);
    print_r($data);
}else{
    echo ‘POST Fail‘;
}
?>
时间: 2024-11-10 07:47:27

curl 或 file_get_contents 获取需要授权页面的方法的相关文章

curl 要么 file_get_contents 获得授权页面的方法的必要性

今天,需要工作,需要使用 curl / file_get_contents 获得授权的必要性(Authorization)的页面内容.解决后写了这篇文章分享给大家. php curl 扩展,可以在server端发起POST/GET请求,訪问页面,并能获取页面的返回数据. 比如要获取的页面:http://localhost/server.php <?php $content = isset($_POST['content'])? $_POST['content'] : ''; header('co

PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题

PHP CURL与file_get_contents函数都可以获取远程服务器上的文件保存到本地,但在性能上面两者完全不在同一个级别,下面我先来介绍PHP CURL或file_get_contents函数应用例子,然后再简单的给各位介绍一下它们的一些小区别吧. 推荐方法 CURL获取 ? 1 2 3 4 5 6 7 8 9 10 11 12 <?php $c = curl_init(); $url = 'www.jb51.net'; curl_setopt($c, CURLOPT_URL, $ur

解析PHP中的file_get_contents获取远程页面乱码的问题【转】

在工作中,遇到一个问题.我需要将一个网址(该网址是一个json数据的接口,即 打开该网址,在浏览器中显示的是json数据),我使用file_get_contents($url),数据是乱码的. 通过查询,知道有解决办法.如下: http://www.xuexijc.com/news/PHP/42412.html---------以下是网址内容 本篇文章是对PHP中的file_get_contents获取远程页面出现乱码的问题进行了详细的分析介绍,需要的朋友参考下PHP的file_get_cont

Chrome获取微信授权,调试公众号页面

1.目的 你可能遇到过这种情况,在微信中打开公众号是这样的. 复制链接,在chrome中打开是这样的. 博主今天要解决的就是,如果在chrome中加载需要微信授权的页面,至于加载成功后要干嘛,测试?抓包?查看源码?...这就是你的事情了,先来说说怎么绕过这个验证吧. 2.准备工具 工欲善其事必先利其器,先来说说工具. 工具名称 用途 微信PC版 PC版的微信内置浏览器能获取微信授权.复制页面链接 Chrome浏览器 调试工具,我们的目的就是在chrome里面绕过微信授权 Fiddler4 抓包工

OAuth2.0 微博登陆网站功能的实现(一)获取用户授权及令牌 Access Token

在登陆一些网站的时候,可以选择登陆方式为第三方登陆,例如微博登陆,以爱奇艺为例,进入首页,点击 ”登陆“,会弹出登录框: 除了本站登陆外,还可以选择其他第三方登陆,比如微博登陆.QQ 登陆.微信登陆等. 选择微博登陆后,爱奇艺会向用户申请授权用于微博登陆(当用户已经登陆了微博时会直接申请授权,当用户没有登陆时会提示用户登陆微博): 此时提示窗口的 url 为:https://api.weibo.com/oauth2/authorize?scope=&redirect_uri=http%3A%2F

php读取网络文件curl,fsockopen,file_get_contents,file,fopen几种方法

php读取网络文件 curl, fsockopen ,file_get_contents 几个方法的效率对比 最近需要获取别人网站上的音乐数据.用了file_get_contents函数,但是总是会遇到获取失败的问题,尽管按照手册中的 例子设置了超时,可多数时候不会奏效: $config['context'] = stream_context_create(array(‘http’ => array(‘method’ => “GET”,   ’timeout’ => 5//这个超时时间不

获取指定URl页面中所有链接

//获取指定URL页面中所有链接 function get_url_href($url){ $html = file_get_contents($url); $dom = new DOMDocument(); @$dom->loadHTML($html); $xpath = new DOMXPath($dom); $hrefs = $xpath->evaluate('/html/body//a'); for($i=0;$i<$hrefs->length;$i++){ $href =

远程读取URL 建议用curl代替file_get_contents

初学php的朋友们,很容易翻一个错误,在写采集程序或者调用api接口总会有线考虑到使用file_get_contents函数来或许内容,程序的访问量不大倒是没什么影响,但是访问量提升了那非常的悲剧了,你会发现服务器负载飙升,最后服务器宕机.初入公司便遇到这个问题,遂使用curl取代此命令,并且禁用远程file_get_contents,它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP. <?php $url='h

远程抓取,小偷程序。curl与file_get_contents()的比较

一般来说大家写小偷程序都喜欢用file_get_contents(),确实,简单无脑又暴力.但是后面发现其实,除了只是编码简便外,其他特性远远不及curl.学习才发现,curl支持很多协议,有FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE以及LDAP,也就是说,它能做到很多file_get_content做不到的事情.curl在php可以实现远程获取和采集内容:实现PHP网页版的FTP上传下载:实现模拟登陆:实现接口对接(API),数据传输: