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实现simhash算法实例
Apr 25 Python
Python六大开源框架对比
Oct 19 Python
python下调用pytesseract识别某网站验证码的实现方法
Jun 06 Python
Python获取暗黑破坏神3战网前1000命位玩家的英雄技能统计
Jul 04 Python
pandas实现选取特定索引的行
Apr 20 Python
在Mac上删除自己安装的Python方法
Oct 29 Python
手把手教你pycharm专业版安装破解教程(linux版)
Sep 26 Python
python列表推导和生成器表达式知识点总结
Jan 10 Python
通过python实现windows桌面截图代码实例
Jan 17 Python
Python try except异常捕获机制原理解析
Apr 18 Python
深入理解Python 多线程
Jun 16 Python
Python 防止死锁的方法
Jul 29 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
工厂模式在Zend Framework中应用介绍
2012/07/10 PHP
php中call_user_func函数使用注意事项
2014/11/21 PHP
浅谈PHP检查数组中是否存在某个值 in_array 函数
2016/06/13 PHP
Windows平台实现PHP连接SQL Server2008的方法
2017/07/26 PHP
Laravel向公共模板赋值方法总结
2019/06/25 PHP
在b/s开发中经常用到的javaScript技术
2006/08/23 Javascript
jQuery一步一步实现跨浏览器的可编辑表格,支持IE、Firefox、Safari、Chrome、Opera
2009/08/28 Javascript
JavaScript 的继承
2011/10/01 Javascript
JavaScript中的正则表达式简明总结
2014/04/04 Javascript
Node.js插件的正确编写方式
2014/08/03 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
vue,angular,avalon这三种MVVM框架优缺点
2016/04/27 Javascript
JS封装通过className获取元素的函数示例
2016/12/20 Javascript
js实现九宫格的随机颜色跳转
2017/02/19 Javascript
vue-cli+webpack记事本项目创建
2017/04/01 Javascript
详解AngularJS ui-sref的简单使用
2017/04/24 Javascript
JS动态添加元素及绑定事件造成程序重复执行解决
2017/12/07 Javascript
jquery实现联想词搜索框和搜索结果分页的示例
2018/10/10 jQuery
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
利用JS响应式修改vue实现页面的input值
2019/09/02 Javascript
python分析网页上所有超链接的方法
2015/05/08 Python
pycharm在调试python时执行其他语句的方法
2018/11/29 Python
解决python写入带有中文的字符到文件错误的问题
2019/01/31 Python
详解DeBug Python神级工具PySnooper
2019/07/03 Python
django之静态文件 django 2.0 在网页中显示图片的例子
2019/07/28 Python
django创建超级用户过程解析
2019/09/18 Python
python实现发送form-data数据的方法详解
2019/09/27 Python
python读取ini配置的类封装代码实例
2020/01/08 Python
什么是命名空间(NameSpace)
2015/11/24 面试题
捐款倡议书格式范文
2014/05/14 职场文书
计算机系本科生求职信
2014/05/31 职场文书
生日宴会策划方案
2014/06/03 职场文书
健康状况证明书
2014/11/26 职场文书
2015年监理工作总结范文
2015/04/07 职场文书
余世维讲座观后感
2015/06/11 职场文书
英语导游欢迎词
2015/09/30 职场文书