在学校弄了移动联通各一个手机号,也就同时使用着这两家的宽带。每次想要切换这两个宽带的时候,你首先要把网线从移动/联通的交换机上拔出来然后,插到另一家的那台交换机上。然后呢我又是用的小米的无线路由器,所以还要登录到管理界面,再输入账号密码点击登陆才能完成切换。
每次都要输入这么一长串账号密码弄得我都有点烦躁了,所以在想直接写一个脚本来完成这一步骤。
我们抓包来看看怎么登陆,可以看出这个包就是我们想要的。
然后我们看看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()