赞
踩
图书馆预约基本就分为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就是我们需要的。
使用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
#####dev_id是什么
dev_id是你要预约的座位id,获取方式点击座位找到元素key的值就是dev_id。看图
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。