在學校弄了移動聯通各一個手機號,也就同時使用着這兩家的寬帶。每次想要切換這兩個寬帶的時候,你首先要把網線從移動/聯通的交換機上拔出來然後,插到另一家的那臺交換機上。然後呢我又是用的小米的無線路由器,所以還要登錄到管理界面,再輸入賬號密碼點擊登陸才能完成切換。
每次都要輸入這麼一長串賬號密碼弄得我都有點煩躁了,所以在想直接寫一個腳本來完成這一步驟。
我們抓包來看看怎麼登陸,可以看出這個包就是我們想要的。
然後我們看看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()
運行效果