0 まえがき
学内ネットワークはWebページ経由で接続しますが、ホストは持ち運びが不便なので、リモートでホストを使用したい場合に非常に面倒なので、スクリプトを介してリアルタイムにネットワークに接続し、コンピュータを制御したいリモートソフトウェア。
研究室の電源は常にオンになっているため、ホスト マシンの電源をオフにすることはできません。そのため、ネットワークに接続されているかどうかを時々テストするプログラムを用意し、コンピュータの電源をオンにした後にプログラムが自動的に起動するようにする必要があります。 。
ただし、各学校のキャンパス ネットワーク接続のロジックは異なり、インターネット上の多くのソリューションは非常にシンプルであり、ネットワーク構造も異なります。ここでは単なるデモンストレーションを示します。
1. スクリプト言語の選択
このスクリプトは開発言語として Python を使用します。
2. 接続ロジックを確認する
2.1 Webページを開く
ここにログインするときは、アカウント番号、パスワードを入力し、サービス会社を選択する必要がありますが、これらは明らかにバックグラウンドに送信する必要があります。
F12 をクリックして開発者ツールを開き、ネットワーク ログの記録と保存を選択して、ネットワークを開始します。
よく見ると、その多くは .jpg.png.js やその他のスクリプト、画像、その他の重要ではないものです。もちろん、1番目と2番目が重要です
クリックして最初のリクエストを開きます。これは投稿リクエストであり、Web ページを使用してアクセスすることはできず、多くのパラメーターがあります。
さらに、以下のリクエスト ヘッダーは、Python がブラウザ クライアントをシミュレートするために非常に重要であるため、Python で記述する必要があります。ヘッダーは人それぞれ異なるため、自分のヘッダーを変更する必要があります。
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",
}
ロードをクリックすると、ポストリクエストによって運ばれるパラメータが表示されます。
運ばれる主なパラメータが何であるかがわかります。ここでは、postman で試してみましたが、ユーザーが使用できないというメッセージが返され、システムのバックグラウンドが原因であることがわかります。クライアントを制限しているため、ここではアクセス コードを直接書き込みます。ここのデータは上記に対応する必要があります。
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 2 番目のリクエストを表示する
以下の図から、これが get リクエストであることは明らかであり、get リクエストを通じてインターネットにアクセスできます。
何度試しても URL は変わらないので、このリンクに直接アクセスしてオンラインにできるかどうかを確認してみました。
答えは「いいえ」です。インターネットにアクセスできません。したがって、インターネットにアクセスするロジックは、まずユーザーがポストリクエストを通じてインターネットに接続しているかどうかを確認し、接続されている場合は接続済みとして表示され、接続されていない場合は接続済みとして表示されることだと思います。接続すると、接続可能な状態が redis などのバックグラウンド データベースに保存され、直接 get リクエストを実行して接続します。
2.3 ユーザーステータスの検出
学内のネットワークは、電源を入れたときにインターネットに接続するだけでなく、自動的に切断されてしまう場合もあるため、インターネットの状況を随時確認する必要があります。
テスト リンクを通じて、ログイン ページにジャンプすると、すでにログインしている場合はログイン ページが表示され、ログインしていない場合はログイン ページが表示されることがわかりました。
したがって、ここでは HTML ページ内の <title> を検出することで、ログインしたかどうかを検出します。
最初のステップは、F12 を押して開発者インターフェイスを開き、要素をクリックし、ctrl+F を押して <title> をクエリすると、ログインが成功したと表示されることを確認するため、この文字列を使用してユーザーのログイン ステータスを検出できます。
2.3 コアロジック
ネットワークのロジックを分析すると、コードは非常に単純になります。
ステップ 1:
無限ループを使用して、60 秒ごとにその時点のユーザーのステータスを確認します。ユーザーがすでに接続している場合
ステップ 2:
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('<title>(.*)</title>', 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 ファイルへのパッケージ化と永続的な操作
pyinstallerをインストールする
pip install pyinstaller
5. 細部の改善
改善内容は主に以下の点です。
5.1 ランダムタイムアクセス
元のコードがサーバーにアクセスする時間は固定(1分)ですが、これはバックグラウンドで悪意のあるクローラであると認識されやすいため、ここではアカウントのブロックを防ぐために時間を設定しています。
変更したコードは次のとおりです。
import random
# 每60-80秒一次
rand = random.uniform(0, 20)
time.sleep(60.0 + rand)
5.2 exe 実行ボックスはバックグラウンド実行を非表示にします
cmd
binpath:exe パスを管理者として開始します
sc create 自动联网脚本 binpath= D:\workSpace\AutoInternet\AutoInternet\dist\自动联网脚本.exe type= own start= auto displayname= 自动联网脚本
サービスが正常に挿入されたかどうかを確認します:
win+r open
サービスを開きます。実行中であることが示されていれば問題ありません。