下载好有关库以及工具(csdn中有安装教程):
安装好两个请求库requests,selenium
在cmd中输入命令安装:
pip install requests
pip install selenium
安装两个工具:
在cmd中输入命令安装PIL库:
pip install pillow
chromedriver的安装
首先查找chrome的版本号,再到官网或者镜像网站下载。注意相关配置
在使用chromedriver时以下情况浏览器会发生闪退:
chromedriver与chrome的版本号不同
下载的selenium版本过高(之前下载最新版本会发生闪退,我用的4.1.1版本)
pip install selenium == 4.1.1
使用webdriver时作为局部变量使用
注册图灵识别及了解相关调用
首先需要到图灵识别官网注册账号,官网地址:在线图片验证码识别平台-图像验证码识别打码平台-图片验证码打码平台-图灵
当调用API时选择图中红圈标记的类型。
以下是其python的API调用
等会在程序中需要使用是时直接复制此函数
通过selenium调用图灵识别API通过b站验证码的识别
在使用webdriver执行相关操作时,会发现其窗口尺寸像素与电脑截图像素有明显的区别
例如在设置窗口大小时:
browser.set_window_size(1200, 1000)
a = browser.get_window_size()
运行结果为:
而在我的图片截图尺寸为
width为2374,height为1728。与窗口的大小明显不同。
在使用selenium以浏览器窗口的像素为基准。在使用截图或者调用以窗口像素为基准。
我们就是使用width_stretch_rate,height_stretch_rate来进行两者的尺寸转化。
此段代码在执行偏移时,是以鼠标上次的位置进行移动
actions = ActionChains(browser).move_by_offset(x_coord, y_coord).click().perform()
actions = ActionChains(browser).move_by_offset(-x_coord, -y_coord).perform()
由于图灵api返回的是相对与起初一个点的位置。所以我们执行完一次点击操作后需要回到起初一个点,再进行其他操作,如上图演示代码所示。
当然也可以用当前位置减去上一次位置来计算偏移。
以下是源代码及相关测试结果
import time
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from PIL import Image
import base64
import json
import requests
from selenium.webdriver import ActionChains
url = 'https://passport.bilibili.com/login'
username = 'b站账号'
password = 'b站密码'
browser = webdriver.Chrome()
browser.set_window_size(1200, 1000)
wait = WebDriverWait(browser, 20)
# 调用图灵识别API
def b64_api(username, password, img_path, ID):
with open(img_path, 'rb') as f:
b64_data = base64.b64encode(f.read())
b64 = b64_data.decode()
data = {"username": username, "password": password, "ID": ID, "b64": b64, "version": "3.1.1"}
data_json = json.dumps(data)
result = json.loads(requests.post("http://www.fdyscloud.com.cn/tuling/predict", data=data_json).text)
return result
# 自动输入用户账户密码
def input_bilibili_info(url):
browser.set_page_load_timeout(60)
browser.get(url)
account_login = '#app > div.login_wp > div.login__main > div.main__right > ' \
'div.login-pwd > div.tab__form > div:nth-child(1) > input[type=text]'
password_login = '#app > div.login_wp > div.login__main > div.main__right > ' \
'div.login-pwd > div.tab__form > div:nth-child(3) > input[type=password]'
account_1 = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, account_login)))
# 注意此处presence_of_element_located的参数为元组,find_element才有参数为value
account_1.send_keys(username)
password_1 = wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, password_login)))
password_1.send_keys(password)
button_click = '#app > div.login_wp > div.login__main > div.main__right > ' \
'div.login-pwd > div.btn_wp > div.btn_primary'
button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, button_click)))
button.click()
# 通过验证码识别
def pass_touclick():
time.sleep(2)
browser.get_screenshot_as_file('browser.png')
img = Image.open('browser.png')
width = img.size[0]
height = img.size[1]
# 此处求横向与纵向的拉伸率
width_stretch_rate = 1200 / int(width)
height_stretch_rate = 1000 / int(height)
cropped_image = img.crop((862, 470, 1473, 1171))
image_name = 'image.png'
cropped_image.save(image_name)
# 调用图灵识别API完成验证码识别
img_path = image_name
result_json = b64_api(username="你的账号", password="你的密码", img_path=img_path, ID="08272733")
# 此处id为模型id
print(result_json)
result_data = result_json['data']
try:
for i in range(len(result_data)):
result_order = result_data[f'顺序{i + 1}']
# print(result_order['X坐标值'], result_order['Y坐标值'])
x_coord = int((int(result_order['X坐标值']) + 862) * width_stretch_rate)
y_coord = int((int(result_order['Y坐标值']) + 380) * height_stretch_rate)
print(x_coord, y_coord)
actions = ActionChains(browser).move_by_offset(x_coord, y_coord).click().perform()
actions = ActionChains(browser).move_by_offset(-x_coord, -y_coord).perform()
time.sleep(2)
except Exception as e:
print(e)
# 点击完成验证码识别
def click_confirm_button():
confirm_button = 'body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_panelshowclick > ' \
'div.geetest_panel_next > div > div > div.geetest_panel > a > div'
browser.find_element(By.CSS_SELECTOR, confirm_button).click()
input_bilibili_info(url)
pass_touclick()
click_confirm_button()
将你的账号及密码填好后,运行结果图片
然后执行此代码就可以自动确认登录b站
def click_confirm_button():
confirm_button = 'body > div.geetest_panel.geetest_wind > div.geetest_panel_box.geetest_panelshowclick > ' \
'div.geetest_panel_next > div > div > div.geetest_panel > a > div'
browser.find_element(By.CSS_SELECTOR, confirm_button).click()
如有错误或则改进之处欢迎各位提出
改编来源:使用 图灵验证码识别平台+Python+Selenium,智能识别B站/bilibili的中文验证码,并实现自动登陆_NiYouDu2333的博客-CSDN博客