图书馆座位自动预约
使用方法
- python3 环境下
- python test.py -u 登录用户名 -p 密码 -r 自习室号 -s 座位号
- 座位号请填写三位数,不足三位前面用0补充
- 自习室号码只有1和2
- 把脚本放在vps上然后用crontab设置自动运行即可
函数说明
- def login() 模拟登录,获取cookie
- seat_get() 座位申请
- send_mail() 发送邮件(未补充)
程序运行流程
- 模拟登录,获取cookie
- 获取座位的唯一标志码parameters
- 提交座位申请
主程序
# -*- coding:utf-8 -*-
import requests
import argparse
import time
from bs4 import BeautifulSoup
def login(session, user, passwd): # 自行处理了重定向
_login_url = "http://202.112.150.5/Default.aspx"
login_url = "http://202.112.150.5/Florms/FormSYS.aspx"
head = {
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.8",
"Cache-Control": "max-age=0",
"Connection": "keep-alive",
"Content-Length": "320",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "202.112.150.5",
"Origin": "http://202.112.150.5",
"Referer": "http://202.112.150.5/Default.aspx",
"Upgrade-Insecure-Requests": "1",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36",
}
data = {
"__VIEWSTATE": "/wEPDwUKMTc2NzMyNTQ1NGQYAQUeX19Db250cm9sc1JlcXVpc"
"mVQb3N0QmFja0tleV9fFgEFBWNtZE9LAU63sGdcRZousyc0v0TDACjoQc9H7B8FrclixY+IihI=",
"__EVENTVALIDATION": "/wEWBAL+7ZzRCwKl1bKzCQK1qbSRCwLgiqiFDt27SO1Swv+TcdphG8+Hdd86C/KqdRGdDLyzxY/3rowI",
"txtUserName": user,
"txtPassword": passwd,
"cmdOK.x": "37",
"cmdOK.y": "11",
}
_session = session.post(_login_url, data, headers=head).text
return session
def seat_get(session, room, _seat):
if room == 1:
room = "101001"
seat = room + str(_seat)
else:
room = "101002"
seat = room + str(_seat)
print(seat)
# time = "636085440000000000"
get_url = "http://202.112.150.5/FunctionPages/SeatBespeak/SeatLayoutHandle.ashx"
head = {
"Accept": "text/html, */*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.8",
"Connection": "keep-alive",
"Content-Length": "45",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "202.112.150.5",
"Origin": "http://202.112.150.5",
# "Referer": "http://202.112.150.5/FunctionPages/SeatBespeak/BespeakSeatLayout.aspx?roomId=101001&date=636085440000000000",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
mouth = time.strftime('%m')
if int(time.strftime('%d')) < 10:
day = '0' + str(int(time.strftime('%d'))+1)
else:
day = str(int(time.strftime('%d'))+1)
data = {
"roomNum": room,
"date": "2016/" + mouth + "/" + day + " 0:00:00",
}
soup = BeautifulSoup(session.post(get_url, data=data, headers=head).content.decode(), 'html.parser')
try:
parameters = soup.find(attrs={'id': seat}).get('onclick')[18:-2]
if parameters == None:
raise ValueError('invalid value')
except ValueError as e:
print("你的位子已经有人预约了")
except Exception as e:
print("请求错误,请联系作者")
return
_get_url = "http://202.112.150.5/FunctionPages/SeatBespeak/BespeakSubmitWindow.aspx?parameters=" + parameters
head1 = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.8",
"Connection": "keep-alive",
"Content-Length": "3660",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Host": "202.112.150.5",
"Origin": "http://202.112.150.5",
"Referer": _get_url,
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 "
"(KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36",
"X-Requested-With": "XMLHttpRequest",
}
data1 = {
"__EVENTTARGET": "ContentPanel1$btnBespeak",
"__EVENTARGUMENT": "",
"__VIEWSTATE": "/wEPDwULLTExNDEyODQ3MDVkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYHBQVGb3JtMgUURm9yb"
"TIkY3RsMDMkcmJsTW9kZWwFIUZvcm0yJGN0bDA0JERyb3BEb3duTGlzdF9GcmVlVGltZQUdRm9ybTIkY3RsMDUkRH"
"JvcERvd25MaXN0X1RpbWUFDUNvbnRlbnRQYW5lbDEFGENvbnRlbnRQYW5lbDEkYnRuQmVzcGVhawUWQ29udGVudFBh"
"bmVsMSRidG5DbG9zZdsYGf+DorexaTBUgJvhcO5hgSPt8LAEl2Zy6TsLpau8",
"__EVENTVALIDATION": "/wEWAgLW1Lf9BgL+mI+WBkpvcE4C4rUAG0WtWF76DhiF5RRKR9MffDMa26CfuGpP",
"roomOpenTime": "7:00",
"Form2$ctl03$rblModel": "0",
"Form2$ctl04$DropDownList_FreeTime": "7:10",
"Form2$ctl05$DropDownList_Time": "10:00",
"X_CHANGED": "false",
"X_TARGET": "ContentPanel1_btnBespeak",
"Form2_Collapsed": "false",
"ContentPanel1_Collapsed": "false",
"X_STATE": "eyJGb3JtMl9jdGwwMF9sYmxSb29tTmFtZSI6eyJUZXh0Ijoi56ys5LiA6Ieq5Lmg5a6kIn0sIkZvcm0yX2N0bDAxX2xibFNlYXRObyI6eyJUZXh0IjoiMjA3In0sIkZvcm0yX2N0bDAyX2xibGJlZ2luRGF0ZSI6eyJUZXh0IjoiMjAxNi85LzQifSwiRm9ybTJfY3RsMDNfcmJsTW9kZWwiOnsiSGlkZGVuIjp0cnVlfSwiRm9ybTJfY3RsMDRfRHJvcERvd25MaXN0X0ZyZWVUaW1lIjp7IkhpZGRlbiI6dHJ1ZSwiWF9JdGVtcyI6W1siNzoxMCIsIjc6MTAiLDFdLFsiNzoyMCIsIjc6MjAiLDFdLFsiNzozMCIsIjc6MzAiLDFdLFsiNzo0MCIsIjc6NDAiLDFdLFsiNzo1MCIsIjc6NTAiLDFdLFsiODowMCIsIjg6MDAiLDFdLFsiODoxMCIsIjg6MTAiLDFdLFsiODoyMCIsIjg6MjAiLDFdLFsiODozMCIsIjg6MzAiLDFdLFsiODo0MCIsIjg6NDAiLDFdLFsiODo1MCIsIjg6NTAiLDFdLFsiOTowMCIsIjk6MDAiLDFdLFsiOToxMCIsIjk6MTAiLDFdLFsiOToyMCIsIjk6MjAiLDFdLFsiOTozMCIsIjk6MzAiLDFdLFsiOTo0MCIsIjk6NDAiLDFdLFsiOTo1MCIsIjk6NTAiLDFdLFsiMTA6MDAiLCIxMDowMCIsMV0sWyIxMDoxMCIsIjEwOjEwIiwxXSxbIjEwOjIwIiwiMTA6MjAiLDFdLFsiMTA6MzAiLCIxMDozMCIsMV0sWyIxMDo0MCIsIjEwOjQwIiwxXSxbIjEwOjUwIiwiMTA6NTAiLDFdLFsiMTE6MDAiLCIxMTowMCIsMV0sWyIxMToxMCIsIjExOjEwIiwxXSxbIjExOjIwIiwiMTE6MjAiLDFdLFsiMTE6MzAiLCIxMTozMCIsMV0sWyIxMTo0MCIsIjExOjQwIiwxXSxbIjExOjUwIiwiMTE6NTAiLDFdLFsiMTI6MDAiLCIxMjowMCIsMV0sWyIxMjoxMCIsIjEyOjEwIiwxXSxbIjEyOjIwIiwiMTI6MjAiLDFdLFsiMTI6MzAiLCIxMjozMCIsMV0sWyIxMjo0MCIsIjEyOjQwIiwxXSxbIjEyOjUwIiwiMTI6NTAiLDFdLFsiMTM6MDAiLCIxMzowMCIsMV0sWyIxMzoxMCIsIjEzOjEwIiwxXSxbIjEzOjIwIiwiMTM6MjAiLDFdLFsiMTM6MzAiLCIxMzozMCIsMV0sWyIxMzo0MCIsIjEzOjQwIiwxXSxbIjEzOjUwIiwiMTM6NTAiLDFdLFsiMTQ6MDAiLCIxNDowMCIsMV0sWyIxNDoxMCIsIjE0OjEwIiwxXSxbIjE0OjIwIiwiMTQ6MjAiLDFdLFsiMTQ6MzAiLCIxNDozMCIsMV0sWyIxNDo0MCIsIjE0OjQwIiwxXSxbIjE0OjUwIiwiMTQ6NTAiLDFdLFsiMTU6MDAiLCIxNTowMCIsMV0sWyIxNToxMCIsIjE1OjEwIiwxXSxbIjE1OjIwIiwiMTU6MjAiLDFdLFsiMTU6MzAiLCIxNTozMCIsMV0sWyIxNTo0MCIsIjE1OjQwIiwxXSxbIjE1OjUwIiwiMTU6NTAiLDFdLFsiMTY6MDAiLCIxNjowMCIsMV0sWyIxNjoxMCIsIjE2OjEwIiwxXSxbIjE2OjIwIiwiMTY6MjAiLDFdLFsiMTY6MzAiLCIxNjozMCIsMV0sWyIxNjo0MCIsIjE2OjQwIiwxXSxbIjE2OjUwIiwiMTY6NTAiLDFdLFsiMTc6MDAiLCIxNzowMCIsMV0sWyIxNzoxMCIsIjE3OjEwIiwxXSxbIjE3OjIwIiwiMTc6MjAiLDFdLFsiMTc6MzAiLCIxNzozMCIsMV0sWyIxNzo0MCIsIjE3OjQwIiwxXSxbIjE3OjUwIiwiMTc6NTAiLDFdLFsiMTg6MDAiLCIxODowMCIsMV0sWyIxODoxMCIsIjE4OjEwIiwxXSxbIjE4OjIwIiwiMTg6MjAiLDFdLFsiMTg6MzAiLCIxODozMCIsMV0sWyIxODo0MCIsIjE4OjQwIiwxXSxbIjE4OjUwIiwiMTg6NTAiLDFdLFsiMTk6MDAiLCIxOTowMCIsMV0sWyIxOToxMCIsIjE5OjEwIiwxXSxbIjE5OjIwIiwiMTk6MjAiLDFdLFsiMTk6MzAiLCIxOTozMCIsMV0sWyIxOTo0MCIsIjE5OjQwIiwxXSxbIjE5OjUwIiwiMTk6NTAiLDFdLFsiMjA6MDAiLCIyMDowMCIsMV0sWyIyMDoxMCIsIjIwOjEwIiwxXSxbIjIwOjIwIiwiMjA6MjAiLDFdLFsiMjA6MzAiLCIyMDozMCIsMV0sWyIyMDo0MCIsIjIwOjQwIiwxXSxbIjIwOjUwIiwiMjA6NTAiLDFdLFsiMjE6MDAiLCIyMTowMCIsMV0sWyIyMToxMCIsIjIxOjEwIiwxXSxbIjIxOjIwIiwiMjE6MjAiLDFdLFsiMjE6MzAiLCIyMTozMCIsMV0sWyIyMTo0MCIsIjIxOjQwIiwxXSxbIjIxOjUwIiwiMjE6NTAiLDFdXSwiU2VsZWN0ZWRWYWx1ZSI6Ijc6MTAifSwiRm9ybTJfY3RsMDVfRHJvcERvd25MaXN0X1RpbWUiOnsiSGlkZGVuIjp0cnVlLCJYX0l0ZW1zIjpbWyIxMDowMCIsIjEwOjAwIiwxXSxbIjEyOjAwIiwiMTI6MDAiLDFdXSwiU2VsZWN0ZWRWYWx1ZSI6IjEwOjAwIn0sIkZvcm0yX2N0bDA2X2xibEVuZERhdGUiOnsiVGV4dCI6IjY6NTnoh7M4OjQwIn19",
"X_AJAX": "true",
}
_session = session.post(_get_url, data=data1, headers=head1).content.decode()
print(_session)
def send_mail():
pass
if __name__ == "__main__":
'''
四个参数:登录用户名、密码、自习室号码、座位号、提醒邮箱
座位号请填写三位数,不足三位前面用0补充
自习室号码只有1和2
'''
parse = argparse.ArgumentParser()
parse.add_argument("-u", "--user", help="the user")
parse.add_argument("-p", "--pwd", help="the passwd")
parse.add_argument("-r", "--room", type=int, help="the room")
parse.add_argument("-s", "--seat", type=int, help="the seat")
# parse.add_argument("-m", "--mail", help="the mail")
# 解析命令行
results = parse.parse_args()
user = results.user
passwd = results.pwd
room = results.room
seat = results.seat
session = requests.Session()
_session = login(session, user, passwd)
seat_get(_session, room, seat)