之前写了一个程序,可以帮助上报健康数据到智慧山水。
但是一直是需要自己电脑或者服务器的支持,自己的电脑需要长期开机,或者花钱购买云服务器。
现在终于可以摆脱束缚,仅需一次配置,配置完成后无需电脑或服务器,每日云端自动提交,零成本、无电费。
以下方式可实现定时提交程序。
云端自动提交 使用腾讯云函数 腾讯云函数介绍 什么是腾讯云函数?
官方介绍:
腾讯云云函数(Serverless Cloud Function,SCF)是腾讯云为企业和开发者们提供的无服务器执行环境,帮助您在无需购买和管理服务器的情况下运行代码, 是实时文件处理和数据处理等场景下理想的计算平台。 您只需使用 SCF 平台支持的语言编写核心代码并设置代码运行的条件,即可在腾讯云基础设施上弹性、安全地运行代码。
简单来说就是可以自动定时运行代码的服务器,你无需担心服务器是否正常、是否被攻击,只需要关心代码即可。
免费额度
资源类型 每月免费额度 资源使用量 40 万 GBs 调用次数 100 万次 已经够使用了。
使用方式 准备代码 下载运行环境依赖 由于代码引入了python的lxml库,但是腾讯云函数提供的环境中又没有此依赖,所以需要手动上传。
依赖下载地址:https://wwa.lanzous.com/ivuSHeukg2h
下载到一个压缩包。
打开之后结构如图所示:
将程序运行所必须的文件放入此压缩包
程序仓库:https://github.com/imldy/health-data-post(里面有代码及使用说明)
配置文件使用说明:https://github.com/imldy/health-data-post/blob/master/students_data_explain.md
必须的文件列表:
HealthDataPost.py(代码) students_data.json(配置文件) 我用的解压缩软件是Bandizip,可以直接拖拽文件到压缩包。
点击“确定”
如果你的软件不支持拖拽文件到压缩包,你可以先解压依赖文件,然后和软件运行所必须的文件压缩到同一个压缩包内,是.zip格式即可。
如图所示,是准备好的压缩文件,里面包含依赖,也包含程序运行所必须的文件。
注册、登录腾讯云 链接:https://cloud.tencent.com/product/scf
打开上方链接,点击右上角登录,可以使用邮箱、QQ等,直接登录即可,很简单,不再赘述。
使用腾讯云函数 点击页面左边的“立即使用”进入控制台。
可以看到你已经拥有的函数的情况,初次使用为空正常。
点击左边的“函数服务”,可以看到已有的函数服务。
地区使用大陆地区(除非你的代码需要国际互联网的支持,但是咱们的提交健康数据使用国内网络即可)。
仓库地址 Github:https://github.com/imldy/health-data-post
更新内容 2020-04-13 Version:2.1
修改是否提交的判断逻辑为提取到提示信息进行判断 2020-04-12 Version:2.0 1. 提交内容更新。 2. 提交页面网址以及提交接口更新。 3. 从当前页面上获取日期以提交。
2020年4月12日更新了提交入口与提交接口,还修改了要提交的内容,特做一个小结。
修改需要提交的数据 本次新增的加粗显示,释义更新的以斜体显示。
新增“网页元素name”、“选项/数据获得方式”列
key 网页元素name 释义 选项/数据获得方式 id did 已经提交的表单的id。 如果是当天初次提交,id为空即可,会创建一个新的表单。
当天提交后再次访问提交页面,返回的页面中会包含一个隐藏的输入框,其value就等于当天上次提交表单的id。则如果修改已经提交的信息则提交时id为此值即可。1 fillDate ddate 当天日期 以年-月-日的格式,例如2020-04-12(Xpath: /html//input[@name="ddate"]/@value) mqjk question1 1.目前个人身体健康情况 参考每日健康记录页面(空)v2.0.html文件。最好去http://pubinfo.sdwcvc.cn/xxtb2/dailyRecord页面实际考察对应选项的value。1 jrjk question2 2.一起居住的家人身体健康情况 参考每日健康记录页面(空)v2.0.html文件。最好去http://pubinfo.sdwcvc.cn/xxtb2/dailyRecord页面实际考察对应选项的value。1 city1 question3_0 3.目前所在*位置*:省份 参考xxtb2_js_city.json文件,但是一定要实际使用APP去定位一次,使用定位来的数据提交,因为这个文件有些地区不对。1 city2 question3_1 3.目前所在*位置*:市 参考xxtb2_js_city.json文件,但是一定要实际使用APP去定位一次,使用定位来的数据提交,因为这个文件有些地区不对。1 city3 question3_2 3.目前所在*位置*:县区 参考xxtb2_js_city.json文件,但是一定要实际使用APP去定位一次,使用定位来的数据提交,因为这个文件有些地区不对。1 sfwc question5 5.今天是否有外出 参考每日健康记录页面(空)v2.0.html文件。最好去http://pubinfo.sdwcvc.cn/xxtb2/dailyRecord页面实际考察对应选项的value。2 sfjc question6 7.今日是否参加过聚集性活动或去过人员密集场所 0代表否,1代表是。要求数字。
因为2020年疫情的原因,学校让每位同学在家上课并且每天上报健康数据,但是我上报了几次觉得很麻烦并且容易忘掉,遂写了一个python程序,帮助提交身体健康数据[注1][注2]。
我已经使用了大约1个半月左右了,经历了几次版本迭代,目前可以实现多账户提交,这里分享下当时的思路,如有不当之处,请予指正,E-MAIL:i.ldy@qq.com。
目标 针对“智慧山水”APP的“每日健康上报”功能实现自动上报数据。
思路 大致思路:
获取提交数据的API 每天自动向学校服务器发送数据 第一步、确定提交的数据是以怎样的形式被传输到学校服务器的 因为学校是让我们下载了一个安卓APP,所以在这一步中,我使用了手机端的抓包软件(当然也可以使用更专业的PC端的抓包软件),访问提交信息的页面并填写提交了数据,抓包到了一个网址链接[注3]。
刚截的图,请忽略日期
抓包到的链接:http://pubinfo.sdwcvc.cn/Xxtb/dailyRecord?userid=我的学号
经测试,可以省略掉问号以及之后的内容。
PC端浏览器访问这个网址,跳转到了统一身份认证页面http://sso.sdwcvc.cn/(当时学校第一次启用智慧山水APP,所以我这里猜测是学校平台的PC端,后证实确实是),可以登录自己的账号。我当时为了速度,就使用了手机验证码登录。
登录账号后跳转到了 智慧校园综合服务门户http://portal.sdwcvc.cn/,我看到了与手机端类似的功能按钮与设计,但是并没有提交信息的入口,仅存的“健康上报管理”按钮还是灰色的。
刚截的图,可能跟当时不一样
尝试使用浏览器的“检查”功能,没有找到入口链接,所以我尝试再一次访问之前抓包到链接,这次可以正常查看提交信息的页面,发现原来就是提交页面,而且上边显示我今天已经提交。
我试着点击了“我要修改”,发现来到了正式的提交页面。之后我查看网页源代码,发现因为当天已经提交了,所以正式页面需要点击一次按钮才能被显示。如果当天未提交,则服务器返回的网页不会提示已经上报,这点可以作为当天初次提交还是修改的依据。
刚截的图,请忽略日期
然后我开启了浏览器“检查”功能,打开NetWork选项卡,点击了网页的“提交修改”的按钮,发现抓包到了个好东西。
刚截的图,请忽略日期,打码的红色是个人隐私信息
GET方式的请求,且Request URL是键值对的形式传输了数据,不难猜到这就可能就是传输的健康信息。
链接(已脱敏):
http://pubinfo.sdwcvc.cn/Xxtb/saveRecord?id=924680&mqjk=%E5%81%A5%E5%BA%B7&jrjk=%E5%81%A5%E5%BA%B7&city1=%E5%8C%97%E4%BA%AC&city2=%E5%8C%97%E4%BA%AC&city3=%E5%8C%97%E4%BA%AC&sfwc=0&sfjc=0&sfhb=0&zb=%E4%B8%8D%E6%B8%85%E6%A5%9A&jchz=%E5%90%A6&other=%E8%BD%BB%E5%BE%AE%E5%92%B3%E5%97%BD%EF%BC%8C%E4%B8%8D%E5%8F%91%E7%83%AD%EF%BC%8C%E6%8B%BF%E4%BA%86%E8%8D%AF%E3%80%82 然后我们鼠标向下滑动,发现了浏览器已经帮我们做了解码。
为了避免服务器端接受信息产生歧义,url通常会被浏览器进行编码,所以这里我们看到的了好多%这样的url。
试着手动复制url到浏览器地址栏并访问,返回了这样的数据。
由此可以确定这就是我想要找到的接口。
第二步、编写代码 拿到了数据接口,开始用Pyhon写爬虫程序。
第一个版本是完全没有封装、没有优化,仅仅只有提交信息的功能。身体健康信息是用一个字典变量进行保存的,而且是写死在了代码里面。请求头数据使用的是浏览器抓包到的Request Heades信息。
登录获取Cookie 试了几次提交我发现Cookie的可用时间比较短,PC端退出了就失效了,于是我尝试每次登录获取Cookie然后再提交信息,于是我去了网站登陆页面 智慧校园综合服务门户http://portal.sdwcvc.cn/。
发现了三种登录方式。
后两种都不能实现无人值守,所以我决定使用用户名(学号)登录。
模拟发送登录请求获取Cookie
与上边抓包获得数据提交的接口同理,这次输入完用户名和密码后,点击登录之前要先打开浏览器的“检查功能”,切换至“NetWork”选项卡,然后再点击登录,会发现已经成功登录,并抓包成功,且浏览器跳转到了“智慧校园综合服务门户”页面
可以发现,发送请求使用的POST方式,并获取到了url:http://sso.sdwcvc.cn/index.php?rid=verifyWebUser
滑动至Headers选项卡最下面,找到了发送的数据。
经测试,仅需使用username用户名(学号)和password密码两项即可登录。
从登录到提交中间时间保持登录状态,我使用的方法是创建一个requests.session()实例对象,使用这个实例对象进行登录以及提交健康数据。
实际过程中我还请求了提交页面,查看当天是否已经提交成功了。
传输的信息中key的含义 我尝试修改了提交的信息,查看了网页源码,经过多次验证确定了每个key的含义
url中的每个key的解释如下
key 含义 id 表单id,如果是当天初次提交,id为空即可,会创建一个新的表单。当天提交后再次访问提交页面,返回的页面中会包含一个隐藏的输入框,其value就等于当天已经提交表单的id(Xpath:/html//input[@name="did"]/@value)。如果修改已经提交的信息则提交时id为此值即可。 mqjk 1.目前个人身体健康情况 jrjk 2.