PHP 用CURL POST后获取cookis并跳转到另一个页面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP 用CURL POST后获取cookis并跳转到另一个页面相关的知识,希望对你有一定的参考价值。

初学者,请各位大神帮忙,我要实现的是通过POST登录另一个网站,该网站会保存下来一个cookis,成功后直接打开另该网站的管理界面,下面是参考网上资料改的,cookis总有问题,求大神指点!

$cookie_jar = tempnam('./tmp','JSESSIONID');
$remote_url="http://www.baidu.com";
$post_sj="user=123&password=321";
request_by_curl($remote_url, $post_sj);

header("Location: http://www.baidu.com/123.html");
exit;

function request_by_curl($remote_server, $post_string)
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $remote_server);
curl_setopt($ch, CURLOPT_POSTFIELDS, 'mypost=' . $post_string);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.1.4322)");
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_jar);
$data = curl_exec($ch);
curl_close($ch);
return $data;

无法实现

php在服务器上用curl取得的cookies是存在于php程序所保存的位置
通过php登陆,php可以用这个cookies来访问管理界面,这个没有问题。

但是如果你用了header("Location: ......"),就不行了。网址转向以后,是访问者浏览器去访问,浏览器并没办法获取到你所保存的cookies,浏览器里没有登陆的cookies,所以不能“直接”打开管理界面,必须要重新登陆才行。

如果你用setcookie,你所设置的cookies对应的域名也不对,不能跨域,所以还是得再次在浏览器内登陆。

除非在“管理界面”端写一个api,通过调用这个api,把cookies写进访问者的浏览器里面。
参考技术A 楼主request_by_curl函数少个参数,应该后面再加个$cookie_jar,把你第一行的$cookie_jar传过来应该就行了,这个参数手册上说是包含cookie数据的文件名追问

获取到是空的···

追答

楼主函数最后是return,因此在外面调用的时候要输出一下,echo或者print_r什么的

追问

不是,我说获得到的cookie是空~我的意识是POST后获取到cookie,然后带着这个cookie去访问另外一个页面

参考技术B ,,,,,cookjar没定义追问

肿么定义···

追答

function request_by_curl里

没有$cookie_jar

追问

楼上那位回答者已经提醒了我,改过了,获取到的cookis是空

PHP通过CURL模拟登录并获取数据

<?php
/*通过CURL模拟登录并获取数据
一些网站需要权限认证,必须登录网站后,才能有效地抓取网页并采集内容,
这就需要curl来设置cookie完成模拟登录网页,php的curl在抓取网页内容方
面效率是比较高的,而且支持多线程,而file_get_contents()效率就要稍低
些。模拟登录的代码如下所示:
*/
function login_post($url, $cookie, $post){
$ch = curl_init(); //初始化curl模块
curl_setopt($ch, CURLOPT_URL, $url); //登录提交的地址
curl_setopt($ch, CURLOPT_HEADER, 0); //是否显示头信息
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 0); //是否自动显示返回的信息
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie); //设置cookie信息保存在指定的文件夹中
curl_setopt($ch, CURLOPT_POST, 1); //以POST方式提交
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));//要执行的信息
curl_exec($ch); //执行CURL
curl_close($ch);
}
/*
上例中声明的函数login_post(),需要提供一个url地址,一个保存cookie文
件,以及post的数据(用户名和密码等信息),注意php自带的http_build_query()
函数可以将数组转换成相连接的字符串,如果通过该函数登录成功后,我们要获取
登录成功个页面信息。声明函数的代码如下所示:
*/
function get_content($url, $cookie){
$ch = curl_init(); //初始化curl模块
curl_setopt($ch, CURLOPT_URL, $url); //登录提交的地址
curl_setopt($ch, CURLOPT_HEADER, 0); //是否显示头信息
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //是否自动显示返回的信息
curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);//设置cookie信息保存在指定的文件夹中
$rs = curl_exec($ch); //执行curl转去页面内容
curl_close($ch);
return $rs; //返回字符串
}
/*
get_content()中用curlopt_cookiefile可以读取到登录保存的cookie信
息 最后讲页面内容返回.我们的目的是获取到模拟登录后的信息,也就是
只有正常登录成功后菜能获取的有用的信息,下面举例代码
*/
$post = array(
‘_username‘ => ‘[email protected]‘,
‘_password‘ => ‘123456‘,
‘_submit‘ => ‘登录‘
);
$url = "http://www.ydma.cn/login/check"; //登录地址, 和原网站一致
$cookie = dirname(__FILE__).‘/cookie_ydma.txt‘; //设置cookie保存的路径
$url2 = "http://www.ydma.cn/course/59"; //登录后要获取信息的地址

login_post($url, $cookie, $post); //调用模拟登录
$content = get_content($url2, $cookie); //登录后,调用get_content()函数获取登录后指定的页面信息

@unlik($cookie); //删除cookie文件
file_put_contents(‘save.txt‘, $content); //保存抓取的页面内容







以上是关于PHP 用CURL POST后获取cookis并跳转到另一个页面的主要内容,如果未能解决你的问题,请参考以下文章

php curl get 参数

PHP通过CURL模拟登录并获取数据

用php做个post提交

PHP CURL模拟登陆

php用curl时,HTTP链接正常,HTTPS时,获取不到数据

php curl 获取 discuz时最后一步 发帖错误