某问卷自动化脚本

声明

本脚本仅供学习交流,请勿用于商业用途,使用本脚本造成的任何后果与本人无关。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# 某问卷全自动化填写问卷 思政作业想偷懒写的emmm...
# Author:isyang_
# 声明:
# 本脚本不得用于售卖和非法用途,仅用于学习
# 脚本使用了selenium和pyautogui进行模拟登录和鼠标宏全自动化答卷
# 使用本脚本需要安装最新的chrome浏览器
# 不同问卷需要根据代码进行重构,比如改题目数量,题目选项结构,题目xpath,以及提交按钮的坐标,具体见代码注释

import time
import random
import pyautogui
from selenium import webdriver
from selenium.webdriver.common.by import By


def spider(num, url):
for i in range(num):
option = webdriver.ChromeOptions() # 创建一个chrome浏览器选项对象
option.add_experimental_option('excludeSwitches', ['enable-automation']) # 禁用参数,防止脚本被检测
option.add_experimental_option('useAutomationExtension', False) # 禁用浏览器扩展(提高脚本稳定性)

browser = webdriver.Chrome(options=option) # 创建一个Chrome对象

# 向浏览器发送一个控制命令,将 "webdriver" 属性设置为 undefined。这可以防止浏览器检测到自动化脚本,从而提高脚本在浏览器中的稳定性
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'})

browser.maximize_window() # 窗口最大化

# 再次将 "webdriver" 属性设置为 undefined。
browser.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',
{'source': 'Object.defineProperty(navigator, "webdriver", {get: () => undefined})'
})

browser.get(url) # 使用浏览器对象访问指定url
time.sleep(2)

# 设置自动答题的配置
# range中的范围是你的总题目数
for question_num in range(1, 12):
if question_num <= 3: # 设置多选题的配置,这里为1-3题,选项为A-E,这里我设置的是A-C中随机选一个,D-E中随机选一个
num1 = random.randint(1, 3)
num2 = random.randint(4, 5)
elif question_num <= 8: # 设置单选题,这里为4-8题,选项为A-D
num1 = random.randint(1, 4)
num2 = None
else: # 设置判断题(双选题),这里为9-12题
num1 = random.randint(1, 2)
num2 = None

# 拼接xpath路径 让浏览器找到对应的元素并且模拟鼠标点击
if num2 is not None:
if browser.find_element(by=By.XPATH, value=f"//div[@for='q{question_num}_{num1}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q{question_num}_{num1}']").click()
browser.find_element(by=By.XPATH, value=f"//div[@for='q{question_num}_{num2}']").click()
else:
if browser.find_element(by=By.XPATH, value=f"//div[@for='q{question_num}_{num1}']"):
browser.find_element(by=By.XPATH, value=f"//div[@for='q{question_num}_{num1}']").click()
time.sleep(0.5)

pyautogui.scroll(-500) # 移动鼠标滚轮到最下面
time.sleep(1)
pyautogui.moveTo(1274, 1364) # 将鼠标移动到指定位置(提交按钮)
time.sleep(3)
pyautogui.click() # 点击鼠标
time.sleep(5)
browser.close() # 关闭浏览器
print(f"第{i + 1}份已经完成")

if __name__ == '__main__':
num = 1000 # 填的份数
url = 'https://www.xxxxx.com' # 问卷链接
spider(num, url)

Contents
  1. 1. 声明
  2. 2. 代码
|