標籤:ror highlight code src tde print nec open inpu
python 簡單Image Recognition--驗證碼Ⅲ
實現自動登陸網站
登入學校圖書館管理系統為例,做一個簡單的例子。python識別簡單的沒有幹擾的純數字驗證碼還是可以的,但是識別字母數字再加上幹擾因素,誤判率很高,因此這個我是採用”人工識別“,人工輸入。
首先得明白cookie的作用,cookie是某些網站為了辨別使用者身份、進行session跟蹤而儲存在使用者本地終端上的資料。因此我們需要用Cookielib模組來保持網站的cookie。
登入學校圖書館管理系統登陸(http://122.207.221.227:8080/opac/login),驗證碼(http://122.207.221.227:8080/kaptcha/goldlib)
可以發現這個驗證碼是動態更新的每次開啟都不一樣,一般這種驗證碼和cookie是同步的。想識別驗證碼肯定是吃力不討好的事,因此我們的思路是首先訪問驗證碼頁面,儲存驗證碼、擷取cookie用於登入,然後再直接向登入地址post資料。
先分析登入頁面需要post的request和header資訊
從中可以看出需要 post 的url並不是訪問的頁面,而是(http://122.207.221.227:8080/pages/include/checklogin.jsp)
其中需要提交的表單資料中 username 和 password 分別使用者名稱和密碼。
分析了上面的因素,下面就直接貼出代碼。
#coding=utf-8from PIL import Imageimport pytesseractimport urllib2import urllibimport PIL.ImageOpsimport requestsimport cookielibimport reimport sys‘‘‘圖書館登陸‘‘‘reload(sys)sys.setdefaultencoding("utf-8") #防止中文報錯url = ‘http://122.207.221.227:8080/pages/include/checklogin.jsp‘capchaurl = ‘http://122.207.221.227:8080/kaptcha/0.5458022691509324‘cookie = cookielib.CookieJar() # 將cookies綁定到一個opener cookie由cookielib自動管理handler = urllib2.HTTPCookieProcessor(cookie)opener = urllib2.build_opener(handler)username=‘xxxxx‘password=‘xxxxx‘ #使用者名稱,密碼callNo = ‘callNo‘picture = opener.open(capchaurl).read() # 用openr訪問驗證碼地址,擷取cookielocal = open(‘C:\Users\ww\Desktop\goldlib.jpg‘,"wb") # 儲存驗證碼到本地local.write(picture)local.close()secrecode = raw_input(‘yanzhengma: ‘) # 輸入驗證碼postData = { ‘username‘: username,‘password‘: password,‘loginType‘: callNo,‘kaptcha‘: secrecode,} # 抓包資訊 構造表單headers = { ‘Accept‘: ‘*/*‘,‘Accept-Encoding‘: ‘gzip, deflate‘,‘Accept-Language‘: ‘zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2‘,‘Connection‘: ‘keep-alive‘,‘Content-Length‘: ‘64‘,‘Content-Type‘: ‘application/x-www-form-urlencoded‘,‘Host‘: ‘122.207.221.227:8080‘,‘Referer‘: ‘http://122.207.221.227:8080/opac/login‘,‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.3; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0‘,‘X-Requested-With‘: ‘XMLHttpRequest‘,} # 根據抓包資訊 構造headersdata = urllib.urlencode(postData) # 產生post資料 ?key1=value1&key2=value2的形式request = urllib2.Request(url,data,headers) #構造request請求try:response = opener.open(request)result = response.read().decode(‘utf-8‘)print resultexcept urllib2.HTTPError, e:print e.code
示範結果
python 簡單Image Recognition--驗證碼Ⅲ