关于如何实现能够及时获取教务系统更新的成绩

第一步 登录问题

使用浏览器开发者工具可以获取登录接口以及需要的参数
登录接口:https://jwc.htu.edu.cn/dev-api/appapi/applogin
参数:

1
2
3
4
5
6
login_data = {
'username': 学号,
'password': 加密后的密码,
'code': '',
'appid': None,
}

如此便可以使用Python构造登录请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
cookies = {
'language': 'zh-CN',
}
headers = {
'Referer': 'https://jwc.htu.edu.cn/app/?code',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 '
'Safari/537.36 NetType/WIFI MicroMessenger/7.0.20.1781(0x6700143B) WindowsWechat(0x63090819) '
'XWEB/8519 Flue '
}
login_data = {
'username': username,
'password': key_passward,
'code': '',
'appid': None,
}
url = 'https://jwc.htu.edu.cn/dev-api/appapi/applogin'
login_response = requests.post(url=url, cookies=cookies, headers=headers, json=login_data)
print(login_response.json())

第二步 密码加密问题

通过js逆向,分析出密码加密是使用了RSA加密方式,以及获取到了publickey,可在Python导入以下库

1
2
from Crypto.Cipher import PKCS1_v1_5 as Cipher_pksc1_v1_5
from Crypto.PublicKey import RSA

写成程序如下:

1
2
3
4
5
6
def encrpt(passward, publickey):
publickey = '-----BEGIN PUBLIC KEY-----\n' + publickey + '\n-----END PUBLIC KEY-----'
rsakey = RSA.importKey(publickey)
cipher = Cipher_pksc1_v1_5.new(rsakey)
cipher_text = base64.b64encode(cipher.encrypt(passward.encode()))
return cipher_text.decode()

经过验证可用

第三步 获取token

由于在之后获取消息和成绩列表时,均需要使用token令牌获取。
在第一步中登录成功后,返回的信息中就有token,直接拿来用即可。

第四步 接口列表

获取消息:https://jwc.htu.edu.cn/dev-api/appapi/getNotice
具体成绩:https://jwc.htu.edu.cn/dev-api/appapi/Studentcj/detail
全部成绩:https://jwc.htu.edu.cn/dev-api/appapi/Studentcj/data

第五步 推送微信

使用微信关注pushplus( https://www.pushplus.plus/ )后,打开网页登录后,点击( https://www.pushplus.plus/api/open/user/token )获取你的令牌。使用Python推送,即可推送到微信上。

1
2
3
4
5
6
7
8
9
10
11
import requests
import json

def send_message(title, content):
token = "你的token"
url = "http://www.pushplus.plus/send"
data = {"token": token, "title": title, "content": content, "template": 'markdown'}
body = json.dumps(data).encode(encoding="utf-8")
headers = {"Content-Type": "application/json"}
response = requests.post(url, data=body, headers=headers)
return response.text

第六步 部署Github

在Github新建仓库,上传写好的Python程序,
-2024-02-07-165357.png点击Actions,点击set up a workflow yourself,可以直接复制 https://raw.githubusercontent.com/JiaLiFuNia/HNUScoreChecker/master/.github/workflows/main.yml 我的main.yml文件

-2024-02-07-171242.png执行以下步骤:Actions->CheckScores->Run workflow等待运行结果,出现绿色对勾即位运行成功,程序每半个小时运行一次。