1 ''' 2 将 main 中的{url}改为真 url 3 将 setd_data中 {姓名} {纬度} {经度} {地址} 改为确切数据 4 数据自行参考post 5 结果判断基于响应中是否包含“谢谢参与”字样 6 ''' 7 import requests 8 import re 9 import time 10 import random 11 import datetime 12 13 class JinShuJv: 14 def __init__(self,url): 15 self.url = url 16 self.post_url = url 17 self.header = None 18 self.cookie = None 19 self.data = None 20 21 def set_header(self): 22 """ 23 随机生成ip,设置X-Forwarded-For 24 :return: 25 """ 26 ip = '{}.{}.{}.{}'.format(112, random.randint(64, 68), random.randint(0, 255), random.randint(0, 255)) 27 self.header = { 28 'Host': 'jinshuju.net', 29 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:74.0) Gecko/20100101 Firefox/74.0', 30 'Referer': self.url, 31 'Origin': 'https://jinshuju.net', 32 'X-Forwarded-For': ip 33 } 34 35 def get_response(self): 36 """ 37 访问问卷网页,获取网页代码 38 :return: get请求返回的response 39 """ 40 response = requests.get(url=self.url, headers=self.header) 41 self.cookie = response.cookies 42 return response 43 44 def get_authenticity_token(self,response): 45 authenticity_token=re.search(r'(?<=name="csrf-token" content=")S+(==>?)',response.text) 46 return authenticity_token.group() 47 48 def set_data(self): 49 response = self.get_response() 50 authenticity_token = self.get_authenticity_token(response) 51 now=str(datetime.date.today()) 52 def temperature(): 53 high=round(random.uniform(36.5,37.0),1) 54 low=round(high-round(random.uniform(0.3,0.5),1),1) 55 high=str(high) 56 low=str(low) 57 return [high,low] 58 59 data={ } 60 data.update({"utf8":"✓"}) 61 data.update({"authenticity_token":authenticity_token}) 62 data.update({"entry[field_6]":now}) 63 data.update({"entry[field_20]":"班级码"}) 64 data.update({"entry[field_11]":"{姓名}"}) 65 data.update({"entry[field_14]":temperature()[0]}) 66 data.update({"entry[field_40]":temperature()[1]}) 67 data.update({"entry[field_33]":"q348"}) 68 data.update({"entry[field_37]":"q348"}) 69 data.update({"entry[field_21]":temperature()[0]+'/'+temperature()[1]+','+temperature()[0]+'/'+temperature()[1]+','+temperature()[0]+'/'+temperature()[1]+','+temperature()[0]+'/'+temperature()[1]}) 70 data.update({"entry[field_38]":"q348"}) 71 data.update({"entry[field_35]":"q348"}) 72 data.update({"entry[field_18][latitude]":"{纬度}"}) 73 data.update({"entry[field_18][longitude]":"{经度}"}) 74 data.update({"entry[field_18][address]":"{地址}"}) 75 data.update({"entry[field_36]":"q348"}) 76 data.update({"entry[field_34]":"无"}) 77 data.update({"entry[field_39]":""}) 78 data.update({"embedded":""}) 79 data.update({"banner":""}) 80 data.update({"header":""}) 81 data.update({"background":""}) 82 data.update({"background_image":""}) 83 data.update({"form_margin":""}) 84 data.update({"code":""}) 85 data.update({"submit_link_generated_from":""}) 86 self.data=data 87 88 def post_data(self): 89 """ 90 发送数据给服务器 91 :return: 服务器返回的结果 92 """ 93 self.set_data() 94 response = requests.post(url=self.post_url, data=self.data, headers=self.header, cookies=self.cookie) 95 return response 96 97 def run(self): 98 self.set_header() 99 result = self.post_data() 100 # print(result.content.decode()) 101 if "谢谢参与" in result.content.decode(): 102 print("success") 103 else: 104 print("fail") 105 106 if __name__ == "__main__": 107 j=JinShuJv({url}) 108 j.run()
参考:
https://www.jianshu.com/p/34961ceedcb4