python实现图书馆抢座(自动预约)

脚本功能

系统开放座位时快速预约指定位置

可以设置预约的时间段

运行以后会一直帮你抢,需要手动停止

即使遇到更强的脚本自动帮抢下一个座位

实现

首先解决登录问题,通过F12找出登录请求包,分析对比一下包可以发现一般只有用户名和密码这个参数是变化的,然后用requests.session()的实例化去请求登录接口,登录成功。

然后预约座位抓一下包,分析包找到变化的关键的参数,一般情况下关键参数只有座位id、开始时间、结束时间,其他的参数一股脑照搬就行了,接下来用刚刚登录成功的那个requests.session()实例去请求即可。

优化

既然是每天都帮抢那么一直去请求可不行,一是给服务器造成负担,二是如果有什么反爬策略容易被发现被封。所以每天到12点(系统预约开放时间)的时候发预约包就行。

万一脚本撞车了没抢到自己设定的座位怎么办,返回预约的结果,发现已经有人了自动预约下一个座位,也可以将自己心仪的座位写在列表里,这个抢不到抢下一个。

代码

(为了不给学校系统添加负担,代码仅供参考,无法直接运行)

import requests
from datetime import date
from datetime import timedelta
import json
import getopt
import sys
import time


global headers
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0',
    'Host': '',

}

#登录函数
def login(id, pwd):

    l_params = {
        'id': id,
        'pwd': pwd,
        'act': 'login',
    }
    #自己分析得到的接口,下同
    login_url = ''
    s = requests.session()
    re = s.post(url=login_url, headers=headers, params=l_params)
    #返回登录成功的实例
    return s




#预约函数
def yd(s, start, end, s_id):
    y_params = {
        "dialogid": "",
        #预定座位
        "dev_id": s_id,
        "room_id":"",
        "type":"dev",
        "prop":"",
        "number":"",
        "classkind":"",
        "test_name":"",
        "start": start,
        "end": end,
        "start_time": "800",
        "end_time": "2200",
    }
    y_url = ''
    re = s.get(url=y_url, headers=headers, params=y_params)
    print(re.text)
    res = json.loads(re.text)
    msg = res['msg']
    if msg == '操作成功!':
        print('success')
        return 1
    elif msg == '2020-09-11只能提前[1]天预约':
        return 0
    else:
        print('fail')
        return 2

#脚本输入提示信息
def useage():
    print(
	'''
	Usage:
	    -i    学号(必填)
	    -p    密码
	    -s    座位id
	    -b    开始时间,格式13:00,下同
	    -e    结束时间
	''')

if __name__ == '__main__':
    id = pwd = None
    #不填默认抢这个这个时间段的这个座位
    s_id = '100458282'
    begin = '8:00'
    end = '22:00'

    #处理输入
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'i:p:s:b:e:')
        for name, value in opts:
            if name == '-i':
                id = value
            if name == '-p':
                pwd = value
            if name == '-s':
                s_id = value
            if name == '-b':
                begin = value
            if name == '-e':
                end = value
    except getopt.GetoptError:
        useage()
    if not id:
        useage()
        sys.exit(3)
    if not pwd:
        pwd = id

    #先获取后天时间
    aftertomorrow = date.isoformat(date.today() + timedelta(days=2))
    while True:
        hour = int(time.strftime('%H',time.localtime(time.time())))
        m = int(time.strftime('%M', time.localtime(time.time())))
        #如果现在的明天等与之前的后天,即到了12点,开始抢座
        if date.isoformat(date.today() + timedelta(days=1)) == aftertomorrow:

            s = login(id, pwd)

            start = aftertomorrow + ' ' + begin
            endtime = aftertomorrow + ' ' + end
            result = yd(s, start, endtime, s_id)

            if result == 1:
                #预约成功
                aftertomorrow = date.isoformat(date.today() + timedelta(days=2))
                sleep_time = (23 - hour) * 3600 + (59 - m) * 60 + 35
                print('程序休眠{}s'.format(sleep_time))
                print(aftertomorrow)
                time.sleep(sleep_time)

            elif result == 2:
                #被预约,抢下一个id的座位
                s_id = str(int(s_id) - 1)
                continue
            else:
                continue
        else:
            sleep_time = (23 - hour) * 3600 + (59 - m) * 60
            time.sleep(sleep_time)






结语

不知道你们的学校图书馆预约系统是什么样的,但是一般学校也不会花太多钱去搞这个,所以系统比较垃圾,大部分可以按照这个思路来。而且有些学校跟我们学校用的几乎相同的系统,肯定是出自同一个公司或者同一个模板的。如果你们学校也是类似的系统,代码改一下就能用。

看完之后想自己动手但是又不知道怎么抓包分析?看看这篇

针对刚学习爬虫的小白,看完就懂

我学校的系统主页大概长这样

  • 41
    点赞
  • 278
    收藏
    觉得还不错? 一键收藏
  • 83
    评论
评论 83
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值