php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统

cookie维持客户端和服务器端的交互

Cookie是由服务器端生成,发送给User-Agent(一般是浏览器),浏览器会将Cookie的key/value保存到某个目录下的文本文件内,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie名称和值可以由服务器端开发自己定义,这样服务器可以知道该用户是否是合法用户以及是否需要重新登录等,服务器可以设置或读取Cookies中包含信息,借此维护用户跟服务器会话中的状态。

登录过程

当我们打开登录界面时服务器便分配了一个session_id给浏览器来维持会话
php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统_第1张图片
输入用户名,密码以及验证码点击登录时,网页会把我们填的数据POST到服务器的一个地址中,服务器会先验证验证码是否正确,然后再验证用户名和密码。但是post的数据除了我们所填的数据,还存在一些隐藏的数据。我们用抓包工具把登录时post的数据抓来看看

php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统_第2张图片
php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统_第3张图片
当然我们也可以查看网页html代码来分析
php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统_第4张图片

验证码问题

当我们模拟登录时,我们需要post验证码,对于如何提交验证码
1.做验证码的图像识别
2.使用第三方的打码平台
3.把验证码分离出来,让用户自己填写
这里我采用第三种方式
php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统_第5张图片
我们很快便能发现验证码图片的链接,因此我们便可以轻易的分离出来使用,到此处,我们便可以开始编码进行模拟登录了


$act='';
define('SCRIPT_ROOT',dirname(__FILE__).'/');
if (isset($_REQUEST['act'])) {
   $act = trim($_REQUEST['act']);
}
$user = '';//用户名
$password = '';//密码
switch($act)
{
  case 'login':
      // 获取验证码
      $code = trim($_REQUEST['code']);       
      // $loginParams为curl模拟登录时post的参数
      $loginParams['__VIEWSTATE'] = 'dDwyODE2NTM0OTg7Oz6XQwtkC4IPj2mY5bsI42qRkaJNzw==';
      $loginParams['RadioButtonList1'] = '学生';
      $loginParams['TextBox2'] = $password;
      $loginParams['txtUserName'] = $user;
      $loginParams['Button1'] = '';
      $loginParams['lbLanguage'] = '';
      $loginParams['hidPdrs'] = '';
      $loginParams['hidsc'] = '';
      $loginParams['txtSecretCode'] = $code;        
      // $cookieFile 为加载验证码时保存的cookie文件名 
      $cookieFile = SCRIPT_ROOT.'cookie.tmp';
      // $targetUrl curl 提交的目标地址
      $targetUrl = 'http://202.116.160.170/default2.aspx';  
      // 参数重置
      $content = curlLogin($targetUrl, $cookieFile, $loginParams);
      echo $content;
      break;
      case 'authcode':
      // Content-Type 验证码的图片类型
      header('Content-Type:image/png charset=gb2312');
      showAuthcode('http://202.116.160.170/CheckCode.aspx');
      exit;
     break;
}


function curlLogin($url, $cookieFile, $loginParams)
{   
    $user = '';//用户名
    $password = '';//密码
    $ch = curl_init($url);
    curl_setopt($ch,CURLOPT_COOKIEFILE, $cookieFile); //同时发送Cookie
    curl_setopt($ch,CURLOPT_RETURNTRANSFER, 1);//设定返回的数据是否自动显示
    curl_setopt($ch, CURLOPT_HEADER, 0);//设定是否显示头信 息
    curl_setopt($ch, CURLOPT_NOBODY, false);//设定是否输出页面 内容
    curl_setopt($ch,CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($ch,CURLOPT_POSTFIELDS, $loginParams); //提交查询信息
    curl_exec($ch);//返回结果
    curl_close($ch); //关闭
    $curl2=curl_init();
    curl_setopt ($curl2,CURLOPT_REFERER,'http://202.116.160.170/xs_main.aspx?xh='.$user.'#a');
    curl_setopt($curl2, CURLOPT_COOKIEFILE, $cookieFile); 
     curl_setopt($curl2, CURLOPT_HEADER, false); 
     curl_setopt($curl2, CURLOPT_RETURNTRANSFER, true); 
     curl_setopt($curl2, CURLOPT_TIMEOUT, 20); 
     curl_setopt($curl2, CURLOPT_AUTOREFERER, true); 
     curl_setopt($curl2, CURLOPT_FOLLOWLOCATION, true); 
     curl_setopt($curl2, CURLOPT_URL, 'http://202.116.160.170/xskbcx.aspx?xh='.$user);//登陆后要从哪个页面获取信息
     $en_contents=mb_convert_encoding( curl_exec($curl2),'utf-8', array('Unicode','ASCII','GB2312','GBK','UTF-8')); 
     preg_match_all('/$en_contents,$out);
     var_dump($out);
     $student = explode(':', $out[1][6]);
     $studentInfo[0] = $student[1];
     $student = explode(':', $out[1][5]);
     $studentInfo[1] = $student[1];
     $student = explode(':', $out[1][2]);
     $studentInfo[2] = substr(trim($student[1]), 0,4);
     var_dump($studentInfo);
     preg_match_all('/([\w\W]*?)<\/table>/',$en_contents,$out);
     $table = $out[0][0]; 
     preg_match_all('/
([\w\W]*?)<\/td>/',$table,$out); $td = $out[1]; $length = count($td); //获得课程列表 for ($i=0; $i < $length; $i++) { $td[$i] = str_replace("
"
, "", $td[$i]); $reg = "/{(.*)}/"; if (!preg_match_all($reg, $td[$i], $matches)) { unset($td[$i]); } } $td = array_values($td); //将课程列表数组重新索引 $tdLength = count($td); //将课表转换成数组形式 echo "
";
     var_dump($td);
     curl_close($curl2);
}

/**
 * 加载目标网站图片验证码
 * string $authcode_url 目标网站验证码地址
 */
function showAuthcode( $authcode_url )
{
    $cookieFile = SCRIPT_ROOT.'cookie.tmp';
    $ch = curl_init($authcode_url);
    curl_setopt($ch,CURLOPT_COOKIEJAR, $cookieFile); // 把返回来的cookie信息保存在文件中
    curl_setopt($ch, CURLOPT_HEADER, 1);
    $content =curl_exec($ch);
    var_dump($cookieFile);
    curl_close($ch);
}
?>

"hidden" name="act" value="login"> "text" name="code" /> "submit" name="submit" >

php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统_第6张图片
php后台“爬虫”模拟登录第三方系统(三)---模拟登录学校正方系统_第7张图片

你可能感兴趣的:(php)