python 도서관 연구실 자동 예약 기능 실현
간단 한 소개
현재 많은 학교 들 이 학생 들 에 게 매우 좋 은 학습 환경 을 제공 하 는데 보통 자습 교실 의 시설 설비 에 나타난다.이에 대해 한 마디 하지 않 을 수 없 는 것 은 바로 우리 학교의 도서관 이다.새 도서관 이 건설 되면 서 관내 에 도 여러 개의 기능 구역 이 설치 되 었 다.각 층 은 A,B,C,D 네 개의 구역 으로 나 뉘 어 남북 복도 로 연결 되 고 중간 은 회전 계단 으로 1 층 에서 5 층 으로 관통 된다.A 구역 은 자습 구역 이다.B 구 와 C 구 는 장 열 을 하나 로 합 친 사회과학 과 자연과 학 서고 이다.D 구역 은 전문 기능 구역 으로 영상 실,디지털 미디어 창작 자 체험 센터,스마트 교육 교실,클 라 우 드 데스크 톱 전자 열람실 등 을 포함한다.B.C 구역 동서 연 랑 에는 크기 가 12 개의 연구실 이 설치 되 어 있다.남북 연 랑 에는 레저 독서 구역 이 설치 되 어 있다.
위 에 있 는 부분 은 도서관 홈 페이지 에서 베 낀 것 이지 만 정말 학교의 도서관 에 칭찬 을 해 야 한다.이 글 의 본론 으로 돌아 가 학 교 는 많은 교사 와 학생 들 에 게 편안 하고 우수한 설비 가 완 비 된 연구실 을 무료 로 제공 했다.하지만 이들 연구실 은 온라인 예약 을 해 야 들 어 갈 수 있 고,매일 00:00 에 다음 날 예약 이 열 리 기 때문에 한 시간 대(3 시간)정도 의 연구실 로 가 려 면 그야말로'등불 켜 기 야전'이다.물론 이 과정 에서 손 속도 가 빠 르 면 큰 장점 이 있 을 것 이다.저녁 에 일찍 쉬 고 손 이 빠 르 지 않 으 면 연구실 에 예약 할 생각 은 하지 마 세 요.마침 최근 에 python 파충 류 를 조금 배 웠 는데 파충류 로 이 어 려 운 임 무 를 완수 해 주 려 고 합 니 다.하하하하!(ps:악성 접근 방지,모든 링크 를 놓 지 않 습 니 다)
python 실현 사고
생각 하 는 것 은 매우 간단 하 다.단지 계 정 에 로그 인하 고 방 을 찾 으 며 예약 을 제출 하 는 것 이다.그럼 한번 해 보 자.
로그 인 계 정
먼저 저희 연구실 에서 예약 한 로그 인 화면 을 엽 니 다.링크 는 U2FsdGVkX19NdfJkghN54Msvy1zl7AucRur/ct0nz4orPI7uLkSDsvuFMgr0fGCO 입 니 다.
rn9Z/f8h3bds9w==
좋 습 니 다.이 첫 번 째 로그 인 계 정 은 초보 자 라 는 것 을 시험 해 보 았 습 니 다.하지만 겁 먹 으 면 안 됩 니 다.다른 사내 들 이 사용 하 는 방법 을 참고 하면 fireforx 의 firebug(ctrl+shift+e)를 열 어 네트워크 상황 을 보고 이 상황 에서 정상 적 인 로그 인 을 하 는 것 입 니 다.
여기에 post 가 있 는 것 을 볼 수 있 습 니 다.그 때 는 python 에서 requests.post 방법 을 사용 할 수 있 습 니 다.
성공 적 인 로그 인 을 위해 서 는 파충류 의 신분 을 숨 겨 야 합 니 다.메시지 헤더 에서 우리 의 요청 머리 를 볼 수 있 습 니 다.인 자 를 모두 복사 하면 자신의 headers={...}를 구성 하여 서버 를 속 일 수 있 습 니 다.
매개 변수 이 페이지 를 보 세 요.이곳 의 폼 데 이 터 는 세 개 밖 에 없 는데 각각 인증 코드,계 정과 비밀번호 에 대응 합 니 다.이 매개 변 수 를 복사 하면 우리 의 data={...}을 구성 할 수 있 습 니 다.그 중에서 우리 가 주의해 야 할 것 은 바로 이 인증 코드 이다.인공 적 으로'자체'로 식별 할 수 있 든 기계 가 자동 으로 식별 할 수 있 든 모두 인증 코드 를 로 컬 파일 로 저장 해 야 한다.이렇게 되면 서버 에 한 번 방문 할 때마다 인증 코드 가 바 뀌 는 문제 가 생 겼 다.이제 생각 을 잘 살 펴 보 겠 습 니 다.먼저 인증 코드 를 받 아 로 컬 에 저장 해 야 합 니 다.서버 에 한 번 방문 해 야 합 니 다.마지막 으로 저 희 는 인 자 를 제출 하여 로그 인 해 야 합 니 다.이것 은 다시 서버 에 방 문 했 습 니 다.이번 인증 코드 는 저희 가 얻 은 인증 코드 와 같은 인증 코드 가 아 닙 니 다.방금 시 작 된 시도 에서 나 는 서버 에 로그 인 할 수 없 었 다.바로 두 번 의 인증 코드 가 일치 하지 않 았 다.어떻게 처음 얻 은 인증 코드 와 제출 할 때의 인증 코드 가 일치 합 니까?
여기에 같은 쿠키 가 필요 합 니 다.위의 몇 개의 그림 에서 우 리 는 모두 쿠키 값 을 볼 수 있 습 니 다.동기 화 를 확보 하려 면 인증 코드 를 가 져 올 때의 쿠키 값 과 계 정 비밀 번 호 를 제출 할 때의 쿠키 값 이 일치 해 야 합 니 다.따라서 제 프로그램 에서 제 가 먼저 한 단계 에서 쿠키 값 을 가 져 온 다음 에 이 쿠키 값 을 headers 의 매개 변수 로 합 니 다.로그 인 의 사 고 는 바로 이 렇 습 니 다.한 마디 보충 하 겠 습 니 다.여기 의 인증 코드 는 제 가 수 동 으로 식별 한>n<입 니 다.
방 찾기
이 절 차 는 사실 쓸모없는 절차 입 니 다.왜 이런 절차 가 있 습 니까?인위적인 예약 습관 에 따라 우 리 는 어떤 절 차 를 밟 을 수 있 습 니까?그러나 파충 류 를 사용 하면 로그 인 에 성공 하면 바로 예약 양식 을 제출 할 수 있 습 니 다.물론 자동 예약 프로그램 을 더욱 스마트 하 게 하려 면 이 절 차 를 추가 할 수 있 습 니 다.그 방 들 은 예약 도 할 수 있 고 여기 서 사용자 정의 로 규칙 을 보충 할 수 있 습 니 다.그냥 넘 어 갈 게 요...
예약 제출
로그 인 과 마찬가지 로 우리 도 수 동 으로 한 번 제출 하여 네트워크 상황 을 보면 python 으로 이 과정 을 모 의 할 수 있 습 니 다.여기 서 는 스티커 로 설명 하지 않 겠 습 니 다.여기 서 제출 하 는 것 도 requests.post 의 방법 입 니 다.그러나 주의해 야 할 것 은 이 곳 의 headers 와 로그 인 할 때의 headers 는 다 르 기 때문에 다른 유사 한 예약 프로그램 에서 서로 다른 내용 의 post 의 headers 가 일치 하 는 지 주의 할 수 있 음 을 알려 드 립 니 다.나 여기 잠깐 갇 혔 어.
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
#
# @Version : 1.0
# @Time : 2018/4/10
# @Author :
# @File : reservation_4.py
import requests
import re
import json
import datetime
import time
def get_cookies():
""" cookies"""
url = 'http://**************'
s = requests.session()
s.get(url)
ck_dict = requests.utils.dict_from_cookiejar(s.cookies) # jar dict
ck = 'JSESSIONID=' + ck_dict['JSESSIONID'] # cookies
""" """
path = './code.png'
get_cookies_headers = {
'user-anget': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0',
'Cookie': ck}
get_cookies_url = 'http://**************'
code_image = requests.get(get_cookies_url, headers=get_cookies_headers)
with open(path, 'wb') as fn:
fn.write(code_image.content)
fn.close()
print(' ')
return ck
def login(cookies, hour, minute):
login_headers = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-Length': '45',
'Content-Type': 'application/x-www-form-urlencoded',
'Cookie': cookies,
'Host': '**************',
'Pragma': 'no-cache',
'Referer': 'http://**************',
'Upgrade-Insecure-Requests': '1',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'
}
login_url = 'http://**************'
login_data = {
'codeImage': input(' :'),
'uname': '**************',
'upass': '**************'
}
requests.post(login_url, data=login_data, headers=login_headers)
res = requests.get('http://**************', headers=login_headers)
reg_h = r'<option value=(.*?)>\d{4}-\d{2}-\d{2}' # hash
value_h = re.findall(reg_h, res.text)
""" """
counter = 0
while (True):
now = datetime.datetime.now() #
if now.hour == hour and now.minute == minute:
break
time.sleep(0.5)
# print(now)
counter = counter + 1
if counter == 240:
res = requests.get('http://**************', headers=login_headers)
reg_h = r'<option value=(.*?)>\d{4}-\d{2}-\d{2}' # hash
reg_t = r'(\d{4}-\d{2}-\d{2})' #
value_h = re.findall(reg_h, res.text)
value_t = re.findall(reg_t, res.text)
with open('./con_log.txt', 'a') as fjs:
fjs.write(eval(value_h[-1])+' '+value_t[-1]+' '+str(now)+'
')
fjs.close()
print(' ')
counter = 0
return str(eval(value_h[-1]))
def reservation(day_hash, cookies, stime, etime):
reservation_data = {
'_etime': etime, # 11 , 11*60=660
'_roomid': '1285b3ca77594b3095c7b89d4922553c', # Id
'_seatno': '',
'_stime': stime, # 8 , 8*60=480
'_subject': ' ', #
'_summary': ' ', #
'ruleId': day_hash,
'usercount': 3, #
'users': '**************', #
'UUID': '**************'
}
reservation_headers = {
'Accept': 'application/json, text/javascript, */*; q=0.01',
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
'Cache-Control': 'no-cache',
'Connection': 'keep-alive',
'Content-Length': '239',
'Content-Type': 'application/json',
'Cookie': cookies,
'Host': '**************',
'Pragma': 'no-cache',
'Referer': 'http://**************',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0'
}
reservation_js = json.dumps(reservation_data)
reservation_url = 'http://**************'
status = requests.post(reservation_url, data=reservation_js, headers=reservation_headers)
# print(stime, etime)
# print(status)
print(status.text)
def main():
""" :11:20-20.40"""
full_stime = ['1060', '870', '680']
full_etime = ['1240', '1050', '860']
""" :10:00-13:00;13:50-16:50;17:40-20:40"""
stime = ['1060', '830', '600']
etime = ['1240', '1010', '780']
cookies = get_cookies()
day_hash = login(cookies, 0, 0) #
for i in range(0, 3):
reservation(day_hash, cookies, stime[i], etime[i])
if __name__ == '__main__':
main()
실현 효과python 을 배 운 이후로 엄 마 는 더 이상 내 가 연구실 을 빼 앗 지 못 할 까 봐 걱정 하지 않 아 도 된다.프로그램 에 정 해진 절 차 를 몇 줄 추가 하면 00 시 에 자동 으로 연구실 을 예약 해 줄 수 있 습 니 다.테스트 를 통 해 예약 할 때 어느 정도 방 을 예약 할 수 있 는 것 으로 나 타 났 다.예 를 들 어 4-12 일 에 세 시간 대 를 약속 하 는 데 7 초 걸 렸 지만 4-13 일 에 21 초 를 썼 고 한 시간 대 를 다른 친구 들 에 게 약속 을 받 았 다.물론 이 절 차 는 좀 더 개선 하여 완승'손 속도'를 실현 해 야 한다.
마지막 에 보충 하 다
아직 부족 합 니 다.교 류 를 환영 합 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.