2019-06-19 python day07

今日内容 :

破解极验滑动验证

'''

破解极验滑动验证

破解极验滑动验证

博客园登录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

from PIL import Image

import time

import random

def main():

    driver = webdriver.Chrome(r'/Users/nadia/Downloads/chromedriver')

    # 输入用户名和密码并点击登录

    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('xxxx') # xxxx指代你的用户名

    time.sleep(2)

    pwd_input = driver.find_element_by_id('Password')

    pwd_input.send_keys('xxxxxxxx.')# xxxx指代你的密码

    login_submit = driver.find_element_by_id('submitBtn')

    login_submit.click()

    # 获取完整的图片

    img1 = get_image1(driver)

    with open('img1.png','wb') as f:

        f.write(img1)

    # 获取有缺口的图片

    img2 = get_image2(driver)

    with open('img2.png','wb') as f:

        f.write(img2)


    # 获取滑动距离

    distance = get_distance(img1,img2)

    print(distance)

    # 模拟人的滑动轨迹

    get_track_move()

    time.sleep(100)

    move_list = get_track_move(distance)['move_list']

    back_list = get_track_move(distance)['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)

    # 后滑

    for back in back_list :

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

    ActionChains(driver).release()

#模拟人的滑动轨迹

def get_track_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

    # 加减速度列表

    a_list = [1,2,3,4]

    # 后退列表,自定义后退滑动轨迹

    back_list = [1,1,2,3,1,5,4,3]

    # 循环位移

    while s<distance:

        if s<mid:

            a = a_list[random.randint(0,len(a_list) - 1)]

        else:

            a = - a_list[random.randint(0,len(a_list) - 1)]

        s1 = round(v * t + 0.5 * a * (t**2))#取整

        s += s1

        v= v0 + a* t

        v0 = v



        move_list.append(s)

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


# 获取滑块滑动距离

def get_distance(img1,img2):

    # 滑块距离

    start = 60

    # 像素差

    num = 60

    # size用元祖表示,用索引取得img的size width 和height

    for x in range(start,img1.size[0]):

        for y in range(img1.size[1]):

            # 获取两图片每个坐标的像素点

            rgb1 = img1.load()[x,y]

            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 < 60 and g < 60 and b < 60):

                return x - 7 #误差7

def cut_image(driver):

    # 获取整个页面的图片,名字为:snap.jpg

    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']

    # 调用open方法打开全局图片

    image_obj = Image.open('snap.png')

    # 通过image_obj对象对小图片进行截取

    # box: The crop rectangle, as a (left, upper, right, lower)-tuple.

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

    # 打开截取后的小图片

    img.show()

    return img

def get_image1(driver):

    time.sleep(2)

    # 修改document文档数,把完整图片的display属性修改为block

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

    # 执行jscode

    driver.execute_script(js_code)

    # 截取图片

    image = cut_image(driver)

    return image

def get_image2(driver):

    time.sleep(2)

    # 修改document文档树,把完整图片的display属性修改为block

    js_code = '''

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

    '''

    # 执行js代码

    driver.execute_script(js_code)

    # 截取图片

    image = cut_image(driver)

    return image

if __name__ == "__main__":

    main()


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351