圖書館座位自動預約


圖書館座位自動預約

使用方法

  • 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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM