登录

在这个站点登录

保存我的登录记录

<<忘记密码?

还没有账号?点此注册>>

Jerry

使用 Python 持续解除路由器IP带宽控制

分享到:

本文已被浏览7164

在路由器中,有个选项是IP带宽控制,这一项用于ADSL宽带上网的用户用于控制网速。由于ADSL上网的机制问题,ADSL宽带的上传带宽会相对小于下载带宽,尤其是在局域网内存在P2P协议软件时会因为其大量占用上传带宽而导致网络速度卡顿。同时,这样一个功能也可以用于对于局域网内设备的网络限速。在这里,我将介绍一种方法,用于保持禁用IP带宽控制。
首先来看下路由器。我实验用的路由器是TP-Link的TL-WR886N。这款路由器的管理员没有对用户名进行要求,只是有一个用于登录的密码。
登录路由器后台
通过分析这个页面的代码,发现他的登录机制非常简单:

function PCSubWin(){
	if(CheckPswLength() == true ){ //判断了一个字符长度和格式
		var password = $("pcPassword").value;	//读取数据
		var auth = "Basic "+Base64Encoding("admin:"+password); //生成cookie内容
		document.cookie = "Authorization="+escape(auth)+";path=/"; //设定cookie
		location.reload(); //刷新页面进入后台
	}
}

这段代码非常明显是先将密码加上前缀”admin: “,随后进行Base64算法加密,最后在密码的前面加上”Authorization=Basic “存入Cookie,随后刷新页面即可登录成功。看到这里,或许读者已经知道如何登录路由器页面了。只要在登录的时候将这一过程还原,存入Cookie,再带Cookie访问主页即可。这里我们使用Python脚本。
先说下Python脚本中的网络编程。
网上有两种,一种是使用Httplib模块,另一种是使用urllib2模块。经过了解,这两种方式在简单的GET、POST请求上功能类似,但是在更加高级的功能上,后者更加灵活,但是会稍稍复杂些。这里我只介绍Httplib模块的使用。

HTTPClient=None
try:
    HTTPClient = httplib.HTTPConnection('domain',port,timeout=30) #创建对象
    HTTPClient.request("GET/POST","URL",header=headers) #请求地址
    HTTPResponse=HTTPClient.getresponse(); #获得相应
    print HTTPResponse.read(); #读取原文
except Exception,e:
    print e #抓取异常
finally:
    if HTTPClient:
        HTTPClient.close() #记得关闭连接

到这里,我们就可以开始登陆路由器部分的编写。

import httplib
import urllib
HTTPClient = None
try:
    DeninPram = urllib.urlencode({
        "QoSCtrl":0,
        "userWanType":0,
        "down_bandWidth":102400,
        "up_bandWidth":102400,
        "Save":"%B1%A3%20%B4%E6"
    })
    Header = {
        "Host":"192.168.1.1",
        "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0",
        "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
        "Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
        "Referer":"http://192.168.1.1/userRpm/QoSCfgRpm.htm",
        "Cookie":"Authorization=Basic%20这里可以直接从Firefox中拷出来,省事; ChgPwdSubTag=",
        "Connection":"keep-alive"
    }
    HTTPClient = httplib.HTTPConnection('192.168.1.1',80,timeout=30)
    HTTPClient.request("GET","/",headers=Header)
    HTTPResponse=HTTPClient.getresponse();
    print HTTPResponse.read();
except Exception,e:
    print e
finally:
    if HTTPClient:
        HTTPClient.close()

如果我们看到的输出内容是登陆页面的HTML代码(例如下图),那么说明我们登陆路由器后台失败。
没有登录成功的返回内容
如果我们看到的输出内容是后台主页的主题框架的HTML代码(例如下图),说明我们的头部设定是正确的。
登录成功的返回内容
那么我们可以进行下一步。我们点到IP带宽控制这一模块。发现这里有一个总开关。如果我们使用代码持续发送关闭这一开关的请求,即可禁用IP带宽控制。
路由器后台关于IP带宽控制的内容
首先我们先分析下关闭请求。直接打开FF的网络监控,随后关闭开关,然后点击保存,看到如下一个请求:
关闭IP带宽控制的请求
请求参数
看到GET了一个地址,参数有5个,其中最重要的是一个QoSCtrl参数,0为关闭限制,1为开启限制,其余的四个参数的意义如下,需要的读者可以参考:

QoSCtrl:是否打开限制
    0:关闭限制
    1:打开限制
userWanType:用户WAN类型
    0:ADSL线路
    1:其他线路
down_banWidth:下载带宽 单位Kbps,注意单位是千位/秒
up_banWidth:上传带宽 单位Kbps,注意单位是千位/秒
Save:貌似只是一个按钮而已,无视他,直接赋值"保存"

那么我们就可以构建一个GET请求,直接带着上面的Cookie向路由器请求,即可让路由器关闭IP带宽控制。后来我发现并不需要具体的请求登录等等过程,直接向这个网址进行GET请求即可到达到关闭带宽控制的目的。最后在所有代码的最外层加上一个死循环,持续请求即可。以下是最终的代码:

import httplib #引入Httplib
import urllib #urllib用于UrlEncode算法转换地址
import time #time用于延时模块
#创建变量
HTTPClient = None
#死循环
while True:
    #准备异常获取
    try:
        #禁用请求的参数
        DeninPram = urllib.urlencode({
            "QoSCtrl":0,
            "userWanType":0,
            "down_bandWidth":102400,
            "up_bandWidth":102400,
            "Save":"%B1%A3%20%B4%E6"
        })
        #构建头部,直接从FireFox中拷出来
        Header = {
            "Host":"192.168.1.1",
            "User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0",
            "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
            "Accept-Language":"zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3",
            "Referer":"http://192.168.1.1/userRpm/QoSCfgRpm.htm",
            "Cookie":"Authorization=Basic%20这里是加密的密码%3D%3D; ChgPwdSubTag=",
            "Connection":"keep-alive"
        }
        #创建连接
        HTTPClient = httplib.HTTPConnection('192.168.1.1',80,timeout=30)
        #请求地址
        HTTPClient.request("GET","/userRpm/QoSCfgRpm.htm?"+DeninPram,headers=Header)
        #获取相应
        HTTPResponse=HTTPClient.getresponse();
        #如果请求成功,那么就1分钟后进行下一次请求
        if HTTPResponse.status==200:
            time.sleep(60)
    except Exception,e:
        print e
    finally:
        #最后记得关闭连接
        if HTTPClient:
            HTTPClient.close()

当然,只是在自己的电脑上使用并不能够满足需求,我就把它在我的树莓派上持续24小时后台运行了。

 手机扫描左边的二维码,立刻将文章收入手机!
 微信扫描左边二维码,点击右上角即可分享到朋友圈!
严禁任何非授权的采集与转载,转载须经站长同意并在文章显著位置标注本文连接,站长保留追究法律责任的权利.

评论

 您需要 先登录 才可以回复.