程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> php實現模擬登陸方正教務系統抓取課表

php實現模擬登陸方正教務系統抓取課表

編輯:關於PHP編程

       這篇文章主要介紹了php實現模擬登陸方正教務系統抓取課表的相關資料,需要的朋友可以參考下

      課程格子和超級課程表這兩個應用,想必大學生都很熟悉,使用自己的學號和教務系統的密碼,就可以將自己的課表導入,隨時隨地都可以在手機上查看。

      其實稍微了解一點php的話,我們也可以做一個類似這樣的web 應用。

      1,解決掉驗證碼

      其實這是正方的一個小bug,當我們進入登陸界面時,浏覽器會去請求服務器,服務器會生成一個驗證碼圖片。如果我們不去請求這個圖片,那麼正方後台也不會生成相應的 驗證碼,於是這樣我們就有了可乘之機,讓我高興會兒~這時,我們在不填寫驗證碼的情況下,可以很流暢的進入。大家可以在自己的電腦上禁止訪問驗證碼的地址,然後試試這 是不是真的~當然,這只對正方有效。

      2,php 的curl 模擬登陸

      接下來就是相關代碼了,相信很多人和我一樣,只喜歡看例子,對於長篇大論的講解,轉頭就走……不過這個習慣還是不好……廢話不多說!

      ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 //模擬登陸 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("rnrn", $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,教務系統登陸頁面的隱藏字段

      舉個栗子

      復制代碼 代碼如下:

      這些東西在登陸的時候也是需要帶上的,順便貼出函數,順便暴漏了博主的學校……皇家種地大學(主要是正則表達式的運用)

      ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //登陸頁面的隱藏字段     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] ; }   //返回教室查詢頁面的隱藏值   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 的獲取

      ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 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,讓我們來試試查課表的功能,格式有點亂額,大家湊合著看,我把課表轉成了一個二維關聯數組

      ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 //返回課表字符串 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"[wW]*?>([wW]*?)</table>/',$result,$out); $table = $out[0][0]; //獲取整個課表   preg_match_all('/<td [wW]*?>([wW]*?)</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,再試試查詢空教室的功能

      ?

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 //空教室查詢結果 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[wW]*?>([wW]*?)</table>/',$result,$out); $table = iconv('gb2312', 'utf-8', $out[0][0]); //獲取查詢列表   $this->load->view("classroom",array('tip'=>$tip,'table'=>$table)); }

      總結起來就是這些了,每個學校的教務系統都不盡相同,這時我們可以借助火狐浏覽器的 firebug 抓包,看看到底提交了哪些東西。

      以上所述就是本文的全部內容了,希望大家能夠喜歡。

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved