我都不想說什麼,我研究了半年的驗證碼識別,最後發現,原來正方教務系統登錄方式可以繞過驗證碼,,簡直吐血
開始打算做一個采集教務系統成績和課表的功能,但驗證碼成了攔路虎。
我“機智”用獲取驗證碼,然後cookies記錄驗證碼,再跟正方服務器對比來完成驗證碼登錄,,最後發現這步可以直接跳過去。
正方有一個功能:後台開啟驗證碼,就是他的驗證碼功能是可選的。說不白了,就是你不請求服務器就不會生成驗證碼。
然後,你只需要幾行代碼就是完成遠程登錄教務系統,主要隱藏域
public function login(){ $url = C('School_url')."default2.aspx"; $post['__VIEWSTATE'] = 'dDwyODE2NTM0OTg7Oz69gdYBizSXHwj9xCoAQeszC5eGfw=='; $post['__VIEWSTATEGENERATOR'] = '92719903'; $post['txtUserName'] = '學號'; $post['TextBox2'] = '密碼'; $post['txtSecretCode'] = ''; $post['lbLanguage'] = ''; $post['RadioButtonList1'] = iconv('utf-8', 'gb2312', '學生'); $post['Button1'] = iconv('utf-8', 'gb2312', '登錄'); $result = $this->curl_Login($url,$post); print_r($result); return $result; }
然後是CURL請求的代碼,,記得cookies這個東西是必須要有的,PHP開啟的curl跟游覽器不是一個進程,不共用cookies
所以要用CURL的抓取cookies的方法
curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie_file); //在CURL請求中發送cookies值 curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie_file); //在CURL請求中,把head頭的cooked存入到指定的文件中
使用這兩個方法就能操作curl中的cookies。
然後,,你就會發現,你沒有輸入驗證碼通過學號和密碼就已經登錄到教務系統了。然後怎麼回去成績和課表呢?