Python_day08

破解极验验证:

''''''
'''
破解极验滑动验证
博客园登录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  # pip3 install pillow
import random

option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')

driver = webdriver.Chrome(chrome_options=option)


def get_snap(driver):
    # selenium自带的截图网页全屏图片
    driver.save_screenshot('snap.png')

    img = driver.find_element_by_class_name('geetest_canvas_img')

    left = img.location['x']

    upper = img.location['y']

    right = left + img.size['width']
    lower = upper + img.size['height']

    # print(left, upper, right, lower)
    img_obj = Image.open('snap.png')

    # 对屏幕进行截取,获取滑动验证图片
    image = img_obj.crop((left, upper, right, lower))

    return image


def get_image1(driver):
    time.sleep(0.2)
    js_code = '''
    var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display="block";
    console.log(x)
    '''

    time.sleep(1)
    driver.execute_script(js_code)

    # 截取图片
    img_obj = get_snap(driver)

    return img_obj


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

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

    driver.execute_script(js_code)

    time.sleep(1)

    # 截取图片
    img_obj = get_snap(driver)

    return img_obj


def get_distance(image1, image2):
    # 初始值
    start = 60

    # 滑块色差
    color_num = 60

    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]

            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_stacks(distance):
    distance += 20

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

    位移:
    s = v * t + 0.5 * a * (t**2)
    '''

    # 初速度
    v0 = 0

    # 加减速度列表
    a_list = [3, 4, 5]

    # 时间
    t = 0.2

    # 初始位置
    s = 0

    # 向前滑动轨迹
    forward_stacks = []

    mid = distance * 3 / 5

    while s < distance:
        if s < mid:
            a = a_list[random.randint(0, 2)]

        else:
            a = -a_list[random.randint(0, 2)]

        v = v0

        stack = v * t + 0.5 * a * (t ** 2)

        # 每次拿到的位移
        stack = round(stack)

        s += stack

        v0 = v + a * t

        forward_stacks.append(stack)

    back_stacks = [-1, -1, -2, -3, -2, -3, -2, -2, -3, -1]

    return {'forward_stacks': forward_stacks, 'back_stacks': back_stacks}


def main():
    try:

        driver.get('https://passport.cnblogs.com/user/signin')
        driver.implicitly_wait(5)

        # 1.输入用户名与密码,点击登录
        username = driver.find_element_by_id('LoginName')
        password = driver.find_element_by_id('Password')
        login_button = driver.find_element_by_class_name('ladda-label')
        time.sleep(1)
        username.send_keys('123123')
        time.sleep(1)
        password.send_keys('123123.110')

        # 这里需要等待账号密码输入完毕后再点击登录按钮,否则的不弹框
        time.sleep(1)
        login_button.click()
        # time.sleep(3)

        # 2.点击滑动验证按钮,获取图片
        geetest_button = driver.find_element_by_class_name('geetest_slider_button')
        geetest_button.click()

        time.sleep(0.2)

        # 3.针对完整的图片进行截取
        image1 = get_image1(driver)

        # 4.针对有缺口的图片进行截取
        image2 = get_image2(driver)

        # 5.对比两张图片,获取滑动距离
        distance = get_distance(image1, image2)

        # 6.模拟人为滑动轨迹
        stacks = get_stacks(distance)

        # 7.根据滑动轨迹进行滑动
        forward_stacks = stacks['forward_stacks']
        back_stacks = stacks['back_stacks']

        slider_button = driver.find_element_by_class_name('geetest_slider_button')
        time.sleep(0.2)

        ActionChains(driver).click_and_hold(slider_button).perform()

        time.sleep(0.2)
        for forward_stack in forward_stacks:
            ActionChains(driver).move_by_offset(xoffset=forward_stack, yoffset=0).perform()
            time.sleep(0.1)
        for back_stack in back_stacks:
            ActionChains(driver).move_by_offset(xoffset=back_stack, yoffset=0).perform()
            time.sleep(0.1)

        time.sleep(0.2)

        ActionChains(driver).move_by_offset(xoffset=5, yoffset=0).perform()
        ActionChains(driver).move_by_offset(xoffset=-5, yoffset=0).perform()

        ActionChains(driver).release().perform()

        time.sleep(50)


    finally:
        driver.close()


if __name__ == '__main__':
    main()

 

''''''
'''
破解极验滑动验证
博客园登录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 # pip3 install pillow
import random

option = webdriver.ChromeOptions()
option.add_argument('disable-infobars')

driver = webdriver.Chrome(chrome_options=option)


def get_snap(driver):
# selenium自带的截图网页全屏图片
driver.save_screenshot('snap.png')

img = driver.find_element_by_class_name('geetest_canvas_img')

left = img.location['x']

upper = img.location['y']

right = left + img.size['width']
lower = upper + img.size['height']

# print(left, upper, right, lower)
img_obj = Image.open('snap.png')

# 对屏幕进行截取,获取滑动验证图片
image = img_obj.crop((left, upper, right, lower))

return image


def get_image1(driver):
time.sleep(0.2)
js_code = '''
var x = document.getElementsByClassName('geetest_canvas_fullbg')[0].style.display="block";
console.log(x)
'''

time.sleep(1)
driver.execute_script(js_code)

# 截取图片
img_obj = get_snap(driver)

return img_obj


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

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

driver.execute_script(js_code)

time.sleep(1)

# 截取图片
img_obj = get_snap(driver)

return img_obj


def get_distance(image1, image2):
# 初始值
start = 60

# 滑块色差
color_num = 60

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]

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_stacks(distance):
distance += 20

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

位移:
s = v * t + 0.5 * a * (t**2)
'''

# 初速度
v0 = 0

# 加减速度列表
a_list = [3, 4, 5]

# 时间
t = 0.2

# 初始位置
s = 0

# 向前滑动轨迹
forward_stacks = []

mid = distance * 3 / 5

while s < distance:
if s < mid:
a = a_list[random.randint(0, 2)]

else:
a = -a_list[random.randint(0, 2)]

v = v0

stack = v * t + 0.5 * a * (t ** 2)

# 每次拿到的位移
stack = round(stack)

s += stack

v0 = v + a * t

forward_stacks.append(stack)

back_stacks = [-1, -1, -2, -3, -2, -3, -2, -2, -3, -1]

return {'forward_stacks': forward_stacks, 'back_stacks': back_stacks}


def main():
try:

driver.get('https://passport.cnblogs.com/user/signin')
driver.implicitly_wait(5)

# 1.输入用户名与密码,点击登录
username = driver.find_element_by_id('LoginName')
password = driver.find_element_by_id('Password')
login_button = driver.find_element_by_class_name('ladda-label')
time.sleep(1)
username.send_keys('TuLie')
time.sleep(1)
password.send_keys('xymhxxqw.110')

# 这里需要等待账号密码输入完毕后再点击登录按钮,否则的不弹框
time.sleep(1)
login_button.click()
# time.sleep(3)

# 2.点击滑动验证按钮,获取图片
geetest_button = driver.find_element_by_class_name('geetest_slider_button')
geetest_button.click()

time.sleep(0.2)

# 3.针对完整的图片进行截取
image1 = get_image1(driver)

# 4.针对有缺口的图片进行截取
image2 = get_image2(driver)

# 5.对比两张图片,获取滑动距离
distance = get_distance(image1, image2)

# 6.模拟人为滑动轨迹
stacks = get_stacks(distance)

# 7.根据滑动轨迹进行滑动
forward_stacks = stacks['forward_stacks']
back_stacks = stacks['back_stacks']

slider_button = driver.find_element_by_class_name('geetest_slider_button')
time.sleep(0.2)

ActionChains(driver).click_and_hold(slider_button).perform()

time.sleep(0.2)
for forward_stack in forward_stacks:
ActionChains(driver).move_by_offset(xoffset=forward_stack, yoffset=0).perform()
time.sleep(0.1)
for back_stack in back_stacks:
ActionChains(driver).move_by_offset(xoffset=back_stack, yoffset=0).perform()
time.sleep(0.1)

time.sleep(0.2)

ActionChains(driver).move_by_offset(xoffset=5, yoffset=0).perform()
ActionChains(driver).move_by_offset(xoffset=-5, yoffset=0).perform()

ActionChains(driver).release().perform()

time.sleep(50)


finally:
driver.close()


if __name__ == '__main__':
main()
上一篇:


下一篇:LeetCode_232-Implement Queue using Stacks