当前位置:   article > 正文

python批量填写问卷星问卷_问卷星批量填写

问卷星批量填写

一、授人以鱼

       如果想直接拿代码就用,不想了解具体设计思路,那看本节内容就够了。到文末复制代码,以下是使用教程:

      需要在main函数给定3个参数,URL(问卷的链接)、answer(问卷答案),num(需要填写的份数)。

      answer的格式是 题号+$+答案,如果是单选题,那答案就是选项序号,如果是多选题,用 | 作为分隔符将多个答案拼接,如果是填空题,那答案就直接是文本,多道题使用 } 进行分隔。例如,answer='1$1}2$2}3$3|4}4$问卷测试' ,表示第一题选第一个,第二题选第二个,第三题是多选题,选第3和4个,第五题是填空题,填入’问卷测试’。有没有感觉很复杂hhh,有简单的方法得到答案序列,用浏览器打开问卷链接,填写问卷,然后按F12进入调试模式,第一行选network项,然后提交问卷,左边选择第一行(或者name是这个的),右边拉到最下面,submitdata后面的就是参数answer应该填的值。顺序不要乱,填写问卷不提交→打开调试模式→提交问卷→查看submitdata项。

另外,运行代码后,控制台会有输出,输出的数据中,10开头的是填写成功,22开头的是填写失败,失败的概率不高。

二、授人以渔

       这里我介绍代码的实现思路。很容易想到,我们应该通过某个URL,把数据发送给问卷星的服务器。所以要解决的问题是URL是哪个,数据的格式是什么。通过填写问卷不提交,打开浏览器的调试模式,然后提交问卷,可以查看提交问卷之后发送的请求。

解读这个发送请求:

  1. URL:https://www.wjx.cn/joinnew/processjq.ashx
  2. 传参方式:POST 
  3. GET参数(以下参数通过get参数拼接方式拼接到URL后面):
  1. submittype: 1
  2. curID: 73771803
  3. t: 1589691842642
  4. starttime: 2020/5/17 13:02:42
  5. ktimes: 110
  6. rn: 1901991322
  7. hlv: 1
  8. sd: http://www.wjx.cn/
  9. jqnonce: d29970a5-3308-46ea-b7f2-d510d8cc52dc
  10. jqsign: e38861`4,2219,57d`,c6g3,e401e9bb43eb
  11. jpm: 15

5.POST参数

submitdata:1$1}2$3}3$2|4}4$问卷测试

 

必要参数的含义

  1. submittype: 问卷类型,一般的问卷应该是1
  2. curID: 可能是问卷ID,可以从response中获取
  3. t: 时间戳+三位随机数
  4. starttime: 打开问卷的时间,可以随机生成
  5. ktimes: 问卷填写时长吧,可以随机生成
  6. rn: 不知道,可以从response中获取
  7. hlv: 好像没啥用的一个参数,没有也行
  8. jqnonce: 不知道,可以从response中获取
  9. jqsign: 不知道,根据rn和jqnonce生成
  10. submitdata: 提交的答案

jqsign生成方式(JS代码),需要将其转为python代码

  1. dataenc(a)
  2. {
  3. var b = ktimes % 10;
  4. b == 0 && (b = 1);
  5. for (var d = [], c = 0; c < a.length; c++) {
  6. var f = a.charCodeAt(c) ^ b;
  7. d.push(String.fromCharCode(f))
  8. }
  9. return d.join("")
  10. }

关于IP的问题

    同一IP多次提交会让你输入验证码,识别验证码并提交有点难,所以可以考虑每次换不同的IP,在请求头header里设置就行

 

 

 

好了,到这里,URL知道了,参数及获取方式也知道了,具体实现方式就看下面的代码吧

三、代码

  1. # -*- coding: utf-8 -*-
  2. """
  3. Created on Sun May 17 09:27:04 2020
  4. @author: Z
  5. """
  6. import requests
  7. import re
  8. import time
  9. import random
  10. def getJqsign(ktimes, jqnonce):
  11. result = []
  12. b = ktimes % 10
  13. if b == 0:
  14. b = 1
  15. for char in list(jqnonce):
  16. f = ord(char) ^ b
  17. result.append(chr(f))
  18. return ''.join(result)
  19. def run(url,answer):
  20. ip = '{}.{}.{}.{}'.format(112, random.randint(64, 68), random.randint(0, 255), random.randint(0, 255))
  21. header = {
  22. 'X-Forwarded-For': ip,
  23. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
  24. }
  25. response=response = requests.get(url=url, headers=header)
  26. cookie = response.cookies
  27. ktimes = random.randint(15, 50)
  28. jqnonce = jqnonce = re.search(r'.{8}-.{4}-.{4}-.{4}-.{12}', response.text).group()
  29. rn = re.search(r'\d{9,10}\.\d{8}', response.text).group()
  30. id = re.search(r'\d{8}', response.text).group()
  31. jqsign = getJqsign(ktimes, jqnonce)
  32. start_time = start_time = re.search(r'\d+?/\d+?/\d+?\s\d+?:\d{2}', response.text).group()
  33. time_stamp = '{}{}'.format(int(time.time()), random.randint(100, 200))
  34. postUrl = 'https://www.wjx.cn/joinnew/processjq.ashx?submittype=1&curID={}&t={}&starttim' \
  35. 'e={}&ktimes={}&rn={}&jqnonce={}&jqsign={}'.format(id, time_stamp, start_time, ktimes, rn, jqnonce, jqsign)
  36. data = {
  37. 'submitdata': answer
  38. }
  39. response = requests.post(url=postUrl, data=data, headers=header, cookies=cookie)
  40. print(response.content.decode())
  41. print()
  42. if __name__ == '__main__':
  43. url='https://www.wjx.cn/jq/73771803.aspx' #问卷链接
  44. answer='1$1}2$2}3$3|4}4$问卷测试' #答案
  45. num=10 #填写份数
  46. for i in range(0,num):
  47. run(url,answer)

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/605997
推荐阅读
相关标签
  

闽ICP备14008679号