驗證碼識別
- 基於線上的大碼平台識別驗證碼
- 打碼平台 :
1、超級鷹(常用)先注冊(用戶中心的身份)-->登錄(用戶中心) 官網:http://www.chaojiying.com/about.html
2、雲打碼
3、打碼兔
超級鷹的使用流程
- 注冊登錄
- 查詢余額,請充值
- 創建一個軟件ID
- 下載一個示例代碼
- 需要將驗證碼下載到本地,然后才能識別
注冊然后登錄:
充值1元錢可以后期1000積分,1000積分大概可以使用100多次。
生成軟件ID
開發文檔中下載實例代碼:
下載后修改代碼
#!/usr/bin/env python # coding:utf-8 import requests from hashlib import md5 class Chaojiying_Client(object): def __init__(self, username, password, soft_id): self.username = username password = password.encode('utf8') self.password = md5(password).hexdigest() self.soft_id = soft_id self.base_params = { 'user': self.username, 'pass2': self.password, 'softid': self.soft_id, } self.headers = { 'Connection': 'Keep-Alive', 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', } def PostPic(self, im, codetype): """ im: 圖片字節 codetype: 題目類型 參考 http://www.chaojiying.com/price.html """ params = { 'codetype': codetype, } params.update(self.base_params) files = {'userfile': ('ccc.jpg', im)} r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) return r.json() def ReportError(self, im_id): """ im_id:報錯題目的圖片ID """ params = { 'id': im_id, } params.update(self.base_params) r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers) return r.json() def tranformImgCode(imgPath, imgType): chaojiying = Chaojiying_Client('username', 'password', 'ID') # 用戶中心>>軟件ID 生成一個替換 96001 im = open(imgPath, 'rb').read() # 本地圖片文件路徑 來替換 a.jpg 有時WIN系統須要// return chaojiying.PostPic(im, imgType) # 1902 驗證碼類型 官方網站>>價格體系 3.4+版 print 后要加() print(tranformImgCode('./a.jpg', 1902))
實例
模擬登錄:古詩文網 地址:https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx
模擬登錄流程:
對點擊登錄按鈕對應的請求進行發送(post請求),需要處理請求參數:用戶名、密碼、驗證碼、其他防偽參數
login.py
#!/usr/bin/env python # -*- coding: utf-8 -*- # author: 青城子 # datetime: 2021/7/17 15:39 # ide: PyCharm import requests from lxml import etree import chaojiying headers = { "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36', } session = requests.Session() # 識別驗證碼 # 使用超級鷹需要將驗證碼下載到本地 url = "https://so.gushiwen.cn/user/login.aspx?from=http://so.gushiwen.cn/user/collect.aspx" page_text = session.get(url=url, headers=headers).text # 解析驗證碼圖片的地址 tree = etree.HTML(page_text) img_src = "https://so.gushiwen.cn" + tree.xpath('//*[@id="imgCode"]/@src')[0] # 驗證碼圖片 # 將驗證碼圖片保存到本地 img_data = session.get(url=img_src, headers=headers).content with open("./code.jpg", "wb") as fp: fp.write(img_data) # 識別驗證碼 code_text = chaojiying.tranformImgCode("./code.jpg", 1902) print(code_text) login_url = "https://so.gushiwen.cn/user/login.aspx?from=http%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx" data = { "__VIEWSTATE": "bRb / aAzb7 + I + v8qJnjb / achUMrSTjgyK6TLoWB6wq4yEHtY / V1UnC1ckOq3rA / wkZRbfstT0lJHqG4RYQkykXTFV7eln2H + XkcN807hkVoueVgvuWernzqA8UeA =", "__VIEWSTATEGENERATOR": "C93BE1AE", "from": "http: // so.gushiwen.cn / user / collect.aspx", "email": "xxxxxxx@qq.com", "pwd": "xxxx", "code": code_text.get("pic_str"), # 驗證碼動態變化 "denglu": "登錄", } # 對點擊登錄按鈕發起請求:獲取了登錄成功后對應的頁面源碼數據 page_text_login = session.post(url=login_url, headers=headers, data=data).text with open("./gushiwend.html", "w", encoding="utf-8") as fp: fp.write(page_text_login)
chaojiying.py
超級鷹驗證碼
#!/usr/bin/env python # coding:utf-8 import requests from hashlib import md5 class Chaojiying_Client(object): def __init__(self, username, password, soft_id): self.username = username password = password.encode('utf8') self.password = md5(password).hexdigest() self.soft_id = soft_id self.base_params = { 'user': self.username, 'pass2': self.password, 'softid': self.soft_id, } self.headers = { 'Connection': 'Keep-Alive', 'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0)', } def PostPic(self, im, codetype): """ im: 圖片字節 codetype: 題目類型 參考 http://www.chaojiying.com/price.html """ params = { 'codetype': codetype, } params.update(self.base_params) files = {'userfile': ('ccc.jpg', im)} r = requests.post('http://upload.chaojiying.net/Upload/Processing.php', data=params, files=files, headers=self.headers) return r.json() def ReportError(self, im_id): """ im_id:報錯題目的圖片ID """ params = { 'id': im_id, } params.update(self.base_params) r = requests.post('http://upload.chaojiying.net/Upload/ReportError.php', data=params, headers=self.headers) return r.json() def tranformImgCode(imgPath, imgType): chaojiying = Chaojiying_Client('username', 'password', 'ID') # 用戶中心>>軟件ID 生成一個替換 96001 im = open(imgPath, 'rb').read() # 本地圖片文件路徑 來替換 a.jpg 有時WIN系統須要// return chaojiying.PostPic(im, imgType) # 1902 驗證碼類型 官方網站>>價格體系 3.4+版 print 后要加()