キャンパス自動ネットワーク Python スクリプト

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
ここに画像の説明を挿入
サービスを開きます。実行中であることが示されていれば問題ありません。
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_43471945/article/details/128335151