python-B站登陆滑动验证码

目前7.16号成功,通过概率大概在80%左右,废了好大劲

import time
import random
import base64
from PIL import Image
from selenium import webdriver
from selenium.webdriver import ActionChains     #动作链
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait     #等待时间
from selenium.webdriver.support import expected_conditions as EC

THRESHOLD = 60
LEFT = 64
BORDER = 11

USERNAME='18834161583'
PASSWORD='wjh07233'

class BiliBili():
    def __init__(self):
        self.url='https://passport.bilibili.com/login'
        self.browser=webdriver.Chrome()
        self.browser.get(self.url)
        self.wait=WebDriverWait(self.browser,20)     #指定最长等待时间为20s
        self.username=USERNAME
        self.password=PASSWORD
        self.browser.set_window_size(1920, 1080)

    def login(self):   #登陆
        input1 = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#login-app #geetest-wrap li.item.username.status-box>input')))
        input1.clear()
        time.sleep(2)
        input1.send_keys(self.username)
        time.sleep(3)
        input2 = self.wait.until(EC.presence_of_element_located((By.CSS_SELECTOR, '#login-app #geetest-wrap li.item.password.status-box>input')))
        input2.clear()
        input2.send_keys(self.password)
        submit=self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn.btn-login')))
        time.sleep(0.5)
        submit.click()

    def get_geetest_button(self):    #滑块位置
        button=self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.geetest_slider_button')))
        return button

    def refresh_img(self):
        element = self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, 'a.geetest_refresh_1')))
        element.click()
        time.sleep(1)

    def save_img(self, img_name, class_name):
        getImgJS = 'return document.getElementsByClassName("' + class_name + '")[0].toDataURL("image/png");'
        img = self.browser.execute_script(getImgJS)
        base64_data_img = img[img.find(',') + 1:]
        image_base = base64.b64decode(base64_data_img)
        with open(img_name, 'wb') as f:
            f.write(image_base)

    def get_gap(self, image1, image2):
        for i in range(LEFT, image1.size[0]):
            for j in range(image1.size[1]):
                if not self.is_pixel_equal(image1, image2, i, j):
                    return i
        return LEFT

    def is_pixel_equal(self, image1, image2, x, y):
        pixel1 = image1.load()[x, y]
        pixel2 = image2.load()[x, y]
        for i in range(0, 3):
            if abs(pixel1[i] - pixel2[i]) >= 50:
                return False
        return True

    def get_track(self, distance):
        track = []
        current = 0
        mid = distance * 3 / 4
        t = random.randint(2, 3) / 10
        v = 0
        while current < distance:
            if current < mid:
                a = 2
            else:
                a = random.randint(3,4)
            v0 = v
            v = v0 + a * t
            move = v0 * t + 1 / 2 * a * t * t
            current += move
            track.append(round(move))
        return track

    def get_slider(self):
        return self.wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.geetest_slider_button')))

    def move_to_gap(self, button, track):
        ActionChains(self.browser).click_and_hold(button).perform()   #执行动作
        for i in track:
            ActionChains(self.browser).move_by_offset(xoffset=i, yoffset=0).perform()
            time.sleep(0.00053)
        tt=random.uniform(1, 2)
        time.sleep(tt)
        imitate = ActionChains(self.browser).move_by_offset(xoffset=-1, yoffset=0)
        time.sleep(0.015)
        imitate.perform()
        time.sleep(random.randint(6, 10) / 10)
        imitate.perform()
        time.sleep(0.04)
        imitate.perform()
        time.sleep(0.012)
        imitate.perform()
        time.sleep(0.019)
        imitate.perform()
        time.sleep(0.033)
        ActionChains(self.browser).move_by_offset(xoffset=1, yoffset=0).perform()
        ActionChains(self.browser).release().perform()   #松开鼠标

    def crack(self):
        self.login()
        while 1:
            self.refresh_img()
            self.save_img('full.jpg', 'geetest_canvas_fullbg')
            self.save_img('cut.jpg','geetest_canvas_bg')
            image1= Image.open('full.jpg')
            image2= Image.open('cut.jpg')
            gap = self.get_gap(image1, image2)
            track = self.get_track(gap - BORDER)
            slider = self.get_slider()
            self.move_to_gap(slider, track)
            time.sleep(2)
            if self.browser.current_url=='https://www.bilibili.com/':
                break


if __name__ == '__main__':
    test = BiliBili()
    test.crack()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值