前言
图书馆预约基本就分为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