1. 程式人生 > >寫了一個預約東南大學體育場館的python指令碼,目前剛剛實現功能,後續會繼續完善

寫了一個預約東南大學體育場館的python指令碼,目前剛剛實現功能,後續會繼續完善

看到git上有人寫了一個自動預約的指令碼,正好前段時間在學python爬蟲和指令碼,索性也寫了一個,大佬直接略過。

目前沒有做圖形化,賬號和預約資訊也是手動輸入的,我也只寫了羽毛球和乒乓球,其實就是一個屬性的值。嫌麻煩的同學可以寫一個文字檔案,儲存這些資訊,然後倒入到腳本里,每次稍作修改就可以了。如果基友固定的話,也可以寫死在腳本里。

本篇部落格只說下博主寫指令碼的時候遇到的問題和心路歷程,只是想要程式碼的可以直接忽略下文,程式碼已經上傳github:https://github.com/CooperXxx/seuScript。

本指令碼需要urllib、PIL、pytesseract等模組,沒有的同學先安裝一下。

 

第一步:登陸個人資訊門戶 

首先是登陸個人門戶,一般是從和這個介面登陸,https://newids.seu.edu.cn/authserver/login?goto=http://my.seu.edu.cn/index.portal,但是發現這個登陸介面的表單密碼是加密處理的,還有一些屬性不知道是什麼,也猜測不出來。

所以博主找到了另一個預約場館的登陸介面:http://ids1.seu.edu.cn/amserver/UI/Login,這個表單就非常簡單了,每個key也都可以猜測到是什麼意思。

使用urllib構建POST請求,並模擬瀏覽器登陸:

//構建POST請求中的提交資訊和URL

url='http://ids1.seu.edu.cn/amserver/UI/Login'

userid = input("輸入學號:")
password = input("輸入密碼:")

postdata1 = urllib.parse.urlencode({
'IDToken1':userid, 
'IDToken2':password,
'IDButton':'Submit',
'goto':'http://yuyue.seu.edu.cn/eduplus/order/initOrderIndex.do?sclId=1',
'gx_charset':'utf-8'
}).encode('utf-8')

//構建Request,模擬瀏覽器請求,登陸

req = urllib.request.Request(url,postdata1)

req.add_header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36")

cjar = http.cookiejar.CookieJar()
opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cjar))
urllib.request.install_opener(opener)

data = opener.open(req).read()

注意:登陸需要驗證證書,不然會出錯,所以之前加上:

ssl._create_default_https_context = ssl._create_unverified_context

且ssl需要引用。

 

第二步:識別驗證碼和構建預約表單

使用google瀏覽器的開發者工具尋找表單頁面: 

這裡發現了可以直接開啟的預約表單頁面:

http://yuyue.seu.edu.cn/eduplus/order/order/initEditOrder.do?sclId=1&dayInfo=2018-11-23&itemId=7&time=12:00-13:00

和驗證碼的URL:

http://yuyue.seu.edu.cn/eduplus/control/validateimage

 

驗證碼獲取和識別:

urllib.request.urlretrieve('http://yuyue.seu.edu.cn:80/eduplus/control/validateimage', 'validateimage.jpg') 
img = Image.open('validateimage.jpg')
s = pytesseract.image_to_string(img)

使用urllib獲取到了驗證碼圖片,再用pytesseract識別。因為驗證碼實在是太簡單了,所以直接就能識別。(不知道pytesseract是什麼的童鞋,自行百度)

才發現自己吧驗證碼down到本地了,不過懶得改了,嘻嘻。下次再說。

 

還是用開發者工具尋找處理表單請求的URL:

judgeUseUser.do:這個請求是用來判斷表單資訊是否合法的,其實在腳本里可以跳過。

insertOrder.do:這才是真正的處理表單資訊的請求,URL:http://yuyue.seu.edu.cn/eduplus/order/order/order/insertOredr.do?sclId=1

表單裡面的屬性,大家自己去看吧,注意其中有個邀請人ID和學號是不一樣的,比如我的室友的ID是120542,但是這個屬性又是必須有的,所以你要自己用谷歌開發者工具或者抓包軟體自己去找一下。

 

下面構建表單請求並且執行:

reservetime = input("輸入想要預約的時間(格式:2018-11-25 09:00-10:00):")

item = input("輸入數字7或者9(7代表乒乓球,10代表羽毛球):")
inuserid = input("輸入被邀請人ID(不是學號,需要自己去查,例如120542代表謝龍龍):")
phone = input("輸入手機號:")

postdata2 = urllib.parse.urlencode({
'orderVO.useTime':reservetime,
'orderVO.itemId':item,
'orderVO.useMode':'2',
'useUserIds':inuserid,
'orderVO.phone':phone,
'validateCode':s,
}).encode('utf-8')

url2="http://yuyue.seu.edu.cn/eduplus/order/order/order/insertOredr.do?sclId=1"
req2 = urllib.request.Request(url2,postdata2)
req2.add_header("User-Agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36")
data = opener.open(req2).read()

print(data)

 

 

最後如果打印出沒有空餘場地就是沒場地了,

print出success就是成功預約啦,拿來玩的童鞋記得去系統裡取消預約哦,

print其他東西就是出錯了哦。

 

最後的最後,有問題的可以給博主留言,

有問題的妹子,可以加博主的微信(xwd2363)哦。嘻嘻。

 

 

本指令碼只作為學習練習的試手,不做任何其他目的。