IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 浙江大学软件学院网络自动认证+Padavan路由器挂python脚本 -> 正文阅读

[Python知识库]浙江大学软件学院网络自动认证+Padavan路由器挂python脚本

起因

浙软的网络认证系统实在是与众不同,好像是自己开发的?
认证界面

反正就特别不方便,每次连上之后会有一个小窗口,影响观感。
在这里插入图片描述
有轻微强迫症的咱怎么能忍这个呢?于是决定自己写一个认证的程序,并挂到路由器上,由于路由器装的是linux,没有GUI,也就看不到这个窗口了。

自动认证

这部分过程其实很简单,很多文章都有介绍方法,比如浙大软院 免登录上网攻略

受到了浙大python网_Python爬虫学习(8):浙大软院网络登陆保持一文的启发,发现没必要一定用自己的账号登录,并在这篇文章的基础上进行了改写:

import urllib
import urllib.request as urllib2
import re
import os
import time

class PseudoLogin:
    def __init__(self):  
        self.login_url  = "http://192.0.0.6/cgi-bin/do_login"
        self.status_url = "http://192.0.0.6/cgi-bin/keeplive"
        self.logout_url = "http://192.0.0.6/cgi-bin/do_logout"
        self.headers = {}
        self.headers["User-Agent"] = "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36"
        self.headers["Content-Type"] = "text/html; charset=gb2312"

        # 需要更改起始和结束帐号
        self.start = 22151001
        self.end = 22151300
        self.check_time = 5

        #当前登陆的帐号
        self.current = self.start #登陆成功后返回的数字字符串
        self.uid = ""

    #循环测试帐号,直到有一个帐号可以通过初始密码登陆
    def cycle_login(self):
        #初始密码
        password = '3fdebd70bc927d97' # 'zjucst'的md5加密
        
        #匹配全是数字的字符串
        pattern = re.compile(r"^[\d]+$")#当已经访问到最后的时候,且最后一个帐号没有登陆成功的时候,又重头来一次
        if(self.current >= self.end):
            print("将重头再来一次..")
            self.current = self.start
        for username in range(self.current, self.end + 1):
            self.current = username
            ret = self.access(str(username), password)
            if re.match(pattern, ret):
                self.uid = ret
                print("已经成功登陆...,可以上网了")
                print("当前网号为:" + str(username))
                print("uid为:" +  ret)
                return True
        return False

    def access(self,username,password):
        data = {'username': username, 'password': password, 'drop': 0, 'type': 1, 'n': 100}
        data = urllib.parse.urlencode(data).encode(encoding='UTF8')
        # print(data.decode('UTF8'))
        req = urllib2.Request(self.login_url, data=data, headers=self.headers)
        res = urllib2.urlopen(req)
        content = res.read().decode('UTF8')
        print("the login result: " + content)
        return content #获取登陆上网后的状态

    def get_status(self):
        data = {'uid': self.uid}
        data = urllib.parse.urlencode(data).encode(encoding='UTF8')
        req = urllib2.Request(self.status_url, data=data, headers=self.headers)
        res = urllib2.urlopen(req)
        content = res.read().decode('UTF8')
        print("the keep-alive result: " + content)
        return content #登出

    def logout(self):
        data = {'uid': self.uid}
        data = urllib.parse.urlencode(data).encode(encoding='UTF8')
        req = urllib2.Request(self.logout_url, data=data, headers=self.headers)
        res = urllib2.urlopen(req)
        content = res.read().decode('UTF8')
        print("the logout result: " + content)
        return content #登陆上网之后一直监测上网状态,如果被强制下线就返回

    def suffer(self):
        #循环测试,直到能够登陆
        while(not self.cycle_login()):
            pass

        #当返回的是三个数字并且已逗号隔开的时候表示依然在线
        pattern = re.compile(r"^[\d]+,[\d]+,[\d]+$")#每过5秒访问一下状态
        while(True):
            time.sleep(self.check_time)
            status = self.get_status()
            if re.match(pattern,status):
                print("it is still online")
            else:
                print("sorry you are offline")
                #如果被强制下线,则自动加1,不然又会登上这个帐号
                self.current = self.current + 1
                print("下线后需要等一会儿才能再登陆")
                time.sleep(30)
                break
        #如果while循环退出表示上网失败了
        return False #这个函数将会一直执行

    def enjoy(self):
        while(not self.suffer()):
            pass

login = PseudoLogin()
login.enjoy()

我主要对那篇文章中的代码格式进行了人工调整,并且把python2给update到了python3。并且由于系统的升级,密码不再是以前的明文传递,改成了md5加密:

在这里插入图片描述

运行后:

在这里插入图片描述

成功登录,并且连上了网。

挂到路由器

这部分才是这篇博客的难点,我用的路由器是著名的刷固件神器斐讯k2p,用的固件是老毛子Padavan 3.4.3.9-099_20-06-1

Padavan

进入终端

要进入路由器的终端,首先得开放ssh服务:

在这里插入图片描述

然后通过ssh协议连接:

在这里插入图片描述

进来之后其实可以看到是个类似Linux系统的shell,是BusyBox的一部分,但是没有lsb_release -a, cat /etc/os-release等一系列的命令,也没有aptyumdpkgrpm 等软件包管理的工具,在这种情况下应该是没办法安装python的。

从外部安装opkg

没有这些包管理工具,我们就无法安装新的软件,因此需要找一个可用的package management tool。

经过一番搜寻,终于找到了一个方法: 从外部网站下载一个包管理工具——opkg,然后使用这个工具安装python3

由于路由器的file system建立在memory之上,其存储空间是read-only的,所以要先将内存划分一部分空间,挂载到文件系统:

mount -t tmpfs -o size=40M tmpfs /opt/

我这里分配了40M大小的内存,之前其实有尝试过分配10M和20M,但在后续安装python的时候提示了空间不足。

随后从外部网站下载opkg:

wget http://pkg.entware.net/binaries/mipsel/installer/opkg -O /opt/bin/opkg
chmod 755 /opt/bin/opkg
wget http://bin.entware.net/mipselsf-k3.4/installer/opkg.conf -O /opt/etc/opkg.conf

不出意外的话会提示文件夹不存在之类的错误,因为没有手动创建/opt/binopt/etc等文件夹,这部分mkdir即可。

进入/opt/bin目录,对opkg进行一下update,并安装一下ipk:

cd /opt/bin
./opkg update
wget https://archive.openwrt.org/barrier_breaker/14.07/ramips/mt7620a/packages/base/opkg_9c97d5ecd795709c8584e972bfdf3aee3a5b846d-7_ramips_24kec.ipk
opkg install ./opkg_9c97d5ecd795709c8584e972bfdf3aee3a5b846d-7_ramips_24kec.ipk

后台挂自动认证脚本

最后,安装python3:

opkg install python3

即可成功把python安装到路由器的RAM里。通过scp将python脚本传过来,然后使用nohup命令挂在后台即可:

scp ./keeplive.py admin@192.168.123.1:~/
nohup python3 ./keeplive.py &

后记

这样做还是有缺陷的,因为在RAM里,所以路由器断电重启的话文件会消失,还需要重写安装python并挂上,后续可以自己写一个脚本。

参考链接

[1] 浙大软院 免登录上网攻略
[2] 浙大python网_Python爬虫学习(8):浙大软院网络登陆保持
[3] StackOverflow: How to install a software management tool in Linux?
[4] Padavan固件安装软件包,7620老毛子Padavan固件安装openwrt安装额外的软件包
[5] 在Padavan 上使用Entware
[6] OPKG 软件包管理

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-01 16:48:38  更:2021-10-01 16:48:46 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 5:26:09-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计