主页 M

Python selenium 破解滑块验证码

2020-03-11 网页编程网 网页编程网

一、验证开发环境

from selenium import webdriver

driver=webdriver.Chrome()#chrome不要用绿色版

driver.get('https://www.baidu.com')

print(driver.title)

driver.quit

二、开发步骤

1.访问url地址,定位到登录密码位置。并点击账号密码。

2.密码清空,并重新输入。

3.再定位滑块,模拟轨迹图,范围在180

4.模拟人的行为

#!/usr/bin/python
# -*- coding: utf-8 -*-
#强制等待
from time import sleep
from selenium import webdriver
#鼠标事件
from selenium.webdriver import ActionChains
#显式等待
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

url = 'https://i.qq.com/'

def get_track(distance):
    """
    根据偏移量获取移动轨迹
    :param distance: 偏移量
    :return: 移动轨迹
    """
    # 移动轨迹
    track = []
    # 当前位移
    current = 0
    # 减速阈值
    mid = distance * 4 / 5
    # 计算间隔
    t = 1
    # 初速度
    # v = 0
    v = 0
    while current < distance:
        if current < mid:
            # 加速度为正2
            # a_b = 8
            a = 10
        else:
            # 加速度为负3
            a = -3
        # 初速度v0
        v0 = v
        # 当前速度v = v0 + at
        v = v0 + a * t
        # 移动距离x = v0t + 1/2 * a_b * t^2
        move = v0 * t + 1 / 2 * a * t * t
        # 当前位移
        current += move
        # 加入轨迹
        track.append(round(move))
    return track



def main():

    driver = webdriver.Chrome()
    driver.set_window_position(900,10)
    #窗口最大化
    driver.maximize_window()

    driver.get(url)
    driver.switch_to.frame('login_frame')
    driver.find_element_by_id('switcher_plogin').click()
    sleep(1)

    driver.find_element_by_id('u').clear()
    driver.find_element_by_id('u').send_keys('qq number')
    driver.find_element_by_id('p').clear()
    driver.find_element_by_id('p').send_keys('123')
    sleep(1)

    driver.find_element_by_id('login_button').click()

    sleep(5)

    try:
        iframe = driver.find_element_by_xpath('//iframe')
    except Exception as e:
        print(e)

    sleep(1)
    driver.switch_to.frame(iframe)
    #显式等待
    WebDriverWait(driver,5,0.5).until(EC.presence_of_element_located((By.ID,'tcaptcha_drag_button')))

    try:
        button = driver.find_element_by_id('tcaptcha_drag_button')
    except Exception as e:
        pass

    sleep(1)

    distance = 180
    times = 0

    while True:
        try:
            action = ActionChains(driver)
            #左键按住
            action.click_and_hold(button).perform()
            #清楚之前啊action
            action.reset_actions()
            #模拟轨迹方程

            track = get_track(distance)
            #[1,10,20,50,60]

            for i in track:
                #移动滑块
                action.move_by_offset(xoffset=i,yoffset=0).perform()
                #必加 清楚动作
                action.reset_actions()
            sleep(0.5)
            #释放鼠标
            action.release().perform()

            sleep(5)

            times += 1
            print('这个是滴几次{}'.format(times))

        except:
            print('登录成功')
            break

    print(driver.title)
    sleep(2)
    driver.quit()
    print('finish~~~')


    # sleep(5)
    # driver.quit()

if __name__ == '__main__':
    main()
阅读原文
阅读 5707
123 显示电脑版