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