为什么会整健康信息自动提交,还得从一只蝙蝠说起。

受2019-nCoV的影响,为了解每个人的健康情况,很多单位都要求员工每日上报自己的健康情况。这种行为出发点是好的,但在实际执行过中却显得极为形式主义。每天规定早07:30必须打卡上报;上报信息准确性有待考证;强制使用各种APP导致个人信息泄露(虽然说在互联网时代获取一个人的信息极为容易,但也顶不住这样白给)……面对这种情况,个人无力反抗,只能按部就班的使用Python上交。(手动提交是不可能手动提交的,全自动化提交不香嘛。)

一、数据包分析

提交数据必然会向服务器发送信息,因此就需要抓取数据包。这里我采用的是Drony(安卓应用,用作HTTP代理)+ BurpSuite 。通过分析发现就是简单的POST提交一个带有json数据包。值得注意的是,安卓的WLAN自带的HTTP代理并不能发送全部的数据包到Burp,所以,最后选择了Drony内建VPN进行代理转发。(不想使用电脑的话可以考虑使用HttpCanary、Packet Capture等Android应用抓包)

User-Agent:Dart/2.7 (dart:io)
info = {
    "home":"在家",
    "address":"",
    "keepInHome":"否",
    "keepInHomeDate":"null",
    "contact":"否",
    "health":"否",
    "fever":"否",
    "feverValue":"",
    "cough":"否",
    "diarrhea":"否",
    "arriveHubei":"无",
    "travel":"无",
    "remark":"无",
    "submitCount":1
}

二、Python脚本编写

1. 建立会话

session = requests.session()

2.登录获取cookie

login = session.post(login_url, json = user, headers = headers)

3.提交数据

health = session.post(health_url, json = info, headers = headers)

三、自动执行

Linux系统使用corntab -e建立计划任务;Windows使用taskschd.msc建立计划任务。
但由于APP托管的服务器日常卡顿,且还会屏蔽ip,所以托管在服务器上并不是那么稳定,因此考虑托管在Android手机。托管在安卓需要2个应用,1个插件(Tasker, Termux; Termux:Tasker),且都不需要root

(1)Termux——终端模拟器和Linux环境
Android基于Linux,这个软件就是在安卓上实现Linux环境。支持运行python, PHP, MySQL等。
0.0下载地址

#Google Play Store
https://play.google.com/store/apps/details?id=com.termux
#F-Droid
https://f-droid.org/repository/browse/?fdid=com.termux

Termux使用起来与Linux Shell相似。pkg管理程序包(使用方法与apt、yum类似)。

0.1更换国内源(可选)
将原来的https://termux.org/packages/官方源替换为http://mirrors.tuna.tsinghua.edu.cn/termux

#vi $PREFIX/etc/apt/sources.list
#deb https://termux.org/packages/ stable main
deb https://mirrors.tuna.tsinghua.edu.cn/termux stable main

1.1安装python3

pkg install python

1.2安装requests模块

pip install requests

2.建立任务存放目录

完整路径/data/data/com.termux/files/home/.termux/tasker/
未root时程序仅能访问的目录,将所有脚本都放在这个目录下.

mkdir -p ~/.termux/tasker

4.1py文件第一行执行声明

#!/data/data/com.termux/files/usr/bin/python

4.2py文件权限设置(*代表你的py文件名)

chmod 755 *.py

(2)Termux:Tasker

插件。用于Tasker等调用。注意:不要在Google Play和F-Droid之间混合安装Termux和插件。
下载地址

#Google Play Store
https://play.google.com/store/apps/details?id=com.termux.tasker
#F-Droid
https://f-droid.org/packages/com.termux.tasker/
#更多插件请查看官方Wiki
https://wiki.termux.com/wiki/Main_Page

(3)Tasker——让安卓全自动化

这是一个十分强大的应用,你想做的没有做不到的…其实单独使用这个软件就可以完成打卡操作,但步骤过于繁琐,于是就考虑了和Termux双宿双飞。
下载地址(上不了Goolge可以考虑apkpure、apkmirror等网站下载)

#Google Play Store
http://market.android.com/details?id=net.dinglisch.android.taskerm
#官网下载试用
https://tasker.joaoapps.com/download.html

Tasker使用的时候注意好应用权限设置,另外还要自启动、关联启动等应用的设置,以及设置电池优化白名单。
大致流程1.创建配置文件-时间 2.创建任务-插件-Termux:Tasker-配置-*.py 3.点√保存


附:python签到模板(自行修改user、info、url等信息)

#!/data/data/com.termux/files/usr/bin/python
# -*- coding: utf-8 -*-
import re
import requests
import os
import time
import sys
import json
headers = {
    'User-Agent':'Dart/2.7 (dart:io)'
    }
user = {
    "username":"12345678",
    "password":"87654321"
    }
info = {
    "home":"在家",
    "address":"",
    "keepInHome":"否",
    "keepInHomeDate":"null",
    "contact":"否",
    "health":"否",
    "fever":"否",
    "feverValue":"",
    "cough":"否",
    "diarrhea":"否",
    "arriveHubei":"无",
    "travel":"无",
    "remark":"无",
    "submitCount":1
    }
login_url = "http://localhost/authentication/login"
health_url = "http://localhost/student/healthInfo/save"
session = requests.session()
login = session.post(login_url, json = user, headers = headers)
cookies = session.cookies.get_dict()
health = session.post(health_url, json = info, headers = headers)

log = "./log.txt"
with open(log, "a") as f:
    f.write(time.strftime("[%Y/%m/%d %H:%M:%S]") + '\n')
    f.write(json.dumps(cookies, sort_keys=True, indent=4, separators=(',', ':')) + '\n')
    f.write(json.dumps(health.json(), sort_keys=True, indent=4, separators=(',', ':')) + '\n')
    f.close()