Python实现疫情通定时自动填写功能(附代码)


Posted in Python onMay 27, 2020

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

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

Python实现疫情通定时自动填写功能(附代码)

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

1、核心模块

打开IEChrome。

Python实现疫情通定时自动填写功能(附代码)

打开网页按下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身份自动运行右侧命令。

Python实现疫情通定时自动填写功能(附代码)

4、最终效果

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

Python实现疫情通定时自动填写功能(附代码)

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

Python实现疫情通定时自动填写功能(附代码)

5、完整代码

import time
import requests
import smtplib
import datetime
from email.mime.text import MIMEText
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()
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'])

总结

到此这篇关于Python实现疫情通定时自动填写功能(附代码)的文章就介绍到这了,更多相关Python疫情通自动填写内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python数据库的连接实现方法与注意事项
Feb 27 Python
Ubuntu下安装PyV8
Mar 13 Python
Python实现全排列的打印
Aug 18 Python
Python-ElasticSearch搜索查询的讲解
Feb 25 Python
python实现微信每日一句自动发送给喜欢的人
Apr 29 Python
Python OpenCV实现鼠标画框效果
Aug 19 Python
详解Python中打乱列表顺序random.shuffle()的使用方法
Nov 11 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
Python基于Socket实现简单聊天室
Feb 17 Python
使用Keras预训练好的模型进行目标类别预测详解
Jun 27 Python
序列化Python对象的方法
Aug 01 Python
Python新建项目自动添加介绍和utf-8编码的方法
Dec 26 Python
Python unittest单元测试openpyxl实现过程解析
May 27 #Python
python实现爱奇艺登陆密码RSA加密的方法示例详解
May 27 #Python
python如何求100以内的素数
May 27 #Python
pytorch查看通道数 维数 尺寸大小方式
May 26 #Python
Pytorch 使用 nii数据做输入数据的操作
May 26 #Python
python变量的作用域是什么
May 26 #Python
Python3 pywin32模块安装的详细步骤
May 26 #Python
You might like
一个用于mysql的数据库抽象层函数库
2006/10/09 PHP
PHP小技巧搜集,每个PHPer都来露一手
2007/01/02 PHP
php处理带有中文URL的方法
2016/07/11 PHP
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
json 入门基础教程 推荐
2009/10/31 Javascript
兼容IE和Firefox火狐的上下、左右循环无间断滚动JS代码
2013/04/19 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
Javascript基础教程之数据类型转换
2015/01/18 Javascript
直接拿来用的页面跳转进度条JS实现
2016/01/06 Javascript
jQuery实现鼠标选文字发新浪微博的方法
2016/04/02 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
2016/06/25 Javascript
JavaScript高仿支付宝倒计时页面及代码实现
2016/10/21 Javascript
javascript实现简单的ajax封装示例
2016/12/28 Javascript
vue的无缝滚动组件vue-seamless-scroll实例
2017/12/18 Javascript
JS实现的判断方法、变量是否存在功能示例
2020/03/28 Javascript
vue实现与安卓、IOS交互的方法
2018/11/02 Javascript
详解vue项目打包步骤
2019/03/29 Javascript
js实现图片3D轮播效果
2019/09/21 Javascript
jQuery--遍历操作实例小结【后代、同胞及过滤】
2020/05/22 jQuery
vue-列表下详情的展开与折叠案例
2020/07/28 Javascript
javascript实现倒计时关闭广告
2021/02/09 Javascript
[12:29]《一刀刀一天》之DOTA全时刻19:蝙蝠骑士田伯光再度不举
2014/06/10 DOTA
python实现对指定输入的字符串逆序输出的6种方法
2018/04/26 Python
详解python单元测试框架unittest
2018/07/02 Python
python 实现倒排索引的方法
2018/12/25 Python
详解python函数的闭包问题(内部函数与外部函数详述)
2019/05/17 Python
python 对任意数据和曲线进行拟合并求出函数表达式的三种解决方案
2020/02/18 Python
HTML5新增的标签和属性归纳总结
2018/05/02 HTML / CSS
如何让pre和textarea等HTML元素去掉滚动条自动换行自适应文本内容高度
2019/08/01 HTML / CSS
台湾良兴购物网:EcLife
2019/12/01 全球购物
11月升旗仪式讲话稿
2014/02/15 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
英语邀请函范文
2015/02/02 职场文书
2015年幼儿园安全工作总结
2015/05/12 职场文书
员工离职证明范本
2015/06/12 职场文书
JPA 通过Specification如何实现复杂查询
2021/11/23 Java/Android