小米路由器登陆以及切换wan账户脚本

在学校弄了移动联通各一个手机号,也就同时使用着这两家的宽带。每次想要切换这两个宽带的时候,你首先要把网线从移动/联通的交换机上拔出来然后,插到另一家的那台交换机上。然后呢我又是用的小米的无线路由器,所以还要登录到管理界面,再输入账号密码点击登陆才能完成切换。

每次都要输入这么一长串账号密码弄得我都有点烦躁了,所以在想直接写一个脚本来完成这一步骤。

 

我们抓包来看看怎么登陆,可以看出这个包就是我们想要的。

小米路由器登陆以及切换wan账户脚本_第1张图片

然后我们看看post了什么东西

小米路由器登陆以及切换wan账户脚本_第2张图片

总算不是明文po上去的了,这么一来我们就得想办法看看怎么加密的了。直接从源码里也能找到不过这多费劲呢,我们先百度一下试试,然后发现正好有人先做过了,http://www.tuicool.com/articles/2qaIzeu

这个博主替我们解决了最难的部分,从页面代码里找到了加密的方式,
利用requests模块进行登录,这里重点需要说明下密码的生成过程

CryptoJS.SHA1(this.nonce + CryptoJS.SHA1(pwd +this.key).toString()).toString();

密码+后端返回的一个key进行一次SHA1加密,转换成字符串之后与nonce相加再进行一个SHA1加密,最后进行一次字符串的转换就的到最终的密文。

 

我们就利用博主的开源代码直接登进去吧= =

然后找到输入宽带用户名和密码会发生什么,

我们直接用我输入的用户名搜索,发现以下包出现了该字段。

这明显一看就是set_wan就是我们要的啊,戳进去看

小米路由器登陆以及切换wan账户脚本_第3张图片

小米路由器登陆以及切换wan账户脚本_第4张图片

明文post过去了,真是省事。注意一下url里面的stok项是登陆以后返回的token的值,不要直接就抄下来url就传参数了。

下面就附带以下代码了~

第一行代码加上之后,给这个py文件赋予执行权限,chmod a+x .py  ,然后双击在mac上就能直接执行啦

#!/usr/bin/env python
# coding=utf-8
# code by zixiao
 
import requests
from Crypto.Hash import SHA
import random
import time
import json
import sys
import re
 
def tryLoginMi():
 
#    host = sys.argv[1]#在命令行输入的参数命令行参数,路由器地址
   host='192.168.31.1'
   
   homeRequest = requests.get('http://'+ host +'/cgi-bin/luci/web/home')
    key= re.findall(r'key:\'(.*)\',',homeRequest.text)[0]
    mac= re.findall(r'deviceId= \'(.*)\';',homeRequest.text)[0]
 
   
   aimurl = "http://"+host+"/cgi-bin/luci/api/xqsystem/login"
 
   nonce = "0_"+ mac +"_"+ str(int(time.time())) +"_"+str(random.randint(1000,10000))
 
#     pwdtext= sys.argv[2]#在命令行输入的第二个参数,密码
   pwdtext='XXXXX'
   
    pwd= SHA.new()
   pwd.update(pwdtext+key)
   hexpwd1 = pwd.hexdigest()
 
   pwd2 = SHA.new()
   pwd2.update(nonce+hexpwd1)
   hexpwd2 = pwd2.hexdigest()
 
 
   data = {
       "logtype":2,
       "nonce":nonce,
       "password":hexpwd2,
        "username":"admin"
       }
 
 
   response = requests.post(url=aimurl,data=data,timeout = 5)
   resjson = json.loads(response.content)
   
    if resjson['code'] ==0:
       print 'Login Success! Token is '+resjson['token']
    else:
       print 'Login Failed! Code is '+str(resjson['code'])
       
    global token1
   token1=resjson['token']
   
def changeWan():
   
   wan1={
          "wanType":"pppoe",
          "pppoeName":15052003824,
          "pppoePwd":xxxxxxxx,
          "autoset":0
          }
   
   wan2={
          "wanType":"pppoe",
          "pppoeName":"051602198839",
          "pppoePwd":xxxxxxx,
          "autoset":0        
         }
   
   switch=input("移动输入1,联通输入2:\n")
    if switch==1:
       wan=wan1
    elif switch==2:
       wan=wan2
       
   setUrl='http://192.168.31.1/cgi-bin/luci/;stok='+token1+'/api/xqnetwork/set_wan'
   respose1=requests.post(url=setUrl,data=wan,timeout = 5)
   resjson1=json.loads(respose1.content)
 
    if resjson1['code'] ==0:
       print 'setWan Success!'
    else:
       print 'setWan Failed! Code is '+str(resjson1['code'])
   
tryLoginMi()
changeWan()


运行效果


你可能感兴趣的:(脚本,管理,小米,路由器)