美文网首页
华中科技大学校园网自动重连

华中科技大学校园网自动重连

作者: 蟹蟹宁 | 来源:发表于2021-12-09 13:24 被阅读0次

前言

寝室安装了一个路由器, 但是不知道什么原因, 每天都会断开连接, 需要手动认证一下才可以, 为了避免不必要的麻烦, 写了这样一个小的python脚本来自动的重连

本文设计的操作有一定的上手难度, 不太适合对计算机完全不懂的同学使用, 如有需求, 可私聊

源码地址: https://github.com/Kingdo777/auto-connect-school-network.git, 或者见文末附录

源码解析

主函数非常的简单:

if __name__ == '__main__':
    while True:
        if pong():
            time.sleep(5)
        else:
            login()
            time.sleep(10)

每个5秒检查自己还能不能上网, 方式就是ping 8.8.8.8, 这是很常见的方法.

如果不能上网, 那么就调用login()函数来自动重连

我们的校园网认证的过程,本质上就是提交一个HTTP请求, 那我们的login()函数, 其实就是实现了这个过程, 因此我们只需要知道,我们的网页端认证是怎么操作的即可,麻烦的是华科的校园网的代码设计的还是很复杂的,所以还是稍微的耗费了一点时间.

校园网认证流程

首先我们进入这个认证的页面, 按F12进入开发者模式

我们会在Source中看到两个重要的JS文件,当我们点击网页中的连接 Login的时候就会调用这个函数.

这个函数会收集你的一系列信息,并最终调用:AuthInterFace.login

AuthInterFace定义在 AuthInterFace.js中.

其中init()用于生成请求的url, login()首先将传入的参数合并成content,最后通过post方法发送请求

因此需要我们做的就是, 获取content的内容, 然后我们就可以用python对指定的url发起post请求

获取content的方法也很简单, 只需要在如图位置打上断点, 然后点击网页中连接的按钮,当js执行到断点后,就可以复制content的值

使用

  1. git clone https://github.com/Kingdo777/auto-connect-school-network.git
  1. 我们将上一过程获取到的content信息存放到main.py的同目录下的名为content的文件中
  1. 然后就可以执行python脚本了
  1. 不过windows下需要安装npcap, 可以点击以下链接下载安装

    https://nmap.org/npcap/dist/npcap-1.60.exe

后记

  1. 如果切换了Wifi, 导致IP地址改变, 那么需要重新获取content的值.

附录

import time
import json

from scapy.layers.inet import IP, ICMP
from scapy.packet import Raw
from scapy.sendrecv import sr1

import requests


def login():
    url = 'http://192.168.50.3:8080/eportal/InterFace.do?method=login'
    with open("content", "r") as f:
        data = f.read()
    header = {
        "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8"
    }
    response = requests.post(url, data, headers=header)
    content = json.loads(response.text)
    encoding = response.encoding
    if content['result'] == 'fail':
        print(content['message'].encode(encoding).decode('utf-8'))
    else:
        print("login at --> " + time.asctime(time.localtime(time.time())))
    return


def pong():
    ping_pkt = IP(dst="8.8.8.8") / ICMP() / b'welcome!'
    ping_result = sr1(ping_pkt, timeout=2, verbose=False)
    try:
        if ping_result.getlayer(ICMP).fields['type'] == 0 \
                and ping_result.getlayer(Raw).fields['load'] == b'welcome!':
            return True
        else:
            return False
    except Exception:
        return False


if __name__ == '__main__':
    while True:
        if pong():
            time.sleep(5)
        else:
            login()
            time.sleep(10)

相关文章

网友评论

      本文标题:华中科技大学校园网自动重连

      本文链接:https://www.haomeiwen.com/subject/dtjffrtx.html