某大学体育场馆自动抢场技术分析
Table of Contents

背景 Link to 背景

由于某学校的体育场馆系统服务器过于垃圾,导致并发请求后服务器经常宕机,为了提高预约效率,本文分析了如何实现一个自动化的体育场馆预约系统。


登录逻辑分析 Link to 登录逻辑分析

登录是整个系统的核心环节,主要包括以下步骤:

1. 获取登录页面信息 Link to 1. 获取登录页面信息

通过发送 GET 请求获取登录页面的 HTML 内容,提取以下关键数据:

  • 加密密钥:用于加密用户密码。
  • 表单参数:如 ltexecution,这些参数是登录表单提交时必需的。

2. 密码加密 Link to 2. 密码加密

使用从页面提取的加密密钥,通过 AES 加密算法对用户密码进行加密。加密过程包括:

  • 填充数据:将密码与固定的附加字符串拼接。
  • 加密:使用 CBC 模式对拼接后的数据进行加密。
  • Base64 编码:将加密后的数据转换为字符串格式。

3. 验证码处理 Link to 3. 验证码处理

登录页面使用滑块验证码进行验证,具体处理流程如下:

  1. 获取验证码图片:通过接口获取滑块和背景图片,并保存到本地。
  2. 识别滑块位置:使用 OpenCV 进行图像处理,计算滑块需要移动的距离。
  3. 提交验证:将滑块移动距离提交给服务器,获取验证通过的 sign

4. 提交登录表单 Link to 4. 提交登录表单

将加密后的密码、验证码 sign 和其他表单参数提交到登录接口,获取登录凭证(如 CASTGCiPlanetDirectoryPro)。


获取场地逻辑 Link to 获取场地逻辑

获取场地信息是预约系统的重要环节,主要用于提取可预约的场地和时间段。

实现流程 Link to 实现流程

  1. 发送请求

    • 向场馆系统的接口发送请求,获取场地的 HTML 页面或 JSON 数据。
  2. 解析场地信息

    • 使用正则表达式或 HTML 解析库(如 BeautifulSoup)提取场地编号、名称和状态。
  3. 提取可用时间段

    • 解析返回的数据,筛选出可预约的时间段。
  4. 保存场地信息

    • 将场地信息保存为 JSON 文件,便于后续使用。

伪代码 Link to 伪代码

以下是获取场地逻辑的伪代码:

PLAINTEXT
1
2
3
4
5
6
7
function get_available_areas():
    send_request_to_area_endpoint()
    parse_response_for_area_data()
    for each area in area_data:
        if area.is_available():
            extract_available_times(area)
    save_to_json_file(area_data)

特别分析:自动抢场地方法 Link to 特别分析:自动抢场地方法

自动抢场地是系统中自动抢场的核心方法,负责协调登录、认证和预约的整个流程。

方法功能 Link to 方法功能

  1. 登录

    • 调用登录逻辑,获取会话凭证。
    • 如果登录失败,自动重试。
  2. CAS 认证

    • 调用 fuck_cas 方法,向服务器验证会话的有效性。
  3. 自动抢场

    • 在认证通过后,调用预约方法完成场馆的预约。

方法逻辑 Link to 方法逻辑

以下是自动抢场地方法的伪代码逻辑:

PLAINTEXT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function doit(gym):
    while True:
        initialize_session()
        try:
            login_to_system()
        except LoginError:
            log_error("登录失败,重试中...")
            continue

        try:
            if cas_authentication_successful():
                make_reservation()
                if multi_reservation_enabled():
                    make_second_reservation()
                break
            else:
                log_error("CAS 认证失败,重试中...")
                continue
        except Exception as e:
            log_error(f"认证异常: {e}")
            continue

下订单方法分析 Link to 下订单方法分析

下订单是系统中最关键的功能之一,整合了 checkorder 两个步骤,确保场地可用并完成支付。

实现流程 Link to 实现流程

  1. 检查场地可用性

    • 向服务器发送请求,检查指定场地和时间段是否可用。
    • 如果场地不可用,记录日志并返回失败状态。
  2. 获取订单号

    • 如果场地可用,调用接口获取订单号(order_id)。
  3. 提交支付请求

    • 使用订单号构造支付请求,并向服务器提交支付表单。
  4. 记录支付结果

    • 根据服务器返回的响应,记录支付成功或失败的状态。

方法逻辑 Link to 方法逻辑

以下是下订单方法的伪代码:

PLAINTEXT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
FUNCTION place_order(area_id, date_id)
    BEGIN
        // 阶段1:检查场地可用性
        SET check_url TO "http://gym.xxxxxx.cn/index.php/index/item/check.html"
        CREATE check_data WITH {
            "item_id": "3",
            "area_id": area_id,
            "date_time": CALL get_date(),
            "data_id": date_id
        }
        SEND POST REQUEST TO check_url WITH check_data → check_response
        
        IF check_response.status ≠ "available" THEN
            LOG "场地不可用"
            RETURN "场地不可用"
        END IF

        // 阶段2:获取订单号
        CALL get_order_id(area_id, date_id) → order_id
        IF order_id IS NULL THEN
            LOG "获取订单号失败"
            RETURN "获取订单号失败"
        END IF

        // 阶段3:提交支付请求
        SET payment_url TO "http://gym.xxxxxx.cn/index.php/index/pay/index.html"
        CREATE payment_data WITH {
            "order_id": order_id,
            "item_id": "3",
            "area_id": area_id,
            "date_time": CALL get_date(),
            "data_id": date_id
        }
        SEND POST REQUEST TO payment_url WITH payment_data → payment_response
        
        IF payment_response.code = 200 THEN
            LOG "支付成功"
            RETURN "支付成功"
        ELSE
            LOG "支付失败:" + payment_response.error
            RETURN "支付失败"
        END IF
    END

优化下订单流程 Link to 优化下订单流程

1. 提高检查效率 Link to 1. 提高检查效率

  • 批量检查:对于多个场地和时间段,可以一次性发送批量请求,减少网络延迟。
  • 缓存结果:将检查结果缓存到本地,避免重复请求。

2. 提高支付成功率 Link to 2. 提高支付成功率

  • 自动重试:在支付失败时,自动重试一定次数。
  • 并发支付:对于多个订单,可以使用多线程或异步请求并行处理。

3. 自动化支付 Link to 3. 自动化支付

  • 获取支付url:自动跳转到微信支付实现支付流程。

总结 Link to 总结

本文详细分析了下订单方法的实现逻辑,并通过伪代码展示了核心流程。通过整合 checkorder 方法,可以显著提高系统的效率和成功率。同时,通过优化检查和支付流程,可以进一步提升用户体验和系统稳定性。

通过该系统,用户可以轻松完成体育场馆的预约,为日常锻炼提供便利。

感谢阅读!

某大学体育场馆自动抢场技术分析

Wed Mar 26 2025 Featured
1901 字 · 10 分钟