• 破解博客园滑动验证码


    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()
  • 相关阅读:
    C#中的接口和类的不同点
    值类型和引用类型的区别?
    时隔两年再次操刀NPOI合并单元格
    二.Docker下安装和运行Mysql
    一.CentOS8下的Docker安装
    .NetCore3.1使用Autofac
    .NET Core 3.1使用Swagger
    数组排序和数组对象排序
    C# 操作Excel , 支持超链接 跳转Sheet 页面,HSSFHyperlink函数
    MVC导入Excel通过NPOI
  • 原文地址:https://www.cnblogs.com/tangda/p/10946123.html
Copyright © 2020-2023  润新知