目前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()