寫了一個預約東南大學體育場館的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)哦。嘻嘻。
本指令碼只作為學習練習的試手,不做任何其他目的。