上课了系统自动考勤
脚本功能与代码解析
1. 脚本概述
这个Python脚本旨在通过网络请求与API进行交互,实现获取用户令牌(Token)、查询未考勤数量、获取考勤码与完成考勤等功能。它主要针对的是上课了的数字考勤系统,通过模拟网络请求来实现与系统的交互。
2. 代码详解
2.1 获取Token: fetch_token(uid)
- 功能: 向特定URL发送POST请求,以获取用户的Token。
- 参数:
uid
- 用户的ID。
- 返回: 如果请求成功(状态码200),返回Token;否则返回None。
- 实现细节:
- 使用
requests.post
向URL发送POST请求。 - 包含定制的headers,模拟浏览器访问。
- 将请求的响应内容解析为JSON,并检查状态码及Token值。
- 使用
2.2 获取未考勤数量: get_uncall_number(token)
- 功能: 使用Token查询当前的未考勤数量。
- 参数:
token
- 用于身份验证的Token。
- 实现细节:
- 发送GET请求,头部携带Token。
- 解析响应内容,根据状态码和返回的数据进行相应处理。
2.3 获取考勤码: create_call_number(token, call_id)
- 功能: 获取考勤码。
- 参数:
token
- 用于验证的Token。
call_id
- 考勤ID。
- 返回: 考勤码或None(如果失败)。
- 实现细节:
- 发送POST请求,包含Token和考勤ID。
- 解析响应,获取考勤码。
2.4 完成考勤: validate_call_number(token, call_stu_id, num)
- 功能: 发送给定的考勤码以完成考勤。
- 参数:
token
- Token值。
call_stu_id
- 学生考勤ID。
num
- 考勤码。
- 实现细节:
- 发送POST请求,包含必要的验证信息。
- 解析响应并输出。
2.5 主函数: main()
- 功能: 读取用户ID列表,为每个用户获取Token,并执行后续操作。
- 实现细节:
- 从
uid.txt
文件读取用户ID。 - 对每个ID,获取Token并进行后续操作。
- 从
2.6 入口点
- 代码:
if __name__ == "__main__": main()
- 功能: 确保当脚本作为主程序运行时,调用主函数。
3. 代码使用
- 准备: 一个包含用户ID的文本文件(uid.txt)。
- 运行: 使用Python环境执行脚本。
- 输出: 根据脚本逻辑,输出不同的结果,例如Token信息,考勤码,验证结果等。
注意:此脚本涉及网络请求和数据处理,应在遵守相关法律法规和网络安全准则的前提下使用。
4. 具体代码
import requests
def fetch_token(uid):
"""
发送POST请求以获取token值。
参数:
uid: 用户的ID。
返回:
如果状态码为200,则返回token值,否则返回None。
"""
url = "http://*****.cn/api/Main/Quick"
headers = {
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"DNT": "1",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Origin": "http://******",
"Referer": f"http://***************?uid={uid}",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
}
data = {"uid": uid}
response = requests.post(url, headers=headers, data=data)
try:
response_json = response.json()
if response_json.get("state") == 200:
return response_json.get("token")
except ValueError:
print("响应内容无法解析为JSON。")
return None
def get_uncall_number(token):
"""
使用token发送GET请求以获取未呼叫数量。
参数:
token: 用于验证的token值。
返回:
响应的文本内容。
"""
url = "http://********.cn/api/Call/GetUnCallNumber"
headers = {
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"DNT": "1",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
"Auth": token,
"Origin": "http://******",
"Referer": "http://********/wei/pages/attendance/call_sign.html?1711430518796",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
}
response = requests.post(url, headers=headers)
response_json = response.json()
# 处理响应
if response_json.get("state") == "ok" and "msg" in response_json:
print("无待签到的数字考勤")
elif response_json.get("state") == "ok" and "callStuId" in response_json:
call_id = response_json["call"]["CallId"]
call_stu_id = response_json["callStuId"] # 获取callStuId
course_name = response_json["call"]["CourseName"] # 获取课程名称
print("课程名称:", course_name) # 打印课程名称
num = create_call_number(token, call_id) # 获取考勤码
if num:
validate_call_number(token, call_stu_id, num) # 验证考勤码
def create_call_number(token, call_id):
"""
使用token和call_id发送POST请求以获取考勤码。
参数:
token: 用于验证的token值。
call_id: 考勤ID。
返回:
考勤码。
"""
url = "http://******/api/Call/CreateCallNumber"
headers = {
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"DNT": "1",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Auth": token,
"Origin": "http://******",
"Referer": "http://******/wei/pages/attendance/call_num.html?callid=" + call_id,
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
}
data = {
"Flag": "0",
"CallId": call_id
}
response = requests.post(url, headers=headers, data=data)
try:
response_json = response.json()
if response_json.get("state") == "ok" and "data" in response_json:
num = response_json["data"]
print("考勤码:", num)
return num
else:
print("获取考勤码失败")
except ValueError:
print("响应内容无法解析为JSON。")
return None
def validate_call_number(token, call_stu_id, num):
"""
使用token, callStuId和考勤码num发送POST请求以验证考勤码。
参数:
token: 用于验证的token值。
call_stu_id: 学生考勤ID。
num: 考勤码。
"""
url = "http://******/api/Call/VaildCallNumber"
headers = {
"Connection": "keep-alive",
"Accept": "application/json, text/javascript, */*; q=0.01",
"DNT": "1",
"X-Requested-With": "XMLHttpRequest",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Auth": token,
"Origin": "http://******",
"Referer": "http://******/wei/pages/attendance/call_sign.html?1711431873822",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9",
}
data = {
"callStuId": call_stu_id,
"num": num
}
response = requests.post(url, headers=headers, data=data)
try:
response_json = response.json()
print("验证考勤码响应:", response_json)
except ValueError:
print("响应内容无法解析为JSON。")
def main():
with open('uid.txt', 'r') as file:
uids = file.readlines()
for uid_str in uids:
uid = uid_str.strip() # 移除尾部换行符
token = fetch_token(uid)
if token:
print(f"UID {uid} 获取Token成功:", token)
# 使用获取到的token继续执行逻辑
get_uncall_number(token) # 请确保此函数和它调用的其他函数能正确处理token
else:
print(f"UID {uid} 无法获取token或状态码不为200。")
# 调用主函数
if __name__ == "__main__":
main()