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