原因
由于公司订餐系统选用的问卷星系统,有时候工作忙忘记订餐导致没饭吃,终于下定决心研究一下怎么能更方便的吃饭,于是开始研究怎么用curl来自动化处理问卷星答卷。
实现
首先我们需要了解问卷星页面。
打开一个问卷星页面。
这里是我的一个测试页面。(https://www.wjx.cn/jq/80375841.aspx)
尝试提交。
发现当点击提交的时候会向此地址发送数据。
发送的数据格式如下:
submittype: 1
curID: 80375841
t: 1591198942624
starttime: 2020/6/3 23:42:14
ktimes: 38
rn: 1878089202
hlv: 1
jqnonce: e38ac63f-83c4-433c-8b61-3e1c41b467ae
jqsign: m;0ik>;n%0;k<%<;;k%0j>9%;m9k<9j<>?im
form中包含用户输入的答案
submitdata: 1$3}2$test
这里form比较好理解,表示的第一个空选择的是第三个选项,第二个空填写的是test
主要是param携带的东西。
根据多次的实验。
submittype,hlv是不变的
curID表示当前的页面ID,就是问卷星后面跟的数字。
那么接下来要解开其余ID的迷。
t: 1591198942624 //表示当前时间戳 毫秒 这里表示的是提交时间!!
starttime: 2020/6/3 23:42:14 //当前打开页面时间
ktimes: 38 //答题时间,猜测
rn: 1878089202 //目前暂且不知
jqnonce: e38ac63f-83c4-433c-8b61-3e1c41b467ae //不知
jqsign: m;0ik>;n%0;k<%<;;k%0j>9%;m9k<9j<>?im //不知,但是是一个签名认证
这时候迷惑的主要是几个很奇怪的ID。
rn,jqnonce,jqsign,ktimes的获取。只要搞到这几个ID怎么来的就可以了。
我们抓一下答题页面。
此时,就剩rn和ktimes,jqsign不知道怎么来的。
我们看到其中有一个rndnum和rn一样,那么基本可以确定。rn,jqnonce,starttime都可以获取页面中原有的。
那么jqsign到底怎么来的呢。
我们看一下页面点击事件触发的js。
看代码,在代码中搜索jqsign
window.jqnonce &&
(e += "&jqnonce=" + encodeURIComponent(window.jqnonce),
k = dataenc(window.jqnonce),
e += "&jqsign=" + encodeURIComponent(k)),
jqsign是调用了dataenc方法根据jqnonce计算出来的。
function dataenc(a) {
var c, d, e, b = ktimes % 10;