校園網自動pppoe撥號+Web認證

所需環境python(用於http.post,也可用其他工具代替)

1.自動pppoe撥號

新建bat文件連接pppoe.bat,輸入以下內容:

RASDIAL 寬帶連接 username passwd

其中,寬帶連接是pppoe的名稱,usernamepasswd是上網的賬號和密碼。
然後新建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,然後利用該Sessionget報文:

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中文件路徑需要使用絕對路徑,否則會報錯。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章