手上有一台上古时代的tp-link,获取ip没问题,但是速度太慢,于是研究了水星mac1200R.
通过Firebug研究登陆可以知道
首先登陆的时候,需要将密码编码以后以json形式传给路由器,然后会响应你一个stok作为构造url请求的安全令牌
下面是请求以后获取的stok
然后,除了加载必要的页面以外,所有的通信都是通过js代码xhr请求交换json数据来填充页面的。
比如我们想知道的wan口信息,可以请求
http://192.168.4.1/stok=4f0bd18f8e0b75f6c27f153d63818153/ds
然后请求参数为
{"network":{"name":"wan_status"},"method":"get"}
请求以后获得的响应报文为:
{ "network": { "wan_status": { "down_speed": 0, "up_speed": 0, "ipaddr": "223.243.12.94", "link_status"
: 1, "phy_status": 1, "error_code": 0, "proto": "pppoe", "pri_dns": "61.132.163.68", "gateway": "223
.243.0.1", "up_time": 152098, "snd_dns": "202.102.213.68", "netmask": "255.255.255.255" } }, "error_code"
: 0 }
至此,大体的思路就是:
1、首先构造post请求,获得stok安全令牌
2、通过安全令牌、json请求wan口地址
import urllib.request
import json
#读取内容的函数
def get_data(url,data=None):
headers = {#"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:47.0) Gecko/20100101 Firefox/47.0",
#"Referer": "http://192.168.4.1/",
#"Accept": "application/json, text/javascript, */*; q=0.01",
#"X-Requested-With": "XMLHttpRequest",
#"Content-Type": "application/json; charset=UTF-8"
}
#水星的路由器对请求头验证不是很严格,我把这些都关闭了似乎也一切正常,如果你们有需要自己关闭注释
data = json.dumps(data).encode("utf-8")
#data = urllib.parse.urlencode(data)
#data = data.encode("utf-8")
req = urllib.request.Request(url,data,headers)
response = urllib.request.urlopen(req)
data = response.read()
response.close()
return data
#获取令牌
url = "http://192.168.4.1/" #路由器ip
paras = {"method":"do","login":{"password":"AY2X56xURTefwww"}} #密码具体如何加密的不太清楚,我是直接在浏览器上看的
data= get_data(url,paras).decode()
stok = json.loads(data).get("stok")
#通过stok构造url
url = "http://192.168.4.1/stok="+stok+"/ds"
#请求参数
js = {"protocol":{"name":["pppoe","wan"]},"network":{"name":"wan_status"},"method":"get"}
data = get_data(url,js)
#解析获取的数据,取得ip
ip =json.loads(data.decode()).get("network").get("wan_status").get("ipaddr")
各厂商路由器型号各不相同,没有通用的方法,这个只能针对水星路由器,其他情况需要自己分析,如果dd-wrt应该只需要正则就可以,因为他们登陆之前就可以看wan ip。
其实firebugs生成的curl应该更简单,不过没测试过是否可行,当然你也可以自己封装一个适合自己的类curl工具