校园自动联网python脚本

0.引言

校园网是通过网页进行连接的,但是由于主机不方便携带,想要远程使用主机的时候非常的麻烦,因此想要通过脚本进行实时联网,通过远程软件控制电脑。
实验室不断电,因此主机是可以不关机的,那只要保持一个程序每隔一段时间试试网络是否已经连接,此外还需要让电脑开机后此程序自动启动。
但是每一个学校的校园网连接的逻辑不尽相同,网上很多的解决方案都是很简单的,网络结构不一样。此处只是做一个示范。

1.脚本语言选择

此脚本使用python作为开发语言。

2.查看连接逻辑

2.1打开联网网页

在这里插入图片描述
我们在这个地方进行登录,需要输入我们的账号,密码,选择服务公司,这些明显都是需要传到后台的。
点击F12,打开开发者工具,选择记录网络日志并保留,然后开始联网。
在这里插入图片描述
弹出了很多东西,细看的话,很多是.jpg.png.js等脚本,图片等无关紧要的东西。很明显,第一个,第二个是很重要的

在这里插入图片描述
点击打开第一个,这是一个post请求,无法使用网页进行访问,并且带了很多参数。

在这里插入图片描述
此外,下方的请求标头对于python模拟浏览器客户端很重要,因此需要写在python中,每个人的header都不一样,需要自己改自己的。

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请求携带的参数
在这里插入图片描述
可以看到,主要携带的参数有哪些,这里使用postman尝试了一下,返回了用户不可使用,说明系统后台对客户端进行了限制,因此,这里直接写了一个访问的代码,这里的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页面中<title>来检测是否已经登录。
第一步F12打开开发者界面,点击元素,在里面ctrl+F查询<title>,发现里面写的是登陆成功,因此我们可以使用这个字符串来检测用户登陆状态。
在这里插入图片描述

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('<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

扫描二维码关注公众号,回复: 15451644 查看本文章
pip install pyinstaller

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5.细节改进

细节的改进主要有下面几点

5.1 随机时间访问

原来的代码访问服务器的时间是固定的(1min),但是这样很容易被后台识别为恶意爬虫,因此,这里使用了一个时间防止账号被封。
修改的代码如下。

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打开
在这里插入图片描述
打开服务,显示正在运行就ok了
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43471945/article/details/128335151