The two applications of course grid and super course schedule must be used by college students. It is very familiar. Using your student ID and password for the educational system, you can import your class schedule and view it on your mobile phone anytime, anywhere.
In fact, if we know a little bit about php, we can also make a web application similar to this.
1. Solve the verification code
Actually this is a small bug of Zhengfang. When we enter the login interface, the browser will request the server, and the server will generate a verification code image. If we don't request this image, then Zhengfang's background will not generate the corresponding verification code, so we have an opportunity to take advantage of it, which will make me happy for a while ~ At this time, without filling in the verification code, Can enter very smoothly. You can disable access to the address of the verification code on your computer, and then try to see if it is true~ Of course, this only works for the positive party.
2. PHP curl simulated login
Let’s post a script house’s explanation of curl here http://www.jb51.net/article/51299.htm
Next is the relevant code. I believe many people are like me. They only like to look at examples and turn away from lengthy explanations... But this habit is still not good... No more nonsense!
//模拟登陆 function curl_request($url,$post='',$cookie='', $returnCookie=0){ $curl = curl_init(); curl_setopt($curl, CURLOPT_URL, $url); curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)'); curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); curl_setopt($curl, CURLOPT_AUTOREFERER, 1); curl_setopt($curl, CURLOPT_REFERER, "这里一定要换成教务系统登陆的url"); //填写教务系统url if($post) { curl_setopt($curl, CURLOPT_POST, 1); curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($post)); } if($cookie) { curl_setopt($curl, CURLOPT_COOKIE, $cookie); } curl_setopt($curl, CURLOPT_HEADER, $returnCookie); curl_setopt($curl, CURLOPT_TIMEOUT, 20); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); $data = curl_exec($curl); if (curl_errno($curl)) { return curl_error($curl); } curl_close($curl); if($returnCookie){ list($header, $body) = explode("\r\n\r\n", $data, 2); preg_match_all("/Set\-Cookie:([^;]*);/", $header, $matches); $info['cookie'] = substr($matches[1][0], 1); $info['content'] = $body; return $info; }else{ return $data; } }
3. Hidden fields on the educational administration system login page
Give me a chestnut
<input type="hidden" name="__VIEWSTATE" value="dDwyODE2NTM0OTg7Oz61eIbnKVojBioGYtg2vsy2SklwiA==">
These things also need to be brought when logging in. By the way, I posted the function and revealed the blogger’s school... Royal Farming University (mainly the use of regular expressions)
<br /> //登陆页面的隐藏字段<br /> function getView(){ $url = 'http://jw.hzau.edu.cn/default2.aspx'; $result = curl_request($url); $pattern = '/<input type="hidden" name="__VIEWSTATE" value="(.*?)" \/>/is'; preg_match_all($pattern, $result, $matches); $res[0] = $matches[1][0]; return $res[0] ; }
// Return the hidden value of the classroom query page
private function getViewJs($cookie,$xh){
$url = "http://jw.hzau.edu.cn/xxjsjy.aspx?xh ={$xh}";
$result = curl_request($url,'',$cookie);
$pattern = '//is';
preg_match_all($pattern, $result, $matches);
$res[0] = $matches[1][0];
return $ res[0] ;
}
4. Obtaining cookies
function login($xh,$pwd){ $url = 'http://jw.hzau.edu.cn/default2.aspx'; $post['__VIEWSTATE'] = $this->getView(); $post['txtUserName'] = $xh; //填写学号 $post['TextBox2'] = $pwd; //填写密码 $post['txtSecretCode'] = ''; $post['lbLanguage'] = ''; $post['hidPdrs'] = ''; $post['hidsc'] = ''; $post['RadioButtonList1'] = iconv('utf-8', 'gb2312', '学生'); $post['Button1'] = iconv('utf-8', 'gb2312', '登录'); $result = curl_request($url,$post,'', 1); return $result['cookie']; }
5. Let’s try the function of checking the class schedule. The format is a bit messy. Let’s make do with it. I converted the class schedule into a two-dimensional associative array
//返回课表字符串 private function classresult($xh,$pwd){ date_default_timezone_set("PRC"); //时区设置 $classList = "";//声明课表变量 $cookie = $this->login($xh,$pwd); $view = $this->getViewJs($cookie,$xh);//验证密码是否正确 //如果密码正确 if (!empty($view)) { $url = "http://jw.hzau.edu.cn/xskbcx.aspx?xh={$xh}"; $result = curl_request($url,'',$cookie); //保存的cookies preg_match_all('/<table id="Table1"[\w\W]*?>([\w\W]*?)<\/table>/',$result,$out); $table = $out[0][0]; //获取整个课表 preg_match_all('/<td [\w\W]*?>([\w\W]*?)<\/td>/',$table,$out); $td = $out[1]; $length = count($td); //获得课程列表 for ($i=0; $i < $length; $i++) { $td[$i] = str_replace("<br>", "", $td[$i]); $reg = "/{(.*)}/"; if (!preg_match_all($reg, $td[$i], $matches)) { unset($td[$i]); } } $td = array_values($td); //将课程列表数组重新索引 $tdLength = count($td); for ($i=0; $i < $tdLength; $i++) { $td[$i] = iconv('GB2312','UTF-8',$td[$i]); } //将课表转换成数组形式 function converttoTable($table){ $list = array( 'sun' => array( '1,2' => '', '3,4' => '', '5,6' => '', '7,8' => '', '9,10' => '' ), 'mon' => array( '1,2' => '', '3,4' => '', '5,6' => '', '7,8' => '', '9,10' => '' ), 'tues' => array( '1,2' => '', '3,4' => '', '5,6' => '', '7,8' => '', '9,10' => '' ), 'wed' => array( '1,2' => '', '3,4' => '', '5,6' => '', '7,8' => '', '9,10' => '' ), 'thur' => array( '1,2' => '', '3,4' => '', '5,6' => '', '7,8' => '', '9,10' => '' ), 'fri' => array( '1,2' => '', '3,4' => '', '5,6' => '', '7,8' => '', '9,10' => '' ), 'sat' => array( '1,2' => '', '3,4' => '', '5,6' => '', '7,8' => '', '9,10' => '' ) ); $week = array("sun"=>"周日","mon"=>"周一","tues"=>"周二","wed"=>"周三","thur"=>"周四","fri"=>"周五","sat"=>"周六"); $order = array('1,2','3,4','5,6','7,8','9,10'); foreach ($table as $key => $value) { $class = $value; foreach ($week as $key => $weekDay) { $pos = strpos($class,$weekDay); // echo $pos; if ($pos) { $weekArrayDay = $key; //获取list数组中的第一维key foreach ($order as $key => $orderClass) { $pos = strpos($class,$orderClass); if ($pos) { $weekArrayOrder = $orderClass; //获取该课程是第几节 break; } } break; } } $list[$weekArrayDay][$weekArrayOrder] = $class; } return $list; } //调用函数 return converttoTable($td); }else{ return 0; } }
6. Try the function of querying empty classrooms again
//空教室查询结果 public function roomresult(){ $xh = ""; //设置学号 $pwd = ""; //学号对应的密码 $cookie = $this->login($xh,$pwd); $url = "http://jw.hzau.edu.cn/xs_main.aspx?xh={$xh}"; $result = curl_request($url,'',$cookie); //保存的cookies $url="http://jw.hzau.edu.cn/xxjsjy.aspx?xh={$xh}"; $post['Button2'] = iconv('utf-8', 'gb2312', '空教室查询'); $post['__EVENTARGUMENT']=''; $post['__EVENTTARGET']=''; $post['__VIEWSTATE'] = $this->getViewJs($cookie,$xh); $post['ddlDsz'] = iconv('utf-8', 'gb2312', '单'); $post['ddlSyXn'] = '2014-2015'; //学年 $post['ddlSyxq'] = '1'; $post['jslb'] = ''; $post['xiaoq'] = ''; $post['kssj']=$_GET['start']; //提交的开始查询时间 $post['sjd']=$_GET['class'];//提交的课程节次 $post['xn']='2014-2015';//所在学年 $post['xq']='2';//所在学期 $post['xqj']='6';//当天星期几 $post['dpDataGrid1:txtPageSize']=90;//每页显示条数 $result = curl_request($url,$post,$cookie,0); preg_match_all('/<span[^>]+>[^>]+span>/',$result,$out); $tip = iconv('gb2312', 'utf-8', $out[0][3]);//获取页面前部的提示内容 preg_match_all('/<table[\w\W]*?>([\w\W]*?)<\/table>/',$result,$out); $table = iconv('gb2312', 'utf-8', $out[0][0]); //获取查询列表 $this->load->view("classroom",array('tip'=>$tip,'table'=>$table)); }
In summary, that’s all. Each school’s educational system is different. At this time, we can use the firebug packet capture of Firefox browser to see what has been submitted. If it doesn’t succeed, you should check to see if the thing you should submit has been posted. If it still doesn’t succeed, uh... you can contact me at imzhongshan@126.com
That’s it, go try it now!