l
我写的查成绩快捷通道在树人网公布一个学期了,也应收到大量同校同学的询问,与大量的建议与批评,首先很感谢大家。前两三个月因为在准备软考,与本专业认证考试H3CNA,和这个考试月,一直泡在图书馆,没很多时间来给大家解答,现在考试告一段落,我觉得有必要给大家一点提示,继续二次开发,为江理学子服务。。
博主用的技术是:PHP 5.5.12 及html 、js、bootstrap等前端相关知识。
思路:第一步,用抓包软件,对教务系统的数据交换进行抓包,我用的是fiddle,其他的抓包软件也可。得到
通过上方可知,网页向下一个网页提交了这些有用的数据。、
__VIEWSTATE=dDwyODE2NTM0OTg7Oz7iEDEGZ%2BeDTX%2BFKCGVa2E%2FsMtVbg%3D%3D
&txtUserName=2014****一卡通号
&TextBox2=**密码
&txtSecretCode=h5kr验证码
&RadioButtonList1=%D1%A7%C9%FA gbk编码的“学生”的value 值
还有个就是要保存cookie
首先我们看到txtUserName是我们填写的学号、TextBox2是我们填写的密码、txtSecreCode是我们填写的验证码、RadioButtonList1是我们选择的登陆身份。
那__VIEWSTATE和__VIEWSTATEGENERATOR是从哪里来的呢
既然在这里提交了,那肯定不是凭空产生的,我们来看看登陆界面的源码:
获取思路:
public function login_post($url,&$cookie,$post){
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1); //不自动输出数据,要echo才行
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); //重要,抓取跳转后数据
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
curl_setopt($ch, CURLOPT_REFERER, 'http://172.16.2.25/'); //重要,302跳转需要referer,可以在Request Headers找到
curl_setopt($ch, CURLOPT_POSTFIELDS,$post); //post提交数据
$result=curl_exec($ch);
curl_close($ch);
return $result;
}
//获取
$con1=$this->login_post($url,$this->cookie,'');
preg_match_all('//', $con1, $view); //获取__VIEWSTATE字段并存到$view数组中
接下来就是处理验证码,这个弄了我好头痛,本来想跳过。但是当时上gittub试了几个大神写的验证码识别类,试了一下,识别成功率不高,为了保险起见。暂时还是需手工输入。我要提醒的是在获取图片时学保存好cookies,POST提交数据是时要一起提交。。
$id=session_id();
$_SESSION['id']=$id;
//判断有没有文件夹
if (!file_exists('cookie/'.date("Ymd")))
{ mkdir ("cookie/".date("Ymd")); }
if (!file_exists('pic/'.date("Ymd")))
{ mkdir ("pic/".date("Ymd")); }
$cookie = dirname(__FILE__) . '/cookie/'.date("Ymd").'/'.$_SESSION['id'].'.txt'; //cookie路径
$verify_code_url = "http://172.16.2.25/CheckCode.aspx"; //验证码地址
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $verify_code_url);
curl_setopt($curl, CURLOPT_COOKIEJAR, $cookie); //保存cookie
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$img = curl_exec($curl); //执行curl
curl_close($curl);
$fp = fopen("pic/".date("Ymd").'/'.$_SESSION['id'].".gif","w"); //文件名
fwrite($fp,$img); //写入文件
fclose($fp);
?>
重要的数据已经准备好,接下来就是模拟登录了,就可以登录到教务系统首页了。最好书写成一个类,这样以后代码重用,功能扩展都很方便。关键思路都在这里。
/*
* 江西理工大学精简化教务模拟登陆类
* Author:xiethan qq:[email protected]
*/
error_reporting(0);
@header("content-Type: text/html; charset=gbk");
class Login{
public $username;
public $password;
public $yzm;
public $cookie;
public function __construct($username,$password,$yzm,$cookie)
{
$this->username = $username;
$this->password = $password;
$this->yzm = $yzm;
$this->cookie = $cookie;
}