如何使用python自动验证登录b站

下载好有关库以及工具(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博客 

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值