小米路由器登陸以及切換wan賬戶腳本

在學校弄了移動聯通各一個手機號,也就同時使用着這兩家的寬帶。每次想要切換這兩個寬帶的時候,你首先要把網線從移動/聯通的交換機上拔出來然後,插到另一家的那臺交換機上。然後呢我又是用的小米的無線路由器,所以還要登錄到管理界面,再輸入賬號密碼點擊登陸才能完成切換。

每次都要輸入這麼一長串賬號密碼弄得我都有點煩躁了,所以在想直接寫一個腳本來完成這一步驟。

 

我們抓包來看看怎麼登陸,可以看出這個包就是我們想要的。


然後我們看看post了什麼東西


總算不是明文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就是我們要的啊,戳進去看



明文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()


運行效果


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章