项目介绍
本项目是一个基于 Spring Boot 开发的 Web 自动化工具,帮助快速填写问卷以及学习使用
项目框架
环境要求
使用本项目前,请确保您的环境满足以下条件:
- 基础环境:
- Java 17 或更高版本
- Maven 3.6 或更高版本
- Chrome 浏览器(用于 Selenium)
Chrome官网地址:https://googlechromelabs.github.io/chrome-for-testing/(这里可以自己选择版本)
Chrome(134.0.6998.88版本): https://storage.googleapis.com/chrome-for-testing-public/134.0.6998.88/win64/chrome-win64.zip (打开链接自动下载对应版本)
chromedrive(134.0.6998.88版本): https://storage.googleapis.com/chrome-for-testing-public/134.0.6998.88/win64/chromedriver-win64.zip (打开链接自动下载对应版本)
下载后解压,注意路径不能有中文
- 推荐开发工具:
- IntelliJ IDEA(推荐)
- VS Code + Java 插件
快速开始
- 获取项目(Gitee):
Gitee项目地址: https://gitee.com/tkf111/auto-survey-filler
演示网站地址: http://autoq13.top
- 修改配置:
目标文件:application.yml, 把这里的binary和driver修改为你自己的路径,注意不要有中文,端口号随意(必须配置)
webdriver:
cache:
path: ./drivers
chrome:
binary: ${WEBDRIVER_CHROME_BINARY:D:\\plug\\chrome\\chrome-win64 (1)\\chrome-win64\\chrome.exe}
driver: ${WEBDRIVER_CHROME_DRIVER:D:\\plug\\chrome\\chromedriver-win64 (1)\\chromedriver-win64\\chromedriver.exe}
server:
port: 8080
目标文件:ProxyService,如果需要使用代理,修改String apiUrl = “”; // 这里填写API地址(不是必须,不使用代理不用管)
/**
* 从API获取代理
*/
private String fetchProxyFromApi() {
try {
String apiUrl = ""; // 这里填写API地址
if (apiUrl == null) {
log.error("代理API URL未配置");
return null;
}
log.info("开始请求代理API,URL: {}", apiUrl);
URL url = new URL(apiUrl);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setConnectTimeout(5000);
conn.setReadTimeout(5000);
int responseCode = conn.getResponseCode();
log.info("代理API响应码: {}", responseCode);
if (responseCode != HttpURLConnection.HTTP_OK) {
log.error("代理API请求失败,响应码: {}", responseCode);
return null;
}
try (BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()))) {
String response = reader.readLine();
log.info("成功获取代理响应: {}", response);
return response;
}
} catch (Exception e) {
log.error("请求代理API失败:{}", e.getMessage());
return null;
}
}
目标文件:ProxyConfig, 使用代理时候有一个测试IP是否可用,修改@Value(“${proxy.warmup.test-urls:https://www.wjx.cn/vm/examle.aspx}”) // 默认问卷星URL,使用ip代理时候换成你的(不是必须,不使用代理不用管)
package com.example.wenmini.config;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Data
@Configuration
public class ProxyConfig {
// 代理服务器配置
private String proxyHost;
private int proxyPort;
private long lastUpdateTime; // 记录代理更新时间
// 预热配置
@Value("${proxy.warmup.timeout:30000}")
private int warmupTimeout; // 预热超时时间,默认30秒
@Value("${proxy.warmup.test-urls:https://www.wjx.cn/vm/examle.aspx}") // 默认问卷星URL,使用ip代理时候换成你的
private String[] warmupTestUrls; // 预热测试URL列表,默认为问卷星URL
@Value("${proxy.max-use-time:1800000}")
private long maxUseTime; // 代理最大使用时间,默认30分钟
@Value("${proxy.retry-count:3}")
private int maxRetryCount; // 最大重试次数
@Value("${proxy.retry-interval:2000}")
private long retryInterval; // 重试间隔时间(ms)
}
- 访问服务:
- 启动成功后,访问 http://localhost:8080
功能特性
-
可视化配置
- 配置了简单的前端交互,方便配置问卷
- 配置了简单的前端交互,方便配置问卷
-
快捷任务配置
- 支持设置填写次数,间隔时间(间隔时间好像有点问题,需要修改的化建议改动后端的随机思考时间函数)
- 支持选择代理
- 支持信度检验
-
数据缓存
- 本地缓存历史记录链接,方便使用
- 本地缓存历史记录链接,方便使用
-
支持题型
- 单选题
- 多选题
- 文本题
如果有更多需要,可在QuestionChoice.java文件中继续添加题型配置,前端也需要同步配置
常见问题
-
浏览器启动失败?
- 确保已安装 Chrome 浏览器
- 检查路径是否正确,是否包含中文
- 检查 WebDriver 版本是否与浏览器版本匹配
- 查看日志中的详细错误信息
-
问卷填写失败?
- 网络原因,有时候有些网络或者vpn会导致访问问卷失败
- 题型不支持,有不支持题型时候也会中断报错
- 出现智能验证
-
如何解决?
- 在DriverService中,把设置无头模式的代码暂时注释掉,可以看到填写细节,问卷在哪里停止了,然后锁定问题
- 留言或者私信,遇到的具体问题和报错
/**
* 创建新的WebDriver实例
*/
public WebDriver createWebDriver(boolean useProxy) {
try {
log.info("开始创建WebDriver实例...");
System.setProperty("webdriver.chrome.driver", chromeDriverPath);
ChromeOptions options = new ChromeOptions();
// 设置Chrome二进制文件路径
if (chromeBinaryPath != null && !chromeBinaryPath.isEmpty()) {
options.setBinary(chromeBinaryPath);
}
// 配置代理
if (useProxy) {
configureProxy(options);
}
// 设置无头模式
options.addArguments("--headless=new");
// 配置浏览器首选项
configureBrowserPreferences(options);
// 添加Chrome启动参数
addChromeArguments(options);
// 设置随机User-Agent
options.addArguments("--user-agent=" + fingerprintGenerator.generateUserAgent());
// 创建WebDriver实例
WebDriver driver = new ChromeDriver(options);
// 配置超时设置
configureTimeouts(driver);
// 注入动态指纹
injectFingerprint(driver);
log.info("WebDriver实例创建成功");
return driver;
} catch (Exception e) {
log.error("创建WebDriver实例失败:{}", e.getMessage());
throw new RuntimeException("创建WebDriver实例失败", e);
}
}