python实现图书馆预约

前言

图书馆预约基本就分为2个步骤
1.登录----获取sessionid或者token(其实就是一个类似身份凭证的东西)
2.预约—调用预约接口
所以针对这两部分来进行用python的实现达到自动预约的目的

最终结果的日志


(11:35:50.634518):(哈佛大学):(2020204521): session过期了>>>>>>>>>>>>>>>>准备登陆
(11:35:50.634518):(哈佛大学):(2020204521): >>>>>>>>>>>>>>>操作系统:Windows
(11:36:03.408291):(哈佛大学):(2020204521): 登录成功>>>>>>>>>>>>>>>>>>>>>>>>获得token:y23ob25dta42vqbq
(11:36:04.487851):(哈佛大学):(1:1-1,2-0,3-0): loop: aim:11:37,now:11:36:04
(11:36:56.580618):(哈佛大学):(1:1-1,2-0,3-0): loop: aim:11:37,now:11:36:56
(11:37:01.584736):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472221584}
(11:37:01.671053):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:01 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:02.587573):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472222587}
(11:37:02.646453):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:02 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:03.589404):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472223589}
(11:37:03.652886):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:03 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:04.592958):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472224592}
(11:37:04.659778):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:04 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:05.594824):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472225594}
(11:37:05.653701):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:05 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:06.596145):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472226596}
(11:37:06.659975):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:06 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:12.598921):(哈佛大学):(1:1-1,2-0,3-0): loop: aim:11:37,now:11:37:12
(11:37:16.603760):(哈佛大学):(1:1-1,2-0,3-0): loop: aim:11:37,now:11:37:16
(11:38:11.654454):(哈佛大学):(2020204521): 尝试6次, 选座(Y206-099)成功.请求时间:11:37:06,响应时间:11:37:09

登录

手动登录

手动进行网页登录,登录后通过浏览器复制出sessionid或者token。下图中的ASP.NET_SessionId就是我们需要的。

image

脚本登录

使用python脚本进行登录,获取sessionid或者token。个人使用的话建议用手动登录就行。
代码逻辑:
1.通过python+selenium打开浏览器
2.然后模拟输入账号密码点击登录就行
3.在通过代码获取ASP.NET_SessionId
参考代码

def login(self, proxy_url=""):
    self.browser = SeleniumUtil.getBrowser(self, proxy_url)
    self.wait = WebDriverWait(self.browser, 20)  # 超时时长为10s
    getToken = False
    # 打开网页
    self.browser.get(self.cas_login + '?service=' + self.ic_url_index)
    # 等待 账号密码 出现
    username_input = self.wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '#username')))
    username_input.send_keys(self.username)
    password_input = self.wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '#password')))
    password_input.send_keys(self.password)
    time.sleep(0.5)
    login_button = self.wait.until(
        EC.presence_of_element_located((By.CSS_SELECTOR, '.btn-lg')))
    login_button.click()
    time.sleep(5)
    # 获取cookies
    cookies = self.browser.get_cookies()
    if len(cookies) > 0:
        for cookie in cookies:
            if cookie['name'] == 'ASP.NET_SessionId':
                self.ASP_NET_SessionId = cookie['value']
                SessionUtil.setSessionFileContent(self, self.ASP_NET_SessionId)
                self.myprint('>>>>>>>>>>>>>>>>>>>>>>>>获得token:' + self.ASP_NET_SessionId)
                getToken = True
    if not getToken:
        self.myprint('>>>>>>>>>>>>>>>>>>>>>>>>获得token失败')
        # todo 消息(邮件短信)提醒
    SeleniumUtil.browser_map.pop(client_key)
    self.browser.close()
    self.browser.quit()

##预约
观察浏览器的预约接口可以知道预约的地址:
主要的参数:dev_id,start,end,start_time,end_time

http://xxxxx.xxx:8080/ClientWeb/pro/ajax/reserve.aspx?dialogid=&dev_id=100456433&lab_id=&kind_id=&room_id=&type=dev&prop=&test_id=&term=&Vnumber=&classkind=&test_name=&start=2022-09-18+12%3A30&end=2022-09-18+99%3A00&start_time=1230&end_time=9900&up_file=&memo=&act=set_resv&_=1663469192955

image.png
#####dev_id是什么
dev_id是你要预约的座位id,获取方式点击座位找到元素key的值就是dev_id。看图
image.png

python预约接口实现:

    def appoint(self):
        dev_id = self.seatIdList[self.loopCount % len(self.seatIdList)]
        nowTime = datetime.datetime.now()
        appointmentData = (datetime.datetime.now() + datetime.timedelta(days=+1)).strftime("%Y-%m-%d")
        start_time = self.start_time
        end_time = self.end_time
        params = {
            'dialogid': '',
            'dev_id': dev_id,
            'lab_id': '',
            'kind_id': '',
            'room_id': '',
            'type': 'dev',
            'prop': '',
            'test_id': '',
            'term': '',
            'number': '',
            'classkind': '',
            'test_name': '',
            'start': '{} {}:{}'.format(appointmentData, start_time[0], start_time[1]),
            'end': '{} {}:{}'.format(appointmentData, end_time[0], end_time[1]),
            'start_time': start_time[0] + start_time[1],
            'up_file': '',
            'memo': '',
            'act': 'set_resv',
            '_': int(time.time() * 1000)
        }
        self.myprint('抢课请求 > {}'.format(params))
        requestTime = time.strftime("%X")
        res = self.sess.get(self.ic_url_appoint,
                            params=params, headers=self.getHeaders(self.ic_url_appoint), proxies=self.getProxys())
        dev_name = SeatMapUtil.transformationToSeatName(self.school, dev_id)
        self.myprint('选座({}),请求时间:{} ,抢课结果 > {}'.format(dev_name, requestTime, res.text))
        res_json = res.json()
        return res_json

##组合代码
一般预约前1-5分钟登录。到时间就调用预约接口、


(11:35:50.634518):(哈佛大学):(2020204521): session过期了>>>>>>>>>>>>>>>>准备登陆
(11:35:50.634518):(哈佛大学):(2020204521): >>>>>>>>>>>>>>>操作系统:Windows
(11:36:03.408291):(哈佛大学):(2020204521): 登录成功>>>>>>>>>>>>>>>>>>>>>>>>获得token:y23ob25dta42vqbq
(11:36:04.487851):(哈佛大学):(1:1-1,2-0,3-0): loop: aim:11:37,now:11:36:04
(11:36:56.580618):(哈佛大学):(1:1-1,2-0,3-0): loop: aim:11:37,now:11:36:56
(11:37:01.584736):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472221584}
(11:37:01.671053):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:01 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:02.587573):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472222587}
(11:37:02.646453):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:02 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:03.589404):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472223589}
(11:37:03.652886):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:03 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:04.592958):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472224592}
(11:37:04.659778):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:04 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:05.594824):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472225594}
(11:37:05.653701):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:05 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:06.596145):(哈佛大学):(2020204521): 抢课请求 > {'dialogid': '', 'dev_id': '100471111', 'lab_id': '', 'kind_id': '', 'room_id': '', 'type': 'dev', 'prop': '', 'test_id': '', 'term': '', 'number': '', 'classkind': '', 'test_name': '', 'start': '2022-09-19 13:30', 'end': '2022-09-19 14:00', 'start_time': '1330', 'up_file': '', 'memo': '', 'act': 'set_resv', '_': 1663472226596}
(11:37:06.659975):(哈佛大学):(2020204521): 选座(Y206-099),请求时间:11:37:06 ,抢课结果 > {"ret":0,"act":"set_resv","msg":"当前时间预约冲突","data":null,"ext":null}
(11:37:12.598921):(哈佛大学):(1:1-1,2-0,3-0): loop: aim:11:37,now:11:37:12
(11:37:16.603760):(哈佛大学):(1:1-1,2-0,3-0): loop: aim:11:37,now:11:37:16
(11:38:11.654454):(哈佛大学):(2020204521): 尝试6次, 选座(Y206-099)成功.请求时间:11:37:06,响应时间:11:37:09

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值