0.引言
校園網是通過網頁進行連接的,但是由于主機不方便攜帶,想要遠程使用主機的時候非常的麻煩,因此想要通過腳本進行實時聯網,通過遠程軟件控制電腦。
實驗室不斷電,因此主機是可以不關機的,那只要保持一個程序每隔一段時間試試網絡是否已經連接,此外還需要讓電腦開機后此程序自動啟動。
但是每一個學校的校園網連接的邏輯不盡相同,網上很多的解決方案都是很簡單的,網絡結構不一樣。此處只是做一個示范。
1.腳本語言選擇
此腳本使用作為開發語言。
2.查看連接邏輯 2.1打開聯網網頁
我們在這個地方進行登錄,需要輸入我們的賬號,密碼,選擇服務公司,這些明顯都是需要傳到后臺的。
點擊F12,打開開發者工具,選擇記錄網絡日志并保留,然后開始聯網。
彈出了很多東西,細看的話,很多是.jpg.png.js等腳本,圖片等無關緊要的東西。很明顯,第一個,第二個是很重要的
點擊打開第一個,這是一個post請求,無法使用網頁進行訪問,并且帶了很多參數。
此外,下方的請求標頭對于模擬瀏覽器客戶端很重要,因此需要寫在中,每個人的都不一樣,需要自己改自己的。
header = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Connection": "keep-alive",
"Content-Length": "941",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_AUTO_LAND=; EPORTAL_COOKIE_DOMAIN=false; EPORTAL_COOKIE_SAVEPASSWORD=true; EPORTAL_COOKIE_USERNAME=322085404530; EPORTAL_COOKIE_PASSWORD=0e82e0b84c8ba2c18b5fe965ec253b6d448d0476abf3ce5f6efcde46acdac5d8cc8ee0d3f3569214a16e5910af7a584f75eecab10a84caa2ed79e66b151798a264ab9e3729cad2046dd348794280f6157d0b9420c044a38bcb18e94583918c3c68aa4ce3aa9019b9127fee6e28b41079f52b90d69f8a0f1ed2525bd9f286a400; EPORTAL_COOKIE_SERVER=%E5%AE%9C%E5%AE%BE%E7%A7%BB%E5%8A%A8; EPORTAL_COOKIE_SERVER_NAME=%E5%AE%9C%E5%AE%BE%E7%A7%BB%E5%8A%A8%E4%BA%92%E8%81%94%E7%BD%91; EPORTAL_USER_GROUP=%E5%AE%9C%E5%AE%BE%E7%A1%95%E5%A3%AB2022; JSESSIONID=B04D7AF5F98C58CC70067DC564A562C6",
"Host": "10.23.2.4",
"Origin": "http://10.23.2.4",

"Referer": "http://10.23.2.4/eportal/index.jsp?wlanuserip=50525b554b0c65a6304f42a91276d565&wlanacname=e8130dd9c88c8bf8f89b46fc0ae05c03&ssid=&nasip=e3da122140ddbef7db67d7cc0223f6b3&snmpagentip=&mac=1e44feae4f0a12f6b0e08c7651ae7e11&t=wireless-v2&url=2c0328164651e2b4f13b933ddf36628bea622dedcc302b30&apmac=&nasid=e8130dd9c88c8bf8f89b46fc0ae05c03&vid=9593a4d18664f1de&port=61e47cad1a7f4a94&nasportid=5b9da5b08a53a540cb3c232440f12fc3940e960c1d813d54ef234b42b50a3fc5",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46",
}
點擊負載,可以看到自己post請求攜帶的參數
可以看到,主要攜帶的參數有哪些,這里使用嘗試了一下,返回了用戶不可使用,說明系統后臺對客戶端進行了限制,因此,這里直接寫了一個訪問的代碼,這里的data都需要與上方對應
data = {
"userId": '', # 這行是你需要根據自己的情況修改的地方
"password": '', # 這行是你需要根據自己的情況修改的地方
"queryString": 'wlanuserip%3D50525b554b0c65a6304f42a91276d565%26wlanacname%3De8130dd9c88c8bf8f89b46fc0ae05c03%26ssid%3D%26nasip%3De3da122140ddbef7db67d7cc0223f6b3%26snmpagentip%3D%26mac%3D1e44feae4f0a12f6b0e08c7651ae7e11%26t%3Dwireless-v2%26url%3D2c0328164651e2b4f13b933ddf36628bea622dedcc302b30%26apmac%3D%26nasid%3De8130dd9c88c8bf8f89b46fc0ae05c03%26vid%3D9593a4d18664f1de%26port%3D61e47cad1a7f4a94%26nasportid%3D5b9da5b08a53a540cb3c232440f12fc3940e960c1d813d54ef234b42b50a3fc5',
"passwordEncrypt": 'true',
"operatorPwd": '',
"operatorUserId": '',
"validcode": '',
"service": '%E5%AE%9C%E5%AE%BE%E7%A7%BB%E5%8A%A8',
}
2.2 查看第二個請求
通過下圖,很明顯這是一個get請求,通過get請求便可以上網。
多次嘗試,這個url是不改變的,因此檢測網絡狀態代碼,便嘗試了直接訪問這個鏈接是否可以上網。
答案是否定的,不能夠上網,因此我猜測上網的邏輯是首先通過post請求查看此用戶是否已經連接互聯網,如果連接則顯示已連接,未連接則在后臺數據庫如redis存入一個可連接的狀態,直接運行get請求進行連接。
2.3 檢測用戶狀態
校園網不僅僅是在開機的時候才需要連接互聯網,有時候它會自動斷連,因此需要我們隨時檢測互聯網情況。
通過測試鏈接發現,當我們跳轉到登錄頁面時檢測網絡狀態代碼,如果我們已經登錄,則會在已登錄頁面,未登錄則在登錄頁面。
因此,這里我們通過檢測html頁面中來檢測是否已經登錄。
第一步F12打開開發者界面,點擊元素,在里面ctrl+F查詢,發現里面寫的是登陸成功,因此我們可以使用這個字符串來檢測用戶登陸狀態。
2.3 核心邏輯
分析出網絡的邏輯之后代碼就很簡單了。
第一步:
使用一個死循環,每間隔60s循環一次檢測此時用戶狀態。如果用戶已經連接
第二步:
3.全部代碼示例
# _*_ coding : utf-8 _*_
import re # 正則表達式,用于匹配字符
from urllib import request
import chardet as chardet
import requests # 用于向目標網站發送請求
import time
#url = 'http://10.23.2.4/eportal/index.jsp?wlanuserip=1d90ec446c6b52bb80a013e0ee83ccd2&wlanacname=eb3dea19c415ccae600bdc9db5d15bde&ssid=512b4fa22cd47690c1d677b390465049&nasip=390c1cf6eea7dfbca3f3f0aca4b4d442&mac=20617c667d26c7015c5889cba8afcce5&t=wireless-v2&url=4be2aa94e61657a37b1da9b0c8748ec5d02391b7ff0383fc' # 這行是你需要根據自己的情況修改的地方
# url = 'http://10.23.2.4/eportal/index.jsp?wlanuserip=50525b554b0c65a6304f42a91276d565&wlanacname=e8130dd9c88c8bf8f89b46fc0ae05c03&ssid=&nasip=e3da122140ddbef7db67d7cc0223f6b3&snmpagentip=&mac=1e44feae4f0a12f6b0e08c7651ae7e11&t=wireless-v2&url=2c0328164651e2b4f13b933ddf36628bea622dedcc302b30&apmac=&nasid=e8130dd9c88c8bf8f89b46fc0ae05c03&vid=9593a4d18664f1de&port=61e47cad1a7f4a94&nasportid=5b9da5b08a53a540cb3c232440f12fc3940e960c1d813d54ef234b42b50a3fc5'
url = 'http://10.23.2.4/eportal/success.jsp?userIndex=65336461313232313430646462656637646236376437636330323233663662335f3137322e32312e332e31345f333232303835343034353330&keepaliveInterval=0'
#url = 'http://10.23.2.4/eportal/index.jsp?wlanuserip=1d90ec446c6b52bb80a013e0ee83ccd2&wlanacname=eb3dea19c415ccae600bdc9db5d15bde&ssid=512b4fa22cd47690c1d677b390465049&nasip=390c1cf6eea7dfbca3f3f0aca4b4d442&mac=20617c667d26c7015c5889cba8afcce5&t=wireless-v2&url=4be2aa94e61657a37b1da9b0c8748ec5d02391b7ff0383fc'

while(True):
# response = requests.get(schoolWebURL)
s = requests.session()
response = request.urlopen(url)
html = response.read()
res = re.findall('(.*) ', html.decode(encoding="GBK", errors="strict"))
print('res:', res)
title = ''
if len(res) == 0:
pass
else:
title = res[0]
print("title:",title)
if title == '登錄成功': # 根據上面的分析填入相應的字符
print('登陸成功!')
else:
#先使用post
postUrl = 'http://10.23.2.4/eportal/InterFace.do?method=login'
data = {
"userId": '322085404530', # 這行是你需要根據自己的情況修改的地方
"password": '', # 這行是你需要根據自己的情況修改的地方
"queryString": 'wlanuserip%3D50525b554b0c65a6304f42a91276d565%26wlanacname%3De8130dd9c88c8bf8f89b46fc0ae05c03%26ssid%3D%26nasip%3De3da122140ddbef7db67d7cc0223f6b3%26snmpagentip%3D%26mac%3D1e44feae4f0a12f6b0e08c7651ae7e11%26t%3Dwireless-v2%26url%3D2c0328164651e2b4f13b933ddf36628bea622dedcc302b30%26apmac%3D%26nasid%3De8130dd9c88c8bf8f89b46fc0ae05c03%26vid%3D9593a4d18664f1de%26port%3D61e47cad1a7f4a94%26nasportid%3D5b9da5b08a53a540cb3c232440f12fc3940e960c1d813d54ef234b42b50a3fc5',
"passwordEncrypt": 'true',

"operatorPwd": '',
"operatorUserId": '',
"validcode": '',
"service": '%E5%AE%9C%E5%AE%BE%E7%A7%BB%E5%8A%A8',
}
header = {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate",
"Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6",
"Connection": "keep-alive",
"Content-Length": "941",
"Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
"Cookie": "EPORTAL_COOKIE_OPERATORPWD=; EPORTAL_AUTO_LAND=; EPORTAL_COOKIE_DOMAIN=false; EPORTAL_COOKIE_SAVEPASSWORD=true; EPORTAL_COOKIE_USERNAME=322085404530; EPORTAL_COOKIE_PASSWORD=0e82e0b84c8ba2c18b5fe965ec253b6d448d0476abf3ce5f6efcde46acdac5d8cc8ee0d3f3569214a16e5910af7a584f75eecab10a84caa2ed79e66b151798a264ab9e3729cad2046dd348794280f6157d0b9420c044a38bcb18e94583918c3c68aa4ce3aa9019b9127fee6e28b41079f52b90d69f8a0f1ed2525bd9f286a400; EPORTAL_COOKIE_SERVER=%E5%AE%9C%E5%AE%BE%E7%A7%BB%E5%8A%A8; EPORTAL_COOKIE_SERVER_NAME=%E5%AE%9C%E5%AE%BE%E7%A7%BB%E5%8A%A8%E4%BA%92%E8%81%94%E7%BD%91; EPORTAL_USER_GROUP=%E5%AE%9C%E5%AE%BE%E7%A1%95%E5%A3%AB2022; JSESSIONID=B04D7AF5F98C58CC70067DC564A562C6",
"Host": "10.23.2.4",
"Origin": "http://10.23.2.4",
"Referer": "http://10.23.2.4/eportal/index.jsp?wlanuserip=50525b554b0c65a6304f42a91276d565&wlanacname=e8130dd9c88c8bf8f89b46fc0ae05c03&ssid=&nasip=e3da122140ddbef7db67d7cc0223f6b3&snmpagentip=&mac=1e44feae4f0a12f6b0e08c7651ae7e11&t=wireless-v2&url=2c0328164651e2b4f13b933ddf36628bea622dedcc302b30&apmac=&nasid=e8130dd9c88c8bf8f89b46fc0ae05c03&vid=9593a4d18664f1de&port=61e47cad1a7f4a94&nasportid=5b9da5b08a53a540cb3c232440f12fc3940e960c1d813d54ef234b42b50a3fc5",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/108.0.0.0 Safari/537.36 Edg/108.0.1462.46",
}
response = requests.post(postUrl, data, headers=header)
print(response.encoding)
print(response.text)
uft_str = response.text.encode("iso-8859-1").decode('utf-8')
print(uft_str)

print("狀態碼{}".format(response)) # 打印狀態碼
# 使用GET方式登錄校園網
schoolWebLoginURL = 'http://10.23.2.4/eportal/success.jsp?userIndex=65336461313232313430646462656637646236376437636330323233663662335f3137322e32312e332e31345f333232303835343034353330&keepaliveInterval=0'
response = requests.get(schoolWebLoginURL).status_code # 直接利用 GET 方式請求這個 URL 同時獲取狀態碼
print("狀態碼{}".format(response)) # 打印狀態碼
# 每10s檢測一次是否成功連接
time.sleep(10)
4.打包成為exe文件及持久化操作
5.細節改進
細節的改進主要有下面幾點
5.1 隨機時間訪問
原來的代碼訪問服務器的時間是固定的(1min),但是這樣很容易被后臺識別為惡意爬蟲,因此,這里使用了一個時間防止賬號被封。
修改的代碼如下。
import random
# 每60-80秒一次
rand = random.uniform(0, 20)
time.sleep(60.0 + rand)
5.2 exe運行框隱藏