一.使用的模块:
1.selenium
2.PIL
二.使用的技术:
没有做任何反模拟滑动的技术
三.代码:
import time
import random
from PIL import Image
from io import BytesIO
from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.action_chains import ActionChains
class BiLi:
longin_url = ''
username = ""
password = ""
def __init__(self):
chrom_options = Options()
self.browser = webdriver.Chrome(executable_path="./chromedriver.exe", options=chrom_options)
def crop_imge(self, image_file_name):
time.sleep(2)
img = self.browser.find_element_by_css_selector(".geetest_canvas_img.geetest_absolute")
location = img.location
print("图片的位置: ", location)
size = img.size
top, buttom, left, right = location["y"], location["y"] + size["height"], location["x"], location["x"] + size[
"width"]
print("验证码截图坐标: ", left, top, buttom, right)
screen_shot = self.browser.get_screenshot_as_png()
screen_shot = Image.open(BytesIO(screen_shot))
captcha = screen_shot.crop((int(left ), int(top ), int(right ), int(buttom )))
captcha.save(image_file_name)
return captcha
def check_login(self):
try:
self.browser.find_element_by_xpath('//span[contains(text(), "创作中心")]')
return True
except Exception as e:
return False
def login(self):
try:
self.browser.maximize_window()
except Exception as e:
print("d")
pass
while not self.check_login():
self.browser.get(self.longin_url)
username = self.browser.find_element_by_xpath('//input[@id="login-username"]').send_keys(self.username)
password = self.browser.find_element_by_xpath('//input[@id="login-passwd"]').send_keys(self.password)
submit = self.browser.find_element_by_xpath('//a[@class="btn btn-login"]').click()
time.sleep(5)
self.browser.execute_script('document.querySelectorAll("canvas")[3].style=""')
image1 = self.crop_imge("captcha1.png")
self.browser.execute_script('document.querySelectorAll("canvas")[3].style="display: none;"')
iamge2 = self.crop_imge("captcha2.png")
img1 = Image.open("captcha1.png")
img2 = Image.open(("captcha2.png"))
left = 60
has_find = False
for i in range(60, img1.size[0]):
if has_find:
break
for j in range(img1.size[1]):
if not self.compare_pixel(img1, img2, i, j):
left = i
has_find = True
break
left -= 9
print(left)
track = []
current = 0
mid = left * 3 / 4
t = 1
v = 0
while current < left:
if current < mid:
a = random.randint(2, 3)
else:
a = - random.randint(6, 7)
v0 = v
v = v0 + a * t
s = v0 * t + 1 / 2 * a * t * t
current += s
track.append(round(s))
slider = self.browser.find_element_by_css_selector(".geetest_slider_button")
ActionChains(self.browser).click_and_hold(slider).perform()
for x in track:
ActionChains(self.browser).move_by_offset(xoffset=x, yoffset=0).perform()
time.sleep(0.5)
ActionChains(self.browser).release().perform()
time.sleep(3)
def compare_pixel(self, img1, img2, x, y):
pixel1 = img1.load()[x, y]
pixel2 = img2.load()[x, y]
threshold = 60
for i in range(len(pixel1)):
if abs(pixel1[i] - pixel2[i]) > threshold:
return False
return True
if __name__ == '__main__':
bili = BiLi()
bili.login()