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)

得到项目:image

ok 自动预约图书馆了!nice

但是还是手动cookie登陆的方式

文档未来会整改的,但不是现在,祝大家考试顺利(期末周了)

最后修改:2025 年 01 月 03 日
如果觉得我的文章挺有趣,赞赏一杯小奶茶
END
本文作者:
文章标题:AHNU图书馆自动预约
本文地址:https://www.maxtral.fun/index.php/archives/198/
版权说明:若无注明,本文皆MAXBROSER原创,转载请保留文章出处。