如何利用Python自动填写疫情数据!完整代码!

自疫情始,学校就要求学生每天在学校内系统填写个人每日疫情相关情况,称为疫情通。

    但是,由于个人原因,出现了下图情况。

    记性太差,人又懒,于是决定用Python实现自动化定时任务。

1

核心模块

    打开IEChrome。

    打开网页按下F12拿到请求头和请求体。

    (假装此处有图片)

    Pycharm启动!

    根据拿到的请求头和请求体,完成核心代码编写。

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
url = "https://xxcapp.xidian.edu.cn/ncov/wap/default/save"headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',           'Accept': 'application/json, text/javascript, */*; q=0.01',           'Accept-Language': 'zh-cn',           'Accept-Encoding': 'gzip, deflate, br',           'Host': 'xxcapp.xidian.edu.cn',           'Origin': 'https://xxcapp.xidian.edu.cn',           'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) '                         'Version/13.1 Safari/605.1.15',           'Connection': 'keep-alive',           'Referer': 'https://xxcapp.xidian.edu.cn/ncov/wap/default/index',           'Content-Length': '2314',           # Cookie是身份标识           'Cookie': 'Hm_lpvt_48b682d5d22a90111e44886b972e3268=1590108209; '  # Hm_lpvt_xxxxxxx 为当前时间戳(秒)           # Hm_lvt_xxx 为一串时间戳。最近的一次访问时间戳追加在后面,最多保留4个时间戳。可以通过关闭浏览器然后再访问相同页面查看其cookie值来验证。                     'Hm_lvt_48b682a90111e46b9d4885d2272e3268=1590108209; UUkey=99cf86f295b522e264680402bf6b221e; '                     'Uqn3iPIDZBpD3wJU=vqtbQwSD1sjDM; eai-sess=prshbd3vo96po8i27a4mod1i67',           'X-Requested-With': 'XMLHttpRequest',           }data = {    'uid': '123671', 'date': str(datetime.date.today() - datetime.timedelta(days=1)).replace("-", ""),    'tw': '3',  # 体温:第三项,36.5-36.9    'sfcxtz': '0',  # 是否出现    'sfyyjc': '0',  # 是否医院检查    'jcjgqr': '0',  # 检查结果确认    'sfjcbh': '0',  # 是否接触病患    'sfcxzysx': '0',  # 是否出现    'address': '', 'area': '', 'province': '',  # 地址    'city': '', # 城市    # 伽利略定位系统详情    'geo_api_info': '{"type":"complete","position":{"P":11.203296169705,"O":11.667691514757,"lng":11.667692,'                    '"lat":11.203296},"location_type":"html5","message":"Get ipLocation failed.Get geolocation '                    'success.Convert Success.Get address success.","accuracy":15,"isConverted":true,"status":1,'                    '"addressComponent":{"citycode":"0001","adcode":"123456","businessAreas":[],'                    '"neighborhoodType":"","neighborhood":"","building":"","buildingType":"","street":"",'                    '"streetNumber":"","province":"","city":"","district":"","township":""},'                    '"formattedAddress":"","roads":[],"crosses":[],"pois":[],'                    '"info":"SUCCESS"}',    'created': str(int(time.time())),  # 创建时间    'sfzx': '0',  # 是否在校 否    'sfjcwhry': '0',  # 是否接触武汉人员 否    'sfcyglq': '0',  # 是否处于隔离期 否    'sftjwh': '0',  # 是否途径武汉 否    'sftjhb': '0',  # 是否途径湖北 否    'fjsj': '0',    'sfjchbry': '0',  # 是否接触湖北人员 否    'sfsfbh': '0',  # 是否    'jhfjsftjwh': '0',  # *****是否途径武汉 否    'jhfjsftjhb': '0',  # *****是否途径湖北 否    'szsqsfybl': '0',    'sfygtjzzfj': '0',  # 是否    'sfjcjwry': '0',  # 是否接触境外人员 否    'id': '4393912',    'ismoved': '0',  # 与上次地点是否有不同}requests.post(url=url, data=data, headers=headers)

上述代码已经可以虚拟我们的提交能力了,但是还达不到自动化需求。最终目标是能够放在Linux服务器上每日早晨自动运行一次,并接收到反馈。所以需要再加一个模块,我选择了邮件通知方式。

2

通知模块

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
def sendEmail(message):    msg_from = 'xxxxx@qq.com'  # 发送方邮箱    passwd = ''  # 发送方邮箱的授权码    msg_to = 'xxxxx@qq.com'  # 收件人邮箱    subject = "疫情通"  # 主题    msg = MIMEText(message)    msg['Subject'] = subject    msg['From'] = msg_from    msg['To'] = msg_to    try:        s = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 邮件服务器及端口号        s.login(msg_from, passwd)        s.sendmail(msg_from, msg_to, msg.as_string())        print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]邮件发送成功,邮件内容:" + message)    except s.SMTPException:        print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]邮件发送失败,邮件内容:" + message)    finally:        s.quit()

    此函数接收字符串为参,并将此字符串送至目标邮箱。

    那么核心代码最后一行便改为

  •  
sendEmail(eval(requests.post(url=url, data=data, headers=headers).text)['m'])

    代码编写完毕,文末有完整版。接下来实现自动化运行。

3

自动化模块

    Terminal启动!

    将本py文件scp至服务器,然后在同目录下创建output.log文件,用以记录每日信息(考虑到邮件发送失败的情况)。

    编辑/etc/crontab,在最后的#上面加上下图内容,最后两个分别是py文件和log文件的路径,整行内容表示的是在每天8:30以root身份自动运行右侧命令。

4

最终效果

    由下图log文件内容可知,2020-05-25早8时30分3秒完成此任务,也就是说此任务运行一次需要三秒。

    在邮箱中也可以看到已经收到邮件。

5

完整代码

  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
import timeimport requestsimport smtplibimport datetimefrom email.mime.text import MIMETextdef sendEmail(message):    msg_from = 'xxxxx@qq.com'  # 发送方邮箱    passwd = ''  # 发送方邮箱的授权码    msg_to = 'xxxxx@qq.com'  # 收件人邮箱    subject = "疫情通"  # 主题    msg = MIMEText(message)    msg['Subject'] = subject    msg['From'] = msg_from    msg['To'] = msg_to    try:        s = smtplib.SMTP_SSL("smtp.qq.com", 465)  # 邮件服务器及端口号        s.login(msg_from, passwd)        s.sendmail(msg_from, msg_to, msg.as_string())        print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]邮件发送成功,邮件内容:" + message)    except s.SMTPException:        print('[' + str(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time()))) + "]邮件发送失败,邮件内容:" + message)    finally:        s.quit()url = "https://xxcapp.xidian.edu.cn/ncov/wap/default/save"headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8',           'Accept': 'application/json, text/javascript, */*; q=0.01',           'Accept-Language': 'zh-cn',           'Accept-Encoding': 'gzip, deflate, br',           'Host': 'xxcapp.xidian.edu.cn',           'Origin': 'https://xxcapp.xidian.edu.cn',           'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/605.1.15 (KHTML, like Gecko) '                         'Version/13.1 Safari/605.1.15',           'Connection': 'keep-alive',           'Referer': 'https://xxcapp.xidian.edu.cn/ncov/wap/default/index',           'Content-Length': '2314',           # Cookie是身份标识           'Cookie': 'Hm_lpvt_48b682d5d22a90111e44886b972e3268=1590108209; '  # Hm_lpvt_xxxxxxx 为当前时间戳(秒)           # Hm_lvt_xxx 为一串时间戳。最近的一次访问时间戳追加在后面,最多保留4个时间戳。可以通过关闭浏览器然后再访问相同页面查看其cookie值来验证。                     'Hm_lvt_48b682a90111e46b9d4885d2272e3268=1590108209; UUkey=99cf86f295b522e264680402bf6b221e; '                     'Uqn3iPIDZBpD3wJU=vqtbQwSD1sjDM; eai-sess=prshbd3vo96po8i27a4mod1i67',           'X-Requested-With': 'XMLHttpRequest',           }data = {    'uid': '123671', 'date': str(datetime.date.today() - datetime.timedelta(days=1)).replace("-", ""),    'tw': '3',  # 体温:第三项,36.5-36.9    'sfcxtz': '0',  # 是否出现    'sfyyjc': '0',  # 是否医院检查    'jcjgqr': '0',  # 检查结果确认    'sfjcbh': '0',  # 是否接触病患    'sfcxzysx': '0',  # 是否出现    'address': '', 'area': '', 'province': '',  # 地址    'city': '',  # 城市    # 伽利略定位系统详情    'geo_api_info': '{"type":"complete","position":{"P":11.203296169705,"O":11.667691514757,"lng":11.667692,'                    '"lat":11.203296},"location_type":"html5","message":"Get ipLocation failed.Get geolocation '                    'success.Convert Success.Get address success.","accuracy":15,"isConverted":true,"status":1,'                    '"addressComponent":{"citycode":"0001","adcode":"123456","businessAreas":[],'                    '"neighborhoodType":"","neighborhood":"","building":"","buildingType":"","street":"",'                    '"streetNumber":"","province":"","city":"","district":"","township":""},'                    '"formattedAddress":"","roads":[],"crosses":[],"pois":[],'                    '"info":"SUCCESS"}',    'created': str(int(time.time())),  # 创建时间    'sfzx': '0',  # 是否在校 否    'sfjcwhry': '0',  # 是否接触武汉人员 否    'sfcyglq': '0',  # 是否处于隔离期 否    'sftjwh': '0',  # 是否途径武汉 否    'sftjhb': '0',  # 是否途径湖北 否    'fjsj': '0',    'sfjchbry': '0',  # 是否接触湖北人员 否    'sfsfbh': '0',  # 是否    'jhfjsftjwh': '0',  # *****是否途径武汉 否    'jhfjsftjhb': '0',  # *****是否途径湖北 否    'szsqsfybl': '0',    'sfygtjzzfj': '0',  # 是否    'sfjcjwry': '0',  # 是否接触境外人员 否    'id': '4393912',    'ismoved': '0',  # 与上次地点是否有不同}sendEmail(eval(requests.post(url=url, data=data, headers=headers).text)['m'])

更多案例源码私信小编01获取

 


版权声明:本文为weixin_43881394原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。