課程格子和超級(jí)課程表這兩個(gè)應(yīng)用,想必大學(xué)生都很熟悉,使用自己的學(xué)號(hào)和教務(wù)系統(tǒng)的密碼,就可以將自己的課表導(dǎo)入,隨時(shí)隨地都可以在手機(jī)上查看。
其實(shí)稍微了解一點(diǎn)php的話,我們也可以做一個(gè)類似這樣的web 應(yīng)用。
1,解決掉驗(yàn)證碼
其實(shí)這是正方的一個(gè)小bug,當(dāng)我們進(jìn)入登陸界面時(shí),瀏覽器會(huì)去請(qǐng)求服務(wù)器,服務(wù)器會(huì)生成一個(gè)驗(yàn)證碼圖片。如果我們不去請(qǐng)求這個(gè)圖片,那么正方后臺(tái)也不會(huì)生成相應(yīng)的 驗(yàn)證碼,于是這樣我們就有了可乘之機(jī),讓我高興會(huì)兒~這時(shí),我們?cè)诓惶顚?xiě)驗(yàn)證碼的情況下,可以很流暢的進(jìn)入。大家可以在自己的電腦上禁止訪問(wèn)驗(yàn)證碼的地址,然后試試這 是不是真的~當(dāng)然,這只對(duì)正方有效。
2,php 的curl 模擬登陸
這里直接貼一個(gè)腳本之家對(duì) curl 的講解吧http://www.jb51.net/article/51299.htm
接下來(lái)就是相關(guān)代碼了,相信很多人和我一樣,只喜歡看例子,對(duì)于長(zhǎng)篇大論的講解,轉(zhuǎn)頭就走……不過(guò)這個(gè)習(xí)慣還是不好……廢話不多說(shuō)!
//模擬登陸 function curl_request($url,$post='',$cookie='', $returnhtml' target='_blank'>Cookie=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, "這里一定要換成教務(wù)系統(tǒng)登陸的url"); //填寫(xiě)教務(wù)系統(tǒng)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,教務(wù)系統(tǒng)登陸頁(yè)面的隱藏字段
舉個(gè)栗子
<input type="hidden" name="__VIEWSTATE" value="dDwyODE2NTM0OTg7Oz61eIbnKVojBioGYtg2vsy2SklwiA==">
這些東西在登陸的時(shí)候也是需要帶上的,順便貼出函數(shù),順便暴漏了博主的學(xué)校……皇家種地大學(xué)(主要是正則表達(dá)式的運(yùn)用)
//登陸頁(yè)面的隱藏字段
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] ; }
//返回教室查詢頁(yè)面的隱藏值
private function getViewJs($cookie,$xh){
$url = "http://jw.hzau.edu.cn/xxjsjy.aspx?xh={$xh}";
$result = curl_request($url,'',$cookie);
$pattern = '/<input type="hidden" name="__VIEWSTATE" value="(.*?)" //>/is';
preg_match_all($pattern, $result, $matches);
$res[0] = $matches[1][0];
return $res[0] ;
}
4,cookie 的獲取
function login($xh,$pwd){ $url = 'http://jw.hzau.edu.cn/default2.aspx'; $post['__VIEWSTATE'] = $this->getView(); $post['txtUserName'] = $xh; //填寫(xiě)學(xué)號(hào) $post['TextBox2'] = $pwd; //填寫(xiě)密碼 $post['txtSecretCode'] = ''; $post['lbLanguage'] = ''; $post['hidPdrs'] = ''; $post['hidsc'] = ''; $post['RadioButtonList1'] = iconv('utf-8', 'gb2312', '學(xué)生'); $post['Button1'] = iconv('utf-8', 'gb2312', '登錄'); $result = curl_request($url,$post,'', 1); return $result['cookie']; }5,讓我們來(lái)試試查課表的功能,格式有點(diǎn)亂額,大家湊合著看,我把課表轉(zhuǎn)成了一個(gè)二維關(guān)聯(lián)數(shù)組
//返回課表字符串private function classresult($xh,$pwd){ date_default_timezone_set("PRC"); //時(shí)區(qū)設(shè)置 $classList = "";//聲明課表變量 $cookie = $this->login($xh,$pwd); $view = $this->getViewJs($cookie,$xh);//驗(yàn)證密碼是否正確 //如果密碼正確 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]; //獲取整個(gè)課表 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); //將課程列表數(shù)組重新索引 $tdLength = count($td); for ($i=0; $i < $tdLength; $i++) { $td[$i] = iconv('GB2312','UTF-8',$td[$i]); } //將課表轉(zhuǎn)換成數(shù)組形式 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數(shù)組中的第一維key foreach ($order as $key => $orderClass) { $pos = strpos($class,$orderClass); if ($pos) { $weekArrayOrder = $orderClass; //獲取該課程是第幾節(jié) break; } } break; } } $list[$weekArrayDay][$weekArrayOrder] = $class; } return $list; } //調(diào)用函數(shù) return converttoTable($td); }else{ return 0; } }
6,再試試查詢空教室的功能
//空教室查詢結(jié)果 public function roomresult(){ $xh = ""; //設(shè)置學(xué)號(hào) $pwd = ""; //學(xué)號(hào)對(duì)應(yīng)的密碼 $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'; //學(xué)年 $post['ddlSyxq'] = '1'; $post['jslb'] = ''; $post['xiaoq'] = ''; $post['kssj']=$_GET['start']; //提交的開(kāi)始查詢時(shí)間 $post['sjd']=$_GET['class'];//提交的課程節(jié)次 $post['xn']='2014-2015';//所在學(xué)年 $post['xq']='2';//所在學(xué)期 $post['xqj']='6';//當(dāng)天星期幾 $post['dpDataGrid1:txtPageSize']=90;//每頁(yè)顯示條數(shù) $result = curl_request($url,$post,$cookie,0); preg_match_all('/<span[^>]+>[^>]+span>/',$result,$out); $tip = iconv('gb2312', 'utf-8', $out[0][3]);//獲取頁(yè)面前部的提示內(nèi)容 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)); }
總結(jié)起來(lái)就是這些了,每個(gè)學(xué)校的教務(wù)系統(tǒng)都不盡相同,這時(shí)我們可以借助火狐瀏覽器的 firebug 抓包,看看到底提交了哪些東西。如果不成功,要看看自己該提交的東西post 上去了沒(méi)有,如果再不成功,額……可以聯(lián)系我 imzhongshan@126.com
就這些了,趕快去試試吧!
PHP編程鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選