当前位置 博文首页 > momoda118的博客:从零开始Web自动化(四):如何过打字网站的作弊

    momoda118的博客:从零开始Web自动化(四):如何过打字网站的作弊

    作者:[db:作者] 时间:2021-08-16 22:03

    一、分析和解决思路
    上篇博文中,我们的程序被检测出作弊了,那如何过检测呢?

    思路:
    我们打的太快了,完全超出了人类的极限。
    而且也不可能一直都是一个速度,也不可能每个字母都打正确。
    那我们要让程序打的有快有慢,还要故意输错再退格,这样就差不多模拟出“人”在打字了。

    二、实现效果
    在这里插入图片描述

    三、本期源码

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    import random
    from pynput.keyboard import Key, Controller
    
    keyboard = Controller()
    browser = webdriver.Chrome()  # 启动浏览器
    browser.get('https://dazi.kukuw.com/')  # 打开网站
    browser.find_element_by_xpath('//*[@id="time"]').clear()  # 清空测试时间栏
    browser.find_element_by_xpath('//*[@id="time"]').send_keys('2')  # 测试时间栏输入2
    browser.find_element(By.XPATH, '//*[@id="form"]/ul[6]/li[2]/input').click()  # 点击开始测试按钮
    time.sleep(1)
    for i in range(0, 60):
        x_v = browser.find_element(By.XPATH, '''//*[@id="i_''' + str(i) + '''"]/div/span''').text + ' '
        for j in x_v:
            wait_time = random.randint(12, 100)
            time.sleep(wait_time / 1000)  # 控制每次打字的间隔时间
            error_value = random.randint(1, 20)
            if error_value == 2:  # 当error_value等于2时,代表故意打错
                error_length = random.randint(1, 4)  # 需要打错几个字母
                for k in range(error_length):  # 进行打错操作
                    letter_v = random.randint(97, 122)
                    letter = chr(letter_v)  # 数字转换为字母
                    time.sleep(wait_time / 1000)
                    browser.find_element(By.XPATH, '''//*[@id="i_''' + str(i) + '''"]/input[2]''').send_keys(letter)
                for a in range(error_length):  # 进行退格操作
                    keyboard.press(Key.backspace)
                    keyboard.release(Key.backspace)
            browser.find_element(By.XPATH, '''//*[@id="i_''' + str(i) + '''"]/input[2]''').send_keys(j)
    

    四、讲解

    1.在每次循环打字前,设定打字的间隔时间

     		wait_time = random.randint(12, 100)
            time.sleep(wait_time / 1000)  # 控制每次打字的间隔时间
    

    2.另外设置故意打错的概率及要打错几个字

            error_value = random.randint(1, 20)
            if error_value == 2:  # 当error_value等于2时,代表故意打错
                error_length = random.randint(1, 4)  # 需要打错几个字母
                for k in range(error_length):  # 进行打错操作
                    letter_v = random.randint(97, 122)
                    letter = chr(letter_v)  # 数字转换为字母
                    time.sleep(wait_time / 1000)
                    browser.find_element(By.XPATH, '''//*[@id="i_''' + str(i) + '''"]/input[2]''').send_keys(letter)
    

    3.打错后,需要退格再重新输入正常的内容

                for a in range(error_length):  # 进行退格操作
                    keyboard.press(Key.backspace)
                    keyboard.release(Key.backspace)
            browser.find_element(By.XPATH, '''//*[@id="i_''' + str(i) + '''"]/input[2]''').send_keys(j)
    

    五、整个代码内容不多,实现也很简单。但是会出现一个问题:
    如果一个项目需要长期维护,这段代码可读性算比较差的。
    我们应该封装它,让他更具有可读性。
    下期会分享如何封装你的代码,让它更具有可读性、易用性。并增加可选择登录用户、可自定义选择文章的功能

    测试交流、答疑Q群:814078962

    cs