AI摘要:本文介绍了一个基于Python的安徽师范大学图书馆自动预约脚本。该脚本利用超星学习通的预约框架,实现自动登录和座位预约。文章详细解释了脚本的关键功能,包括登录预约、主程序调试、房间ID获取以及配置文件读取等。脚本支持多用户预约和滑块验证,并提供调试模式方便用户排查问题。目前脚本通过手动cookie登录,未来计划改进登录方式。
Powered by 返回门户.
AHNU图书馆自动预约
2024年 结束了 2025 我们一定会过的更好的
max的驱动力是懒,使用懒得争分夺秒的去抢图书馆的座位,但是为什么还是约不到呢?
为了更大化展现计算机人的能力,上脚本!
但是我又不会爬虫怎么办呢?
去github看一看
根据已知信息 前图书馆预约项目的“负责人” 告诉我这个是超星学习通的图书馆预约框架
so 搜索超星图书馆预约 学习通图书馆
得到结论:https://github.com/bear-zd/ChaoXingReserveSeat
前去下载观察:
import json
import time
import argparse
import os
import logging
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
from utils import reserve, get_user_credentials
get_current_time = lambda action: time.strftime("%H:%M:%S", time.localtime(time.time() + 8*3600)) if action else time.strftime("%H:%M:%S", time.localtime(time.time()))
get_current_dayofweek = lambda action: time.strftime("%A", time.localtime(time.time() + 8*3600)) if action else time.strftime("%A", time.localtime(time.time()))
SLEEPTIME = 0.2 # 每次抢座的间隔
ENDTIME = "07:01:00" # 根据学校的预约座位时间+1min即可
ENABLE_SLIDER = False # 是否有滑块验证
MAX_ATTEMPT = 5 # 最大尝试次数
RESERVE_NEXT_DAY = False # 预约明天而不是今天的
def login_and_reserve(users, usernames, passwords, action, success_list=None):
logging.info(f"Global settings: \nSLEEPTIME: {SLEEPTIME}\nENDTIME: {ENDTIME}\nENABLE_SLIDER: {ENABLE_SLIDER}\nRESERVE_NEXT_DAY: {RESERVE_NEXT_DAY}")
if action and len(usernames.split(",")) != len(users):
raise Exception("user number should match the number of config")
if success_list is None:
success_list = [False] * len(users)
current_dayofweek = get_current_dayofweek(action)
for index, user in enumerate(users):
username, password, times, roomid, seatid, daysofweek = user.values()
if action:
username, password = usernames.split(',')[index], passwords.split(',')[index]
if(current_dayofweek not in daysofweek):
logging.info("Today not set to reserve")
continue
if not success_list[index]:
logging.info(f"----------- {username} -- {times} -- {seatid} try -----------")
s = reserve(sleep_time=SLEEPTIME, max_attempt=MAX_ATTEMPT, enable_slider=ENABLE_SLIDER, reserve_next_day=RESERVE_NEXT_DAY)
s.get_login_status()
s.login(username, password)
s.requests.headers.update({'Host': 'office.chaoxing.com'})
suc = s.submit(times, roomid, seatid, action)
success_list[index] = suc
return success_list
def main(users, action=False):
current_time = get_current_time(action)
logging.info(f"start time {current_time}, action {'on' if action else 'off'}")
attempt_times = 0
usernames, passwords = None, None
if action:
usernames, passwords = get_user_credentials(action)
success_list = None
current_dayofweek = get_current_dayofweek(action)
today_reservation_num = sum(1 for d in users if current_dayofweek in d.get('daysofweek'))
while current_time < ENDTIME:
attempt_times += 1
# try:
success_list = login_and_reserve(users, usernames, passwords, action, success_list)
# except Exception as e:
# print(f"An error occurred: {e}")
print(f"attempt time {attempt_times}, time now {current_time}, success list {success_list}")
current_time = get_current_time(action)
if sum(success_list) == today_reservation_num:
print(f"reserved successfully!")
return
def debug(users, action=False):
logging.info(f"Global settings: \nSLEEPTIME: {SLEEPTIME}\nENDTIME: {ENDTIME}\nENABLE_SLIDER: {ENABLE_SLIDER}\nRESERVE_NEXT_DAY: {RESERVE_NEXT_DAY}")
suc = False
logging.info(f" Debug Mode start! , action {'on' if action else 'off'}")
if action:
usernames, passwords = get_user_credentials(action)
current_dayofweek = get_current_dayofweek(action)
for index, user in enumerate(users):
username, password, times, roomid, seatid, daysofweek = user.values()
if type(seatid) == str:
seatid = [seatid]
if action:
username ,password = usernames.split(',')[index], passwords.split(',')[index]
if(current_dayofweek not in daysofweek):
logging.info("Today not set to reserve")
continue
logging.info(f"----------- {username} -- {times} -- {seatid} try -----------")
s = reserve(sleep_time=SLEEPTIME, max_attempt=MAX_ATTEMPT, enable_slider=ENABLE_SLIDER)
s.get_login_status()
s.login(username, password)
s.requests.headers.update({'Host': 'office.chaoxing.com'})
suc = s.submit(times, roomid, seatid, action)
if suc:
return
def get_roomid(args1, args2):
username = input("请输入用户名:")
password = input("请输入密码:")
s = reserve(sleep_time=SLEEPTIME, max_attempt=MAX_ATTEMPT, enable_slider=ENABLE_SLIDER, reserve_next_day=RESERVE_NEXT_DAY)
s.get_login_status()
s.login(username=username, password=password)
s.requests.headers.update({'Host': 'office.chaoxing.com'})
encode = input("请输入deptldEnc:")
s.roomid(encode)
if __name__ == "__main__":
config_path = os.path.join(os.path.dirname(__file__), 'config.json')
parser = argparse.ArgumentParser(prog='Chao Xing seat auto reserve')
parser.add_argument('-u','--user', default=config_path, help='user config file')
parser.add_argument('-m','--method', default="reserve" ,choices=["reserve", "debug", "room"], help='for debug')
parser.add_argument('-a','--action', action="store_true",help='use --action to enable in github action')
args = parser.parse_args()
func_dict = {"reserve": main, "debug":debug, "room": get_roomid}
with open(args.user, "r+") as data:
usersdata = json.load(data)["reserve"]
func_dict[args.method](usersdata, args.action)
自动预约座位的 Python 脚本解析
此文档旨在详细介绍一个用于自动预约座位的 Python 脚本。该脚本的核心功能是登录用户,按照设定的时间预约座位,并提供了一些调试和错误处理的功能。
关键功能概述
脚本主要依赖于几个函数,能够根据用户输入和设定的预约时间自动进行座位预约。以下为关键配置项和函数。
SLEEPTIME = 0.2 # 每次抢座的间隔
ENDTIME = "07:01:00" # 根据学校的预约座位时间+1min即可
ENABLE_SLIDER = False # 是否有滑块验证
MAX_ATTEMPT = 5 # 最大尝试次数
RESERVE_NEXT_DAY = False # 预约明天而不是今天的
登录与预约函数
脚本中的 login_and_reserve
函数负责处理用户登录和座位预约的逻辑。函数会遍历每个用户,并根据设定的条件尝试预约。
def login_and_reserve(users, usernames, passwords, action, success_list=None):
logging.info(f"Global settings: \nSLEEPTIME: {SLEEPTIME}\nENDTIME: {ENDTIME}\nENABLE_SLIDER: {ENABLE_SLIDER}\nRESERVE_NEXT_DAY: {RESERVE_NEXT_DAY}")
if action and len(usernames.split(",")) != len(users):
raise Exception("user number should match the number of config")
主程序与调试模式
main
函数作为程序的入口点,负责控制预约的开始时间和迭代尝试。还有一个 debug
函数可用于调试,以便用户能够手动执行预约并查看相关信息。
def main(users, action=False):
...
while current_time < ENDTIME:
attempt_times += 1
success_list = login_and_reserve(users, usernames, passwords, action, success_list)
...
房间 ID 获取函数
为了能够正确预约,用户需要提供房间 ID。get_roomid
函数能够收集用户输入并返回相应的房间 ID。
def get_roomid(args1, args2):
username = input("请输入用户名:")
password = input("请输入密码:")
...
入口函数与配置
最后,脚本的入口点定义了命令行参数,并读取用户的配置信息。支持从文件中解析用户数据,为调用对应功能提供基础。
if __name__ == "__main__":
config_path = os.path.join(os.path.dirname(__file__), 'config.json')
...
总结
此 Python 脚本为用户提供了一个多功能的自动预约系统,通过合理的设置和使用,能够高效地管理预约座位的操作。虽然目前的实现中存在一些小的不足,但通过不断迭代和优化,有潜力成为一个更加强大的工具。
续
改为账号密码之后发现没有图书馆位置,去手机抓包发现发现登陆里面的接口和学校的不太一样
整改一下(其实是别人整改的,我也不会啊!hhh)
得到项目:
ok 自动预约图书馆了!nice
但是还是手动cookie登陆的方式
文档未来会整改的,但不是现在,祝大家考试顺利(期末周了)