项目地址
https://gitee.com/Hardy1/questionnaire-star-script
前期准备
- 配置jdk
- 安装python
- 下载安装mitmproxy
代码实现
- 项目中service包中的auto_service是主运行逻辑代码,其他包中的代码一般无需更改
- auto_service中的代码从注释”答卷逻辑start“到”答卷逻辑end“是对应问卷的答题逻辑处理其中int 的i1,i2,i3之类的数据是为了确定选择哪个选项boolean类型的数据是为了对多选题中的每个选项进行随机选取,true为选择,false为不选择,当多选题所有选项都是false也就是不选择时,指定选择一个选项或者随机选择一个(防止出现都不选的情况而不符合答题要求),我代码中指定选择最后一个选项。
if (b20_1==false && b20_2==false && b20_3==false && b20_4==false && b20_5==false){
//选择第五个选项
driver.findElement(By.xpath("//*[@id=\"div20\"]/div[2]/div[5]/span")).click();
}
- 对于xpath中引用变量的代码,说明这个地方的变量可以决定具体要选择的选项(逻辑代码中的int、Boolean类型的代码都是随即出来的,所以脚本跑出来的数据具有随机性,无法应用于真正的数据分析中。)
- tools包中的seleniumAPI类中,需要自定义chrome driver的本地路径,建议直接放在C盘根目录下,就不用动我的默认位置了。不过也可以自定义,我默认的驱动路径是C:/chromedriver.exe(注意,每个系统中的路径分隔符不同,在java中应当写作:C:\chromedriver.exe)
项目配置
- 打开”问卷星自动脚本“项目,设置好maven、jdk等配置
- 打开mitmproxy安装路径,在…/mitmproxy/bin/中新建一个python文件,名字可以随便起,我这边用的名字是properties.py,内如如下
TARGET_URL = 'https://intoli.com/blog/not-possible-to-block-chrome-headless/chrome-headless-test.html'
INJECT_TEXT = 'Object.defineProperties(navigator,{webdriver:{get:() => false}});' #js执行文件
def response(flow):
if flow.request.url.startswith(TARGET_URL):
flow.response.text = INJECT_TEXT + flow.response.text
print('注入成功')
if 'um.js' in flow.request.url or '115.js' in flow.request.url:
# 屏蔽selenium检测
flow.response.text = flow.response.text + INJECT_TEXT
把上面所有代码复制到properties.py文件中,并保存
- 在mitmproxy/bin/目录下terminal执行一次mitmdump后关闭terminal
- 在C:/User/Username/.mitmproxy文件中双击”mitmproxy-ca.p12“开始导入证书,选择默认下一步就好,但是记得在证书储存的时候不要选择默认的选项,要将证书储存在受信任的根证书颁发机构中
- 导入证书完成后,在…/mitmproxy/bin/路径下打开terminal,输入命令:mitmdump -s porperties.py启动mitmproxy
- 打开”问卷星自动脚本“项目中的start包中的mainrun类中设置好定时任务(不太清楚spring boot中怎么直接执行一个方法)并运行,就可以开始自动跑问卷了。
问题处理
常见问题
- 脚本跑一段时间后,统计数据数量和脚本跑的次数不同。原因:问卷星服务器可能屏蔽了异常的提交 解决方案:建议放慢速度,使用IP代理软件(一般注册都会送免费时长)更改IP地址,防止拉黑IP(IP异常后过几十分钟还是可以继续提交的,不过只用本地IP的话会大大限制正常提交次数),建议出现滑动验证码时暂停程序并切换IP,虽然我已经将滑动验证码自动处理。
- 脚本打开网页时chrome提示链接不安全界面。原因:mitmproxy未安装证书解决方案:根据教程或者网上自己寻找教程(关键字:”mitmproxy证书“)安装证书。
- 脚本打开网页时无法打开网页,提示未连接到互联网。原因:没启动mitmdump 解决方案:在mitmproxy安装目录下的bin目录中打开terminal执行”mitmdum -s properties.py“命令
- 提交问卷时显示异常原因:当前IP短时间内过多提交问卷,提交频繁解决方案:使用IP代理软件更换IP或者暂停程序过0.5-1小时重试。