最近在開發微信公衆平臺,想實現通過微信查詢課表的功能。無奈本人業務不精,之前對微信公衆平臺不是很瞭解,甚至對PHP都不是很熟練。所以一直不知道怎麼解決,在網上查閱了很多資料,收貨不是很大,不過至少把原理弄懂了。其實原理很簡單,就是利用php的cURL模擬登錄技術。
cURL是一個利用URL語法規定來傳輸文件和數據的工具,支持很多協議,如HTTP、FTP、TELNET等。最爽的是,PHP也支持 cURL 庫。在PHP中建立cURL請求的基本步驟:
1.初始化
2.設置變量
3.執行並獲取結果
4.釋放cURL句柄
首先登錄教學管理系統,我們學校用的是正方教學管理系統,而且不需要驗證碼。很多學校用的都是這套系統,開發這套系統的人最熱衷於做登陸界面,一口氣做了5個,這是得有多閒啊。其中的default3.aspx就一個登陸框,我們選擇它作爲模擬登陸的入口。
查看源代碼找到登陸需要提交的參數,當然用httpwatch抓包分析更好,現在這臺電腦上沒安裝所以就不截圖了。
VIEWSTATE這個參數我也不知道是幹嘛的,好像是aspx用來驗證的,後面進入教務系統後每一次點擊都要提交一次這個參數,而且點擊後的這個參數很長,有時候根本提交不過去,這個問題暫時還沒解決。一般來說登陸提交這三個參數就行了。
這是我在網上找的正則表達式,可以將表格轉換成數組,非常方便,可以拿去用在很多地方。
function get_td_array($table) { $table = preg_replace("'<table[^>]*?>'si","",$table); $table = preg_replace("'<tr[^>]*?>'si","",$table); $table = preg_replace("'<td[^>]*?>'si","",$table); $table = str_replace("</tr>","{tr}",$table); $table = str_replace("</td>","{td}",$table); //去掉 HTML 標記 $table = preg_replace("'<[/!]*?[^<>]*?>'si","",$table); //去掉空白字符 $table = preg_replace("'([rn])[s]+'","",$table); $table = preg_replace('/ /',"",$table); $table = str_replace(" ","",$table); $table = str_replace(" ","",$table); $table = explode('{tr}', $table); array_pop($table); foreach ($table as $key=>$tr) { $td = explode('{td}', $tr); array_pop($td); $td_array[] = $td; } return $td_array; }
詳細代碼如下:
<?php $username='2011140113';//賬號 $password='123456';//密碼 $cookie_file =tempnam('./temp','cookie'); //創建臨時文件保存cookie $login_url = 'http://192.168.17.42/(0t3a2k454z1yey55nczj5x55)/default3.aspx';//登陸地址 $post_fields = '__VIEWSTATE=dDwtMTk3MjM2MzU0MDs7Po+Vuw2g98nkvMhqN2OzPbC6DnbA&TextBox1='.$username.'&TextBox2='.$password;//POST參數 $ch = curl_init($login_url);//初始化 curl_setopt($ch, CURLOPT_HEADER, 0);//0顯示 curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);//1不顯示 curl_setopt($ch, CURLOPT_POST, 1);//POST數據 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file);//保存cookie curl_setopt($ch, CURLOPT_POSTFIELDS, $post_fields);//加上POST變量 curl_exec($ch); curl_close($ch); //跳轉到課表頁面,原理同上 $url='http://192.168.17.42/(0t3a2k454z1yey55nczj5x55)/tjkbcx.aspx?xh=$username'; $ch = curl_init($url); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER,0); curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); $contents = curl_exec($ch);//執行並獲取HTML文檔內容 iconv('GB2312', 'UTF-8', $contents);//編碼轉換 preg_match_all('/<table id="Table6" [^>]*>([\s\S]*?)<\/table>/',$contents,$table);//用正則表達式將課表的表格取出 $arr = get_td_array($table[0][0]);//執行函數 //按星期天數將課表保存到二維數組裏 for ($d=1;$d<=7;$d++){ $shuzu[$d][1]=$arr[1][$d]; $shuzu[$d][2]=$arr[2][$d+1]; $shuzu[$d][3]=$arr[3][$d]; $shuzu[$d][4]=$arr[4][$d]; $shuzu[$d][5]=$arr[5][$d]; $shuzu[$d][6]=$arr[6][$d]; $shuzu[$d][7]=$arr[7][$d]; $shuzu[$d][8]=$arr[8][$d]; $shuzu[$d][9]=$arr[9][$d]; $shuzu[$d][10]=$arr[10][$d]; $shuzu[$d][11]=$arr[11][$d]; $shuzu[$d][12]=$arr[12][$d]; $shuzu[$d][13]=$arr[13][$d]; $shuzu[$d][14]=$arr[14][$d]; $shuzu[$d][15]=$arr[15][$d]; } $xq=date('w');//取出星期幾 //根據星期幾打印課表 if($shuzu[w]==null){ echo("你今天沒有課哦!"); }else print_r($shuzu[w]); curl_close($ch);//釋放curl句柄
基本步驟和代碼就是這樣了,雖然不是很複雜,但是當初我作爲一個初學者,畢竟花了很多時間才弄懂的。
如果要用在微信公衆平臺裏查詢,基本思路是這樣的,用戶先綁定學號(username)和密碼(password),然後服務器模擬登陸到教學管理系統,將課表提取出來,然後需要再用正則表達式將這個數組提取出來,保存到變量裏,回覆給用戶就行了。具體原理請參考微信的消息發送機制。