cURL模擬登錄教學管理系統

最近在開發微信公衆平臺,想實現通過微信查詢課表的功能。無奈本人業務不精,之前對微信公衆平臺不是很瞭解,甚至對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('/&nbsp;/',"",$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),然後服務器模擬登陸到教學管理系統,將課表提取出來,然後需要再用正則表達式將這個數組提取出來,保存到變量裏,回覆給用戶就行了。具體原理請參考微信的消息發送機制。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章