使用 Python 持续解除路由器IP带宽控制
在路由器中,有个选项是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带宽控制。

首先我们先分析下关闭请求。直接打开FF的网络监控,随后关闭开关,然后点击保存,看到如下一个请求:


看到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小时后台运行了。
评论
您需要 先登录 才可以回复.