健康打卡脚本
基本就是复现该大佬的工作,这是博客用Python实现中科大健康打卡脚本 - 逸風亭 (fyz666.xyz)
这是GitHub源码库GitHub - windshadow233/USTC-Auto-Health-Report: 基于Python requests库的中科大健康打卡脚本
但是他可能没有把细节问题说清楚,也没有一个明确的流程来进行复现,并且可能有些地方没有更新,所以这里重新整理一下,让更多人可以更快的实现脚本自动打卡。
大佬基本把路都铺平了,所以我就把不同点、需要更改的接口和具体实现流程记录下,只要按照以下步骤操作就可以做到一键打卡了,如果你有一个服务器还可以实现全天候自动打卡。
步骤流程:
- Beautiful Soup4 和 requests 库的安装;
- 需要的文件的准备;
- 脚本一键打卡;
依赖库的安装
- 终端输入
pip install beautifulsoup4
安装Beautiful Soup4; - 终端输入
pip install requests
安装requests库;
准备文件
json表单文件:
该文件包含需要提交的表单内容,是分析打卡过程中得到的需要提交的表单,大佬的代码里的表单内容是很久之前的表单了,这里更新了一下,原理都是一样的。
post.json
{
"juzhudi": "西校区",
"dorm_building": "1",
"dorm": "110",
"body_condition": "1",
"body_condition_detail": "" ,
"has_fever": "0",
"last_touch_sars": "0",
"last_touch_sars_date": "" ,
"last_touch_sars_detail": "" ,
"is_danger": "0",
"is_goto_danger": "0",
"jinji_lxr": "我",
"jinji_guanxi": "父子",
"jiji_mobile": "18854081208",
"other_detail": ""
}
注意更改你的居住地、宿舍号、紧急联系人和联系方式的内容。
如果现在在家里,需要提交的表单内容就不同了,可以参考以下表单进行提交:
post_home.json
{
"juzhudi": "xx省xx市xx区",
"q_0": "良好",
"body_condition_detail": "" ,
"q_2": "" ,
"q_3": "" ,
"jinji_lxr": "紧急联系人" ,
"jinji_guanxi": "父子",
"jiji_mobile": "18854081208",
"other_detail": ""
}
上面两个表单是每日打卡所提交的,而我们也许还想要一键把出校报备也实现,所以再增加一个json文件来存储报备需要的表单信息。
transport.json
{
"return_college[]": "东校区",
"reason": "科研工作",
"comment": "",
"t": "3"
}
这个也可以改一下去的校区和工作目的。
上述的表单如果发生了变化,则需要在浏览器中重新查找提交的表单,在开发者模式看提交了哪些内容。
`ustc_passport_login.py`
定义了登录的类,被下一个python文件使用
import requests
from bs4 import BeautifulSoup
class USTCPassportLogin(object):
def __init__(self):
self.passport = "https://passport.ustc.edu.cn/login"
self.sess = requests.session()
self.sess.headers = {
"User-Agent": 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36'
}
def _get_cas_lt(self):
"""
获取登录时需要提供的验证字段
"""
response = self.sess.get(self.passport)
CAS_LT = BeautifulSoup(response.text, 'html.parser').find(attrs={'id': 'CAS_LT'}).get('value')
return CAS_LT
def login(self, username, password):
"""
登录,需要提供用户名、密码
"""
self.sess.cookies.clear()
try:
CAS_LT = self._get_cas_lt()
login_data = {
'username': username,
'password': password,
'warn': '',
'CAS_LT': CAS_LT,
'showCode': '',
'button': '',
'model': 'uplogin.jsp',
'service': ''
}
self.sess.post(self.passport, login_data, allow_redirects=False)
return self.sess.cookies.get("logins") is not None
except Exception as e:
print(e)
return False
不需要更改
ustc_auto_report.py
登录使用的类,我将每日健康打卡(还有报备)的步骤也添加进去了,使用里面的函数方法即可实现一键打卡。
这里我遇到了一个文件打开的编码问题,如果你的编码方式是UTF-8,那就不需要修改,如果不是就需要更改一下文件打开的时候的编码方式。
import json
from bs4 import BeautifulSoup
import datetime
from ustc_passport_login import USTCPassportLogin
class USTCAutoHealthReport(object):
def __init__(self):
# 用于登录
self.login_bot = USTCPassportLogin()
self.sess = self.login_bot.sess
# CAS身份认证url
self.cas_url = 'https://passport.ustc.edu.cn/login?service=https%3A%2F%2Fweixine.ustc.edu.cn%2F2020%2Fcaslogin'
# 打卡url
self.clock_in_url = 'https://weixine.ustc.edu.cn/2020/daliy_report'
# 每周报备url
self.report_url = 'https://weixine.ustc.edu.cn/2020/apply/daliy/ipost'
# 图片上传get url
self.upload_url = 'https://weixine.ustc.edu.cn/2020/upload/xcm'
# 图片上传post url
self.upload_image_url = 'https://weixine.ustc.edu.cn/2020img/api/upload_for_student'
# 每日进出校申请url
self.stayinout_apply_url = 'https://weixine.ustc.edu.cn/2020/stayinout_apply'
# 身份认证token
self.token = ''
def _get_token(self):
"""
获取打卡时需要提供的验证字段
"""
response = self.sess.get(self.cas_url)
s = BeautifulSoup(response.text, 'html.parser')
token = s.find(attrs={'name': '_token'}).get('value')
return token
def _check_success(self, response):
"""
简单check一下有没有成功打卡、报备
"""
s = BeautifulSoup(response.text, 'html.parser')
msg = s.select('.alert')[0].text
return '成功' in msg
def login(self, username, password):
"""
登录,需要提供用户名、密码
"""
self.token = ''
is_success = self.login_bot.login(username, password)
if is_success:
self.token = self._get_token()
return is_success
def daily_clock_in(self, post_data_file):
"""
打卡函数,需要提供包含表单内容的json文件
打卡函数,需要提供包含表单内容的json文件(示例见post.json)
打卡成功返回True,打卡失败返回False
"""
try:
with open(post_data_file, 'r', encoding='UTF-8') as f:
post_data = json.loads(f.read())
post_data['_token'] = self.token
response = self.sess.post(self.clock_in_url, data=post_data)
return self._check_success(response)
except Exception as e:
print(e)
return False
def report(self, data_file):
"""
2022年3月18日起每日进出校申请
出入校报备,需要提供包含表单内容的json文件(示例见report.json)
申请成功返回True,申请失败返回False
:param data_file表单数据文件
"""
try:
with open(data_file, 'r', encoding='UTF-8') as f:
post_data = json.loads(f.read())
now = datetime.datetime.now()
post_data['_token'] = self.token
post_data['start_date'] = now.strftime("%Y-%m-%d %H:%M:%S")
post_data['end_date'] = now.strftime("%Y-%m-%d 23:59:59")
response = self.sess.post(self.report_url, data=post_data)
return self._check_success(response)
except Exception as e:
print(e)
return False
report = USTCAutoHealthReport()
report.login('PB20220000', '666666')
#如果你在家
report.daily_clock_in('D:\\YourDirectoryHere\\post_home.json')
#如果你在学校
#report.daily_clock_in('D:\\YourDirectoryHere\\post.json')
#report.report('D:\\YourDirectoryHere\\transport.json')
这里需要更改最后几行,把login内容改为你的学号和密码,把打卡和报备的路径改为你存储json文件的路径。
注意!如果你在家就要注释掉另外两行防止产生问题!
脚本一键打卡
report.sh
#!/bin/bash
python ustc_auto_report.py
只要双击运行脚本文件就可以同时实现打卡和报备了!
问题是还要每天记得去点一下依然麻烦,有几种考量方式,一个是把打卡脚本添加进开机自启里,只要每次开机就会自动运行,但存在的问题是也许你可能一天都没打开过电脑,或者是开机的时候没联网导致打卡失败;
另一个方法是,如果你有服务器账号,就可以在服务器端配置以上的流程,并写一个每天循环提交的脚本来持续运行,为了防止可能出现的各种意外,比如服务器检修,所以每天打卡报备两次更加保险;
或者可以直接使用系统服务来执行定时任务,输入 crontab -e
修改crontab文件,并输入以下命令:
00 00,12 * * * python /directory/ustc_auto_report.py
保存之后服务器即可实现每天两次自动打卡了,省心省力b( ̄▽ ̄)d
标签:脚本,中科大,url,self,json,post,data,打卡 From: https://www.cnblogs.com/hhr346/p/17053487.html