破解博客园滑动验证码

from selenium import webdriver
from selenium.webdriver import ChromeOptions
from selenium.webdriver import ActionChains
from selenium.webdriver.common.keys import Keys
import random
from PIL import Image
import time

option = ChromeOptions()
option.add_argument("disable-infobars")


#截取图片
def cup_image(driver):
    #保存浏览器全屏图片
    driver.save_screenshot("xxx.png")
    image = driver.find_element_by_class_name(
        "geetest_canvas_img"
    )
    left = image.location["x"]
    top = image.location["y"]
    right = left+image.size["width"]
    buttom = top + image.size["height"]

    print(left,top,right,buttom)

    #获取屏幕图片对象
    image_obj = Image.open("xxx.png")

    #开始截取图片
    image1 = image_obj.crop((left,top,right,buttom))

    return image1


#获取没有缺口的图片







#获得没有缺口的照片
def get_image1(driver):
    js = '''
      var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="block";
      '''
    driver.execute_script(js)
    time.sleep(1)
    image1 = cup_image(driver)
    time.sleep(1)
    return image1

#对获取有缺口一张图片
def get_image2(driver):
    js = '''
       var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display="none";
       '''

    driver.execute_script(js)
    time.sleep(1)
    image2 = cup_image(driver)
    time.sleep(1)
    return image2

#对比两张图片获得滑动距离
def get_distance(img1,img2):
    #滑动初始值
    start = 60

    #像素差值
    color_num= 60
    #循环遍历图片的宽与高取每一个位置的x与y轴
    for x in range(start,img1.size[0]):
        for y in range(img1.size[1]):#
            #获取图片1的每个坐标
            rgb1 = img1.load()[x,y]
            #获取图片2每个坐标的像素
            rgb2 = img2.load()[x,y]
            #获取像素的绝对值
            r = abs(rgb1[0]-rgb2[0])
            g = abs(rgb1[1]-rgb2[1])
            b = abs(rgb1[2]-rgb2[2])

            if not (r<color_num and g<color_num and b< color_num):
                return x-7



def get_move(distance):
    distance+=20

    #初速度为0
    v0 = 0
    #加速度列表
    a_list = [2,3,4]
    #时间
    t = 0.2
    #初始位移
    s = 0


    #人的滑动轨迹列表
    move_list = []

    #中间值
    mid = distance*0.6
    #判断如果位移小于总距离
    while s < distance:
        if s< mid:
            a = a_list[random.randint(0,2)]
        else:
            a = - a_list[random.randint(0,2)]

        v = v0
        #计算位移
        move = v0 * t +0.5 * a*(t**2)
        move = round(move)#去掉小数

        #把当前速度替换给初始速度
        v0 = v +a*t
        #替换初始位移
        s+=move
        move_list.append(move)

    #回退列表
    back_list = [-1, -2, -1, -1, -2, -3, -3, -2, -2, -1, -1, -1]
    print(444444)
    return {"move_list":move_list,"back_list":back_list}






def main():
    driver = webdriver.Chrome(chrome_options=option)
    try:
        login_url="https://account.cnblogs.com/signin?returnUrl=http%3a%2f%2fhome.cnblogs.com%2fu%2ftangda%2f"
        driver.get(login_url)
        driver.implicitly_wait(10)

        #1输入用户名与密码 并点击登录
        user = driver.find_element_by_id("LoginName")
        pwd = driver.find_element_by_id("Password")
        user.send_keys("会飞的猫1122")
        pwd.send_keys("*********")
        time.sleep(1)

        button = driver.find_element_by_id("submitBtn")
        button.click()
        time.sleep(3)



        #1获取没有缺口的照片
        image1 = get_image1(driver)

        #2获取有缺口的照片
        image2 = get_image2(driver)

        distance = get_distance(image1,image2)

        print(distance)
        #模拟人的滑动轨迹
        move_dict = get_move(distance)
        print(2222222)
        #前进的轨迹
        move_list = move_dict.get("move_list")


        #后退的轨迹
        back_list = move_dict.get("back_list")
        print(11111)
        move_button = driver.find_element_by_class_name("geetest_slider_button")
        ActionChains(driver).click_and_hold(move_button).perform()
        print(222222)


        #开始滑动
        #前进
        for x in move_list:
            ActionChains(driver).move_by_offset(xoffset=x,yoffset=0).perform()
            time.sleep(0.1)

        #后退
        for x in back_list:
            ActionChains(driver).move_by_offset(xoffset=x,yoffset=0).perform()
            time.sleep(0.1)

        #虚晃
        ActionChains(driver).move_by_offset(xoffset=-3,yoffset=0).perform()
        ActionChains(driver).move_by_offset(xoffset=3,yoffset=0).perform()


        #释放动作lian链
        ActionChains(driver).release().perform()
        time.sleep(1000)





    finally:
        driver.close()

if __name__ == '__main__':
    main()
原文地址:https://www.cnblogs.com/tangda/p/10946123.html