使用Python管理小米路由器

回顾

之前很早的时候写过一篇使用 Python 脚本登录小米路由器的文章,文章链接在这 写个Python脚本来登录小米路由器 ,当时写那个脚本是因为看到Github上有朋友问我这个登录的问题,刚好那时候手上正好也有一台小米路由器,于是花了点时间写了个Demo例子给他。

后面因为搬家的原因,小米路由器送人了,就没再关注这个东西,也就没有继续写其他功能...

问题

今天在写另外一个脚本的时候遇到了一个问题,我脚本的功能很简单,就是去抓取别人网站的某个查询接口,但是因为线程开太大了,导致IP被封。

路人甲:你TM傻逼么?换个IP不就好了?路由器断开重连不会?

对啊,我就是不会啊,你来打我?

你想一下,IP被封了,你需要打开浏览器,登录路由器,页面还卡到爆炸,然后各种点,终于到了拨号的页面,才能进行断开重连的操作,这特么实在是太麻烦了,对于博主这种懒癌晚期患者来说,实在是不能忍!

解决

博主我表示不能把玩耍的时间浪费在这种无用功上面啊,请出世界上最屌的编程语言 ---> Python ,愉快的撸一发吧。

自动化脚本的关键点就是机器能在合适的时间点根据给出的条件执行对应的操作,那么这里我要执行的显然是断开连接重新获取IP地址的操作。

当然,嘴上功夫再厉害,没有实战怎么能行?

分析

开始之前还是分析分析整个过程把。

登录 -> 执行重启

看起来似乎并没有什么需要分析的...

为了让脚本显得更加牛逼,我顺手把获取wan信息给加上去了,当然了,肯定少不了当前在线设备的列表啦。

什么?你说wifi也要?呵呵,我就不写!

是不是相当简单的逻辑呢?这TM压根就没有逻辑可言~~~

编码

对,就是编码,真的很简单,我就不一一解释了,直接上代码吧

#!/usr/bin/env python
# coding=utf-8
# code by 92ez.com

import requests
from Crypto.Hash import SHA
import random
import time
import json
import sys
import re

reload(sys)
sys.setdefaultencoding('utf8')

def getToken(host):

    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]

    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:
        return resjson['token']
    else:
        return False


def getInfo(host, token):

    base_url = 'http://'+ host + '/cgi-bin/luci/;stok='+ token + '/api/misystem/status'
    wan_url = 'http://'+ host + '/cgi-bin/luci/;stok='+ token + '/api/xqnetwork/wan_info'
    stop_url = 'http://'+ host + '/cgi-bin/luci/;stok='+ token + '/api/xqnetwork/pppoe_stop'
    start_url = 'http://'+ host + '/cgi-bin/luci/;stok='+ token + '/api/xqnetwork/pppoe_start'
    pppoe_url = 'http://'+ host + '/cgi-bin/luci/;stok='+ token + '/api/xqnetwork/pppoe_status'
    reboot_url = 'http://'+ host + '/cgi-bin/luci/;stok='+ token + '/api/xqnetwork/reboot?client=web'

    getStatus(base_url)
    getWanInfo(wan_url)

    action = sys.argv[3]

    if action == 'reconnect':
        doReconnect(stop_url,start_url,pppoe_url)
    elif action == 'restart':
        doReboot(reboot_url)
    else:
        pass


def getStatus(url):
    try:
        statusInfo = json.loads(requests.get(url,timeout=5).content)

        devList = statusInfo['dev']

        print '[CPU]: '+ str(statusInfo['cpu']['core']) + '核   '+ statusInfo['cpu']['hz'] + '   系统负载 '+ str(statusInfo['cpu']['load'])
        print '[MAC]: '+ statusInfo['hardware']['mac']
        print '[MEM]: Type: '+ statusInfo['mem']['type'] +'   Total: '+ statusInfo['mem']['total'] + '   Usage: ' +str(statusInfo['mem']['usage']*100)+'% \n'
        print '--------------------[DEV]----------------------\n'
        for dev in devList:
            print dev['mac']+ ' ' + dev['devname']
    except Exception,e:
        print e


def getWanInfo(url):
    try:
        wanInfo = json.loads(requests.get(url,timeout=5).content)
        print '\n--------------------[WAN]----------------------\n'
        print '用户: '+ wanInfo['info']['details']['username']
        print '密码: '+ wanInfo['info']['details']['password']
        print '类型: '+ wanInfo['info']['details']['wanType']
        print 'IP地址: '+ wanInfo['info']['ipv4'][0]['ip']
        print '网关: '+ wanInfo['info']['gateWay']
        print 'DNS: '+ wanInfo['info']['dnsAddrs']+','+wanInfo['info']['dnsAddrs1']
    except Exception,e:
        print e


def doReconnect(stop,start,pppoe):
    print '\n-----------------[Reconnect]-------------------\n'
    try:
        currentip = json.loads(requests.get(pppoe, timeout=5).content)['ip']['address']
        print 'Current ip is '+ currentip
        stopInfo = json.loads(requests.get(stop,timeout=5).content)
        if stopInfo['code'] == 0:
            print 'Sleep 3s...'
            time.sleep(3)
            startInfo = json.loads(requests.get(start, timeout=5).content)
            if startInfo['code'] == 0:
                print 'Opration success... sleep 8s ...'
                time.sleep(8)
                newip = json.loads(requests.get(pppoe,timeout=5).content)['ip']['address']
                print 'Success! New ip is '+newip
            else:
                print 'Failed!'
        else:
            print 'Failed!'
    except Exception,e:
        print e


def doReboot(url):
    try:
        reboot = json.loads(requests.get(url,timeout=5).content)

        if reboot['code'] == 0:
            print 'Rebooting...'
        else:
            print 'Reboot failed!'
    except Exception,e:
        print e

if __name__ == '__main__':
    print '\n########### Login Mi Router Test Py ############'
    print '		Author 92ez.com'
    print '################################################\n'

    host = sys.argv[1]
    token = getToken(host)

    if token:
        getInfo(host,token)
    else:
        print 'Login failed!'

效果

一个图应该就能说明了吧,图上我执行了重连的操作

wewefew.png - 大小: 159.13 KB - 尺寸: 1005 x 655 - 点击打开新窗口浏览全图


本文链接:https://www.92ez.com/?action=show&id=23405
!!! 转载请先联系non3gov@gmail.com授权并在显著位置注明作者和原文链接 !!! 小黑屋
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。

上一篇: apt-get 提示 "E: 无法找到获取软件包的渠道 ..."
下一篇: Python爬虫使用PyV8执行js代码

访客评论
目前还没有人评论,您发表点看法?
发表评论

评论内容 (必填):