Day 8课堂笔记

以下为我所学,破解滑动验证

'''
破解极验滑动验证
博客园登录url:
    https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F
1、输入用户名与密码,并点击登录
2、弹出滑动验证,获取有缺口与完整的图片
3、通过像素点进行比对,获取滑动位移距离
4、模拟人的行为轨迹
5、开始滑动
'''

from selenium import  webdriver
from selenium.webdriver import ActionChains
import  time
from PIL import Image
import  random
def get_distance(image1,image2):
    start = 60

    num = 60
    print(image1.size)
    for x in range (start,image1.size[0]):
        for y in range(image1.size[1]):
            rgb1 = image1.load()[x,y]
            rgb2 = image2.load()[x,y]
            print(rgb1,rgb2)
            r = abs(rgb1[0]-rgb2[0])
            g = abs(rgb1[1]-rgb2[1])
            b = abs(rgb1[2]-rgb2[2])


            if not (r<num and g<num and b<num):
                return x-7
def cut_image(driver):
    driver.save_screenshot('snap.png')

    image = driver.find_element_by_class_name('geetest_canvas_img')
    print(image.location)
    print(image.size)


    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('snap.png')


    img = image_obj.crop((left,top,right,buttom))

    #img.show()
    return img

def get_image1(driver):
    time.sleep(2)
    js_code = '''
            var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display= "block";
    '''
    driver.execute_script(js_code)
    image = cut_image(driver)
    return  image

def get_image2(driver):
    time.sleep(2)

    js_code = '''
            var x = document.getElementsByClassName("geetest_canvas_fullbg")[0].style.display = "none";
    '''

    driver.execute_script(js_code)

    image = cut_image(driver)
    return  image

def get_strck_move(distance):
    distance += 20

    '''
    滑动行为轨迹
    加速公式:
        v = v0 + a * t

    路程公式:
        s = v0 * t + 0.5 * a * (t ** 2)
    '''

    # 初速度
    v0 = 0

    # 时间
    t = 0.2

    # 位置
    s = 0

    # 滑动轨迹列表 向前滑动列表
    move_list = []

    # 中间值,作为加减速度的位置
    mid = distance / 5 * 3

    # 加减速度列表
    v_list = [1, 2, 3, 4]

    # 循环位移
    while s < distance:
        if s < mid:
            # 随机获取一个加速度
            a = v_list[random.randint(0, len(v_list) - 1)]

        else:
            # 随机获取一个减速度
            a = -v_list[random.randint(0, len(v_list) - 1)]

        '''
        匀加速\减速运行
        v = v0 + a * t

        位移:
        s = v * t + 0.5 * a * (t**2)
        '''
        # 获取初始速度
        v = v0

        # 路程公式:
        s1 = v * t + 0.5 * a * (t ** 2)
        s1 = round(s1)  # 取整

        # 加速公式:
        # v = v0 + a * t
        m_v = v + a * t

        # 把当前加/减速度赋值给初始速度,以便下一次计算
        v0 = m_v

        # 把位移添加到滑动列表中
        move_list.append(s1)

        # 修改滑动初始距离
        s += s1

    # 后退列表, 自定义后退滑动轨迹,必须是负值
    back_list = [-1, -1, -2, -3, -2, -1, -1, -2, -3, -2, -1, -1]

    return {'move_list': move_list, 'back_list': back_list}


def main():
    driver = webdriver.Chrome()
    driver.implicitly_wait(10)
    driver.get('https://account.cnblogs.com/signin?returnUrl=https%3A%2F%2Fwww.cnblogs.com%2F')
    user_input = driver.find_element_by_id('LoginName')
    user_input.send_keys('****)
    time.sleep(0.2)

    pwd_input = driver.find_element_by_id('Password')
    pwd_input.send_keys('******)
    time.sleep(2)

    login_submit = driver.find_element_by_id('submitBtn')
    login_submit.click()
    image1 = get_image1(driver)
    # image1 = get_image1(driver)
    image2 = get_image2(driver)
    distance = get_distance(image1,image2)
    print(distance)

    move_dict = get_strck_move(distance)
    move_list = move_dict['move_list']
    back_list = move_dict['back_list']

    move_tag = driver.find_element_by_class_name('geetest_slider_button')

    ActionChains(driver).click_and_hold(move_tag).perform()
    for move in move_list:
        ActionChains(driver).move_by_offset(xoffset=move,yoffset=0).perform()
        time.sleep(0.1)
    time.sleep(0.1)

    for back in back_list:
        ActionChains(driver).move_by_offset(xoffset=back,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()
    time.sleep(0.1)

    ActionChains(driver).release().perform()
    time.sleep(100)

if __name__ == '__main__':
     main()

今天只学习了一上午,但是知道了滑动验证的破解就是先找出一张完整的照片,再与有空缺的照片进行对比,最后通过设置滑动路径模拟人进行滑动从而破解,绝的好神奇。

猜你喜欢

转载自www.cnblogs.com/-zcj/p/11056487.html
今日推荐