curl模拟登录获取数据的问题

现在有一个内部系统登录页面:https://xxxx.xxxx.com/login.jsp,
账号密码分别为aaa,bbb,
登录后跳转地址http://xxxx.xxxx.com/system/toIndex.action,有如下信息:

登录表单提交地址为:http://xxxx.xxxx.com/system/login.action

浏览器登录后访问http://xxxx.xxxx.com/org/findAjaxOrgTreeStringByParamsId.action?orgTypeCodeId=30000000,30000003&url=/purOrder/queryOrder.action可以获取到json数据,有如下信息:

现在我用curl.php来模拟登录,好像能登陆上去,但是获取不到数据,返回结果:

{success:true,msg:false,loginone:true,SESSIONID:’E00EE77C97DD4E5BF860A9DB00DA5520′,error:’您是第一次登录系统,请修改密码!’}string(16)
“{sessionState:0}”

请问有什么办法可以抓取到数据呢?
curl.php代码如下:

<?php
$post = array(
    'userName' => 'aaa',
    'userPwd' => 'bbb',
);


$url = "http://xxxx.xxxx.com/system/login.action"; //登录地址 

$cookie = dirname(__FILE__) . '/cookie.txt'; //设置cookie保存路径 

$url2 = "http://xxxx.xxxx.com/org/findAjaxOrgTreeStringByParamsId.action?orgTypeCodeId=30000000,30000003&url=/purOrder/queryOrder.action"; //登录后要获取信息的地址 

login_post($url, $cookie, $post); //模拟登录 
$content = get_content($url2, $cookie); //获取$url2的信息
var_dump($content);
@ unlink($cookie); //删除cookie文件 

function login_post($url, $cookie, $post) {
    $curl = curl_init(); //初始化curl模块 
    curl_setopt($curl, CURLOPT_URL, $url); //登录提交的地址 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);//跳过https验证
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);//跳过https验证
    $UserAgent = 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 3.0.04506; .NET CLR 3.5.21022; .NET CLR 1.0.3705; .NET CLR 1.1.4322)';
    curl_setopt($curl, CURLOPT_USERAGENT, $UserAgent);// 使用用户代理
    curl_setopt($curl, CURLOPT_HEADER, 0); //是否显示头信息 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 0); //是否自动显示返回的信息 
    curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //设置Cookie信息保存在指定的文件中 
    curl_setopt($curl, CURLOPT_POST, 1); //post方式提交 
    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post)); //要提交的信息 
    curl_exec($curl); //执行cURL 
    curl_close($curl); //关闭cURL资源,并且释放系统资源 
}

function get_content($url, $cookie) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, 0);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie); //读取cookie 
    $rs = curl_exec($ch); //执行cURL抓取页面内容 
    curl_close($ch);
    return $rs;
}
?>

登陆的返回是什么? setCookie了吗? 为什么跳转到toIndex.action?

toIndex.action页面 返回了两个cookie,跟登陆有关吗?这些都要分析清楚,不要想当然。

你的代码只模拟了login.action请求,并没有跟浏览器的行为完全匹配,怎么能指望服务器给你一样的结果呢。

你的登录已经实现了,把cookie保存下来,然后用这个cookie去请求其他页面的数据(就像浏览器的行为一样)

get_content函数里把UserAgent带上,模拟正常的浏览器访问

  • Yii 登录的时候 “记住我” 是怎么实现的呢?
  • 数组循环遍历,为什么foreach循环后,无法用while+list+each循环输出
  • 最近在学习swoole,有几个菜鸟问题询问一下
  • 关于经度纬度获取城市的问题
  • 说一下在win和linux下开发PHP的区别、感受、内心想法。望点评
  • PHP框架如何实现自动加载类和类常驻内存的?
  • linux 下cpu负载突然升高,但是top看不到占用cpu很高的进程,如何查出cpu被哪些进程占用?
  • 一个php之前忽视的问题
  • iOS 七牛图片上传,错误响应怎么解决?
  • mysql用户表里没有root用户,设置root密码会导致匿名访问
  • wamp环境搭建中myprojects怎么连接到自定义的目录,而不是默认的www目录