所需環境python(用於http.post,也可用其他工具代替)
1.自動pppoe撥號
新建bat文件連接pppoe.bat
,輸入以下內容:
RASDIAL 寬帶連接 username passwd
其中,寬帶連接
是pppoe的名稱,username
和passwd
是上網的賬號和密碼。
然後新建bat文件斷開pppoe.bat
,輸入以下內容:
rasdial 寬帶連接 /DISCONNECT
2.自動進行Web認證
首先使用chrome打開Web認證頁面,以本校爲例,打開網頁http://10.6.8.2:904
,按F12或右鍵-檢查,進入Network選項卡:
在Web認證頁中點擊登陸,就可以捕獲本機發出的http請求,我只抓到一個包,如果有多個需要自己篩選找到post賬號密碼的包。
分析抓到的包,主要關注General,Request Headers和Form Data。
一邊分析抓到的包,一邊構造python代碼,新建python文件auto-login.py:
import requests
import time
class INST(object):
def __init__(self, username, password):
pass
def _get_page(self):
pass
def _login(self, request):
pass
因爲抓包顯示用到了cookie,因此我們在_get_page()
方法中,利用session
保存會話,然後在_login()
方法中將登陸請求post給服務器。
- 構造
__init__():
def __init__(self, username, password):
self.username = username
self.password = password
self.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36'
request = self._get_page()
for i in range(5):
if request.status_code != 200:
time.sleep(2)
request = self._get_page()
if request.status_code == 200:
self._login(request)
將之前抓包看到的Request Headers - User Agent的內容賦值給self.UA
。
考慮到網絡可能出問題導致臨時打不開登陸頁,因此我在這裏設置如果獲取登陸頁失敗,等待2秒重新獲取,循環5次。如果覺得不需要可以去掉for
循環。
最後調用登陸函數self._login()
。
- 構造
_get_page():
def _get_page(self):
login_page = 'http://10.6.8.2:904/srun_portal_pc.php?ac_id=1&'
header = {
'Referer' : 'http://10.6.8.2:904/srun_portal_pc.php?ac_id=1&',
'User-Agent' : self.UA
}
self.session_requests = requests.Session()
r = self.session_requests.get(login_page, headers=header)
#soup = BeautifulSoup(r.content, 'html.parser')
#print(r.text)
return r
login_page
填登陸頁網址。
構造好報文頭header
後,初始化一個Session
,然後利用該Session
發get
報文:
r = self.session_requests.get(login_page, headers=header)
這樣我們就保存了cookie,登陸時可以自動提交。
- 構造
_login():
def _login(self, request):
login_url = 'http://10.6.8.2:904/include/auth_action.php'
header = {
'Connection' : 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': '10.6.8.2:904',
'Origin': 'http://10.6.8.2:904',
'Referer': 'http://10.6.8.2:904/srun_portal_pc.php?ac_id=1',
'User-Agent': self.UA,
'X-Requested-With': 'XMLHttpRequest'
}
post_data = {
'action' : 'login',
'username': self.username,
'password': self.password,
'ac_id' : 1,
'save_me' : 1,
'ajax' : 1
}
#login
r = self.session_requests.post(login_url, data=post_data, headers=header)
_login()
方法主要任務是構造報文頭以及form
表單,注意要按照之前抓到的Request Headers 和 Form Data的內容構造,提交的網址應當是General - Request URL中的網址(與獲取登錄頁_get_page()
中的網址不同)。
報文頭和form表單中有一些項目不是必須的,可以自己嘗試,我提交以上數據即可登陸(由於cookie每次都會改變,而我們在session
中已將cookie保存,因此cookie項不用管)。
這樣就完成了自動Web認證的Python代碼,完整代碼如下:
#-*- coding:utf-8 -*-
import requests
import time
class INST(object):
def __init__(self, username, password):
self.username = username
self.password = password
self.UA = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.167 Safari/537.36'
request = self._get_page()
for i in range(5):
if request.status_code != 200:
time.sleep(2)
request = self._get_page()
if request.status_code == 200:
self._login(request)
def _get_page(self):
login_page = 'http://10.6.8.2:904/srun_portal_pc.php?ac_id=1&'
header = {
'Referer' : 'http://10.6.8.2:904/srun_portal_pc.php?ac_id=1&',
'User-Agent' : self.UA
}
self.session_requests = requests.Session()
r = self.session_requests.get(login_page, headers=header)
#soup = BeautifulSoup(r.content, 'html.parser')
#print(r.text)
return r
def _login(self, request):
login_url = 'http://10.6.8.2:904/include/auth_action.php'
header = {
'Connection' : 'keep-alive',
'Content-Type': 'application/x-www-form-urlencoded',
'Host': '10.6.8.2:904',
'Origin': 'http://10.6.8.2:904',
'Referer': 'http://10.6.8.2:904/srun_portal_pc.php?ac_id=1',
'User-Agent': self.UA,
'X-Requested-With': 'XMLHttpRequest'
}
post_data = {
'action' : 'login',
'username': self.username,
'password': self.password,
'ac_id' : 1,
'save_me' : 1,
'ajax' : 1
}
#login
r = self.session_requests.post(login_url, data=post_data, headers=header)
def main():
un = 'username'
pw = 'passwd'
INST(un,pw)
if __name__ == '__main__':
main()
運行python文件,測試是否能夠進行網頁認證,由於是通過發送http報文認證的,因此瀏覽器看不到響應,可以在認證後隨便打開一個網頁,能上去就ok。
新建bat文件網頁認證.bat
,輸入以下代碼:
python ./auto-login.py
3.關閉彈出網頁
我們的校園網,只要一連接pppoe就會彈出認證頁面,我沒有想到很好的辦法來自動關閉該頁面,只能採取比較麻煩的方式,如果哪位朋友有更好的方法,歡迎交流!
我這裏採用將默認瀏覽器設置爲不常用的,以Edge爲例。在完成認證後查找是否有Edge進程,若有則kill
掉。因爲我通常不用Edge,因此殺掉該進程通常沒有其他影響。
新建bat文件殺Edge進程.bat
,輸入以下代碼:
@echo off
tasklist|find /i "MicrosoftEdge.exe"
if %errorlevel%==0 goto kill
else goto end
:kill
taskkill /im MicrosoftEdge.exe /f
:end
將上面的2個MicrosoftEdge.exe
替換爲默認瀏覽器的進程名即可。
4.串聯所有文件
爲了能夠全自動登陸,需要將以上文件連接起來。將以上文件全部放在同一目錄下,並新建文件連接校園網.vbs
,輸入以下代碼:
On Error Resume Next
set ws=WScript.CreateObject("WScript.Shell")
Set ObjH=CreateObject("MSXML2.XMLHTTP")
Dim Count:Count = 5 '定義一個變量
Do Until Count = 0 '直到Count變量爲0時,否則一直循環
ws.Run "C:\批處理文件\自動連接校園網\連接pppoe.bat",0
wscript.sleep 1000*3
'測試能否訪問登陸頁面
ObjH.Open "GET","http://10.6.8.2:904/srun_portal_pc.php?ac_id=1&",False
ObjH.Send()
If ObjH.StatusText="OK" Then
'能夠訪問登陸頁
ws.Run "C:\批處理文件\自動連接校園網\網頁認證.bat",0
'退出循環
Exit Do
Else
'錯誤
ws.Run "C:\批處理文件\自動連接校園網\斷開pppoe.bat",0
wscript.sleep 1000*3
End If
Count = Count -1
Loop
ws.Run "C:\批處理文件\自動連接校園網\殺Edge進程.bat",0
將ObjH.Open "GET","http://10.6.8.2:904/srun_portal_pc.php?ac_id=1&",False
中的網址替換爲Web認證頁網址。這裏每一步我都設置了延遲,可以根據自己的需要修改。
在測試過程中,曾出現pppoe連接成功,但認證頁無法獲取的情況,發現斷開pppoe後重新連接就正常了,因此我這裏設置如果獲取不到認證頁,則斷開pppoe然後重複連接,循環5次。
注意如果要加入計劃任務,則所有路徑必須要用絕對路徑,如果不需要則用./
即可。
雙擊該vbs文件即可,這樣就實現了一鍵後臺運行,且沒有小黑框出現!
5.讓cortana認識連接校園網.vbs
& 開機啓動 & 創建計劃任務
- Cortana
在C:\Users\%username%\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
中創建連接校園網.vbs
的快捷方式(將文件加入開始菜單),即可讓cortana認識該文件。 - 開機啓動
在C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp
中創建快捷方式即可 - 計劃任務
如果需要設置更復雜的觸發條件,需要創建計劃任務,創建方式不再贅述,注意vbs中文件路徑需要使用絕對路徑,否則會報錯。