一、分析和解决思路
上篇博文中,我们的程序被检测出作弊了,那如何过检测呢?
思路:
我们打的太快了,完全超出了人类的极限。
而且也不可能一直都是一个速度,也不可能每个字母都打正确。
那我们要让程序打的有快有慢,还要故意输错再退格,这样就差不多模拟出“人”在打字了。
二、实现效果
三、本期源码
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)
五、整个代码内容不多,实现也很简单。但是会出现一个问题:
如果一个项目需要长期维护,这段代码可读性算比较差的。
我们应该封装它,让他更具有可读性。
下期会分享如何封装你的代码,让它更具有可读性、易用性。并增加可选择登录用户、可自定义选择文章的功能