欢迎光临
我们一直在努力

Python通过百度api识别验证码 并实现自动登陆功能

1.使用的库

使用的库:baidu-aip, pillow, selenium.
如果没有安装,可以在cmd中输入:

私信小编01即可获取大量Python学习资料

pip install baidu-aip
pip install pillow 
pip install selenium

2.实现功能

(1)账号密码的输入

 

 

以上是我校综合服务平台登陆网站的一部分,想要实现自动登陆,账号密码可以通过selenium的

find_element_by_id()
send_keys()

来进行自动输入账号密码。

功能实现代码如下:

account=driver.find_element_by_id('account')
account.send_keys('') #你自己的账号

password=driver.find_element_by_id('password')
password.send_keys('') #你自己的密码

关于element的详细使用方法请参考其他博文

(3) 验证码的获取与识别

验证码的识别请参考我的另一篇文章:
Python通过百度API进行文字识别(baidu-aip)一:简单识别验证码
这里简单描述如何获取二维码。

(一)

首先使用selenium的maxside_window()使得窗口最大化,接着使用save_screenshot()来保存网站截图。

driver=webdriver.Chrome()
driver.maximize_window()
time.sleep(1)
url='https://' #这里填你想要的网站
driver.get(url)
driver.save_screenshot('D:/PYTHON/baidu_ocr/save_screenshot.png') #储存地址可以选你喜欢的(尽量不要有空格和中文,有时会有奇奇怪怪的问题)

(二)

接着获取验证码在网站上具体位置,然后获取验证码的长宽,即可得出验证码的四个点的位置。用crop()函数处理刚刚获取的网站截图,从而获取验证码的图片。

code_ele = driver.find_element_by_id('codeimg')
print("验证码的坐标为:", code_ele.location)
print("验证码的大小为:", code_ele.size)
#验证码的坐标为: {'x': 1723, 'y': 581}
#验证码的大小为: {'height': 48, 'width': 96}

# (4)图片4个点的坐标位置
left = code_ele.location['x']#x点的坐标
top = code_ele.location['y']#y点的坐标
right = code_ele.size['width']+left#上面右边点的坐标
down = code_ele.size['height']+top#下面右边点的坐标
image = Image.open('')
#这里请填你截图所存的地方
code_image=image.crop((left,top,right,down))
code_image.save('D:/PYTHON/baidu_ocr/code_image.png')

(三)

调用百度图片识别API,对储存在本地的二维码进行识别,具体使用方法请见:Python通过百度API进行文字识别(baidu-aip)一:简单识别验证码

APP_ID=''
API_KEY=''
SECRET_KEY=''
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
    
#读取图片 

def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

image = get_file_content('D:/PYTHON/baidu_ocr/code_image.png')

# 调用通用文字识别(高精度版) """
code_ocr_original_result=client.basicAccurate(image)

(四)

对百度识图API输出的结果进行处理。
百度API识图输出的格式如下:

{
“log_id”: 2471272194,
“words_result_num”: 2,
“words_result”:
[
{“words”: " TSINGTAO"},
{“words”: “青島睥酒”}
]
}

可以看出“word”的内容是有效的,现在来提取words的内容,代码参考如下:

for text in code_ocr_original_result.get('words_result'):
    code_ocr_final_result=text.get('words')
    print(text.get('words'))

提取出来的words有时候会含有空格(验证码字符大小不一,百度会将空隙识别成空格)

code_ocr_final_result_with_out=code_ocr_final_result.replace(' ','')

(五)

输入验证码

code_input=driver.find_element_by_id('rancode')
code_input.send_keys(code_ocr_final_result_with_out)

3.代码

from aip import AipOcr
from selenium import webdriver
import time
from PIL import Image

driver=webdriver.Chrome()
driver.maximize_window()
time.sleep(1)
url='https://'
driver.get(url)
driver.save_screenshot('D:/PYTHON/baidu_ocr/save_screenshot.png')

code_ele = driver.find_element_by_id('codeimg')
print("验证码的坐标为:", code_ele.location)
print("验证码的大小为:", code_ele.size)
#验证码的坐标为: {'x': 1723, 'y': 581}
#验证码的大小为: {'height': 48, 'width': 96}

# (4)图片4个点的坐标位置
left = code_ele.location['x']#x点的坐标
top = code_ele.location['y']#y点的坐标
right = code_ele.size['width']+left#上面右边点的坐标
down = code_ele.size['height']+top#下面右边点的坐标
image = Image.open('D:/PYTHON/baidu_ocr/save_screenshot.png')
code_image=image.crop((left,top,right,down))
code_image.save('D:/PYTHON/baidu_ocr/code_image.png')

APP_ID=''
API_KEY=''
SECRET_KEY=''
client = AipOcr(APP_ID, API_KEY, SECRET_KEY)
    
#读取图片 

def get_file_content(filePath):
    with open(filePath, 'rb') as fp:
        return fp.read()

image = get_file_content('D:/PYTHON/baidu_ocr/code_image.png')

# 调用通用文字识别(高精度版) """
code_ocr_original_result=client.basicAccurate(image)
print('code ocr original result:')
print(code_ocr_original_result)
print('final code result:')
for text in code_ocr_original_result.get('words_result'):
    code_ocr_final_result=text.get('words')
    print(text.get('words'))
code_ocr_final_result_with_out=code_ocr_final_result.replace(' ','')
account=driver.find_element_by_id('account')
account.send_keys('')

password=driver.find_element_by_id('password')
password.send_keys('')

code_input=driver.find_element_by_id('rancode')
code_input.send_keys(code_ocr_final_result_with_out)

code_input.submit()
time.sleep(10)
end=input('press any key to go out')

在利用了百度高精度文字识别api后,验证码的识别成功率大大提高,成功率大约在70%左右,还是不错的。本自动登陆仅用于学习之用。

 收藏 (0) 打赏

您可以选择一种方式赞助本站

支付宝扫一扫赞助

微信钱包扫描赞助

未经允许不得转载:英协网 » Python通过百度api识别验证码 并实现自动登陆功能

分享到: 生成海报
avatar

热门文章

  • 评论 抢沙发

    • QQ号
    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址

    登录

    忘记密码 ?

    切换登录

    注册

    我们将发送一封验证邮件至你的邮箱, 请正确填写以完成账号注册和激活