基于python解决锐捷掉线web端自动登录--华科

本文最后更新于:8 天前

前言


今天早上一来,又掉线了,确实最近掉线比较频繁,玩PT的应该都讨厌掉线,经常在宿舍看见做种一下子到0了,远程又连不上,更别说有时候外站HR,衰~~

所以想着搞一个自动任务,定时检查自己的网络是否顺畅,然后不顺畅自动登录就好了。

先说说自己的网络环境:windows系统,校园网,锐捷认证(有客户端,有网页端)。

想法1:发现掉网运行客户端进行鼠标模拟点击登录。

想法2:发现掉网运行浏览器使用selenium点击登录。

想法3:直接抓取请求参数使用requests库进行登录。

最最方便的应该就是想法3了,所以花了个把小时把代码撸出来了,在此记录送给需要的朋友~

思路


进行定时判断,win都有定时任务之类的,或者在程序外层套一个循环,几分钟运行一次,随电脑开机启动。这些问题不大~

如何判断掉网了:直接请求百度网页,如果出现错误我们就默认掉网了。

import requests

def get_response():
    try:
        requests.get("https://www.baidu.com")
        return True
    except Exception as exc:
        print(exc)
        return False

那么如何重新登录呢?网页版登录都会有一个网址,每次打开浏览器,如果没登录就会自动跳转:

1dbc9c89e43bf7370.png

如何抓取请求呢?F12大法。可以抓取到登录认证得请求数据:

20f6b30bf714b1933.png

从上边我们分析出了请求地址,也可以生成请求头部:

def relogin():
    url = "http://192.168.50.3:8080/eportal/InterFace.do?method=login"

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36",
        "Content-Type": "application/x-www-form-urlencoded",
        "charset": "UTF-8",
    }

然后我们需要获取提交的数据:因为content-type指定为application/x-www-form-urlencoded,我们直接使用下边图中点击查看来源后的数据作为数据提交:

3e7d001289ba36855.png

4de2e332ca7e320a1.png

所以完整的请求是:

def relogin():
    url = "http://192.168.50.3:8080/eportal/InterFace.do?method=login"

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36",
        "Content-Type": "application/x-www-form-urlencoded",
        "charset": "UTF-8",
    }

    data = "userId=xxxxxxxxxxx&password=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&service=&queryString=xxxxxxxxxxxxxxxxx&operatorPwd=&operatorUserId=&validcode=&passwordEncrypt=true"

    session = requests.session()
    req = session.post(url=url, headers=headers, data=data)
    return req.content.decode()

完整代码


import requests


def get_response():
    try:
        requests.get("https://www.baidu.com")
        return True
    except Exception as exc:
        print(exc)
        return False


def relogin():
    url = "http://192.168.50.3:8080/eportal/InterFace.do?method=login"

    headers = {
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36",
        "Content-Type": "application/x-www-form-urlencoded",
        "charset": "UTF-8",
    }

    data = "userId=xxxxxxxxxxx&password=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&service=&queryString=xxxxxxxxxxxxxxxxx&operatorPwd=&operatorUserId=&validcode=&passwordEncrypt=true"

    session = requests.session()
    req = session.post(url=url, headers=headers, data=data)
    req.encoding = 'utf-8'
    return req.content.decode()

if __name__ == '__main__':
    code = get_response()
    if not code:
        result = relogin()
        print(result)

断开网络运行代码:

# 这是因为网断了
HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)'),))

# 认证返回成功的信息 {"userIndex":"xxxxxxxxxxxxxxxxxxxx","result":"success","message":"","forwordurl":null,"keepaliveInterval":0,"validCodeUrl":""}

后记


~~如果有需要打包成为exe脱离python环境定时运行请联系我~~~

是的,为了方便华科大众,已经打包了,默认一分钟检查一次,后台运行。

需要配置info.yml文件如下:

info:
  userId: M202177777 # 学号
  password: 841f6fb705a833d43a6bf51244b62aca7d11d9572684ef0fa463e6 # 加密的密码,F12获取,很长,这里截断了
  queryString: wlanuseripxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # 加密的请求串,F12获取,很长,这里截断了

配置之后,开机运行即可~

运行途中如果出现掉网会记录log:

11/29/2021 19:16:40 PM - INFO - get_response - 2021-11-29 19:16:40
11/29/2021 19:16:40 PM - INFO - get_response - Error occurred HTTPSConnectionPool(host='www.baidu.com', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:777)'),))
11/29/2021 19:16:40 PM - INFO - get_response - Relogin {"userIndex":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxx","result":"success","message":"","forwordurl":null,"keepaliveInterval":0,"validCodeUrl":""}

下载地址:https://cloud.tomorrow505.xyz/index.php/s/DTFYgSgWmpnDibF



本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!