自动登录TP-LINK路由器,获取所有信息,重启等等,实用方法

用Python自动登录TP-LINK路由器,获取信息,重启等操作

思路:想获取TP-LINK里面的所有信息,必须首先登录,然后提交相应的操作(比如重启)

1、 做任何操作,首先得登录到路由器
界面上面默认只有一个“密码”输入框,这里随便输入一个123密码发现,TP-LINK提交后的密码为加密后的,分析js就可以看到加密方法(下面会附上代码),再把加密后的密码提交就搞定啦
路由器登录post信息截图(TP-LINK关掉了页面右键功能,可以手动打开浏览器的开发者工具,网络部分查看):

附上Python实现登录的方法

#!/usr/bin/env python
# -*- coding:utf8 -*-
‘‘‘
Author : mafei
Date   : 18/1/20
‘‘‘
import requests
import json

# 加密提交后的密码,可以把自己的密码提交到这个方法,再跟TP-LINK页面中实际提交的密码值做比对
def encrypt_pwd(password):
    input1 = "RDpbLfCPsJZ7fiv"
    input3 = "yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW"
    len1 = len(input1)
    len2 = len(password)
    dictionary = input3
    lenDict = len(dictionary)
    output = ‘‘
    if len1 > len2:
        length = len1
    else:
        length = len2
    index = 0
    while index < length:
        # 十六进制数 0xBB 的十进制为 187
        cl = 187
        cr = 187
        if index >= len1:
            # ord() 函数返回字符的整数表示
            cr = ord(password[index])
        elif index >= len2:
            cl = ord(input1[index])
        else:
            cl = ord(input1[index])
            cr = ord(password[index])
        index += 1
        # chr() 函数返回整数对应的字符
        output = output + chr(ord(dictionary[cl ^ cr]) % lenDict)
    return output

# 提交登录请求的方法
def login(password=‘‘):
    encrypt_password = encrypt_pwd(password)
    url = ‘http://192.168.1.1/‘
    headers = {‘Content-Type‘: ‘application/json; charset=UTF-8‘}
    payload = ‘{"method":"do","login":{"password":"%s"}}‘ % encrypt_password
    response = requests.post(url, data=payload, headers=headers)
    response_body = json.loads(response.text)
    return response_body

if __name__ == ‘__main__‘:
    print(login(password=‘xxx‘))
        # 返回的数据样例,error_code为0表示登录成功,stok是动态生成的key {u‘error_code‘: 0, u‘stok‘: u‘xxx‘}

2、 获取登录之后的设备信息
先观察规律会发现,每次TP-LINK提交到后台的URL中都有一个stok的变量,是TP-LINK生成的动态key,每次登陆都会重新生成一个,这个stok在上一步登陆之后我们已经获取到了,后面就直接提交相应的json请求就可以了,到此已经已经全部搞定

def get_all_host(password):
    stok = login(password).get(‘stok‘)
    payload = ‘{"hosts_info":{"table":"host_info"},"method":"get"}‘
    headers = {‘Content-Type‘: ‘application/json; charset=UTF-8‘}
    url = ‘%sstok=%s/ds‘ % (‘http://192.168.1.1/‘, stok)
    response = requests.post(url, data=payload, headers=headers)
    return response.text

if __name__ == ‘__main__‘:
    print(get_all_host(password=‘ncmmssm_8‘))
# 返回的样例数据
# { "hosts_info": { "host_info": [ { "host_info_1": { "mac": "4c-32-75-29-5a-f3", "type": "1", "blocked": "0", "ip": "192.168.1.104", "hostname": "mafeiMBP", "up_speed": "3487", "down_speed": "5733", "up_limit": "0", "down_limit": "0", "cfg_valid": "0", "is_cur_host": "1", "ssid": "", "wifi_mode": "0", "plan_rule": [ ] } }, { "host_info_4": { "mac": "48-d2-24-ed-51-a4", "type": "1", "blocked": "0", "ip": "192.168.1.103", "hostname": "Lenovo%2DPC", "up_speed": "5733", "down_speed": "1975", "up_limit": "0", "down_limit": "0", "cfg_valid": "0", "is_cur_host": "0", "ssid": "", "wifi_mode": "0", "plan_rule": [ ] } }, { "host_info_2": { "mac": "90-8d-6c-0a-a6-8d", "type": "1", "blocked": "0", "ip": "192.168.1.101", "hostname": "iPad%2D2", "up_speed": "0", "down_speed": "0", "up_limit": "0", "down_limit": "0", "cfg_valid": "0", "is_cur_host": "0", "ssid": "", "wifi_mode": "0", "plan_rule": [ ] } } ] }, "error_code": 0 }

这里附上完整源代码

#!/usr/bin/env python
# -*- coding:utf8 -*-
‘‘‘
Author : mafei
Date   : 18/1/20
‘‘‘
import requests
import json

class LoginTpLink(object):
    def __init__(self):
        self.password = ‘ncmmssm_8‘
        self.stok = self.login(self.password)  # 初始化类的时候就自动登录,获取到stok(动态key)

    # 加密密码的方法
    def encrypt_pwd(self, password):
        input1 = "RDpbLfCPsJZ7fiv"
        input3 = "yLwVl0zKqws7LgKPRQ84Mdt708T1qQ3Ha7xv3H7NyU84p21BriUWBU43odz3iP4rBL3cD02KZciXTysVXiV8ngg6vL48rPJyAUw0HurW20xqxv9aYb4M9wK1Ae0wlro510qXeU07kV57fQMc8L6aLgMLwygtc0F10a0Dg70TOoouyFhdysuRMO51yY5ZlOZZLEal1h0t9YQW0Ko7oBwmCAHoic4HYbUyVeU3sfQ1xtXcPcf1aT303wAQhv66qzW"
        len1 = len(input1)
        len2 = len(password)
        dictionary = input3
        lenDict = len(dictionary)
        output = ‘‘
        if len1 > len2:
            length = len1
        else:
            length = len2
        index = 0
        while index < length:
            # 十六进制数 0xBB 的十进制为 187
            cl = 187
            cr = 187
            if index >= len1:
                # ord() 函数返回字符的整数表示
                cr = ord(password[index])
            elif index >= len2:
                cl = ord(input1[index])
            else:
                cl = ord(input1[index])
                cr = ord(password[index])
            index += 1
            # chr() 函数返回整数对应的字符
            output = output + chr(ord(dictionary[cl ^ cr]) % lenDict)
        return output

    # 登录方法
    def login(self, password=‘‘):
        encryptPwd = self.encrypt_pwd(password)
        url = ‘http://192.168.1.1/‘
        headers = {‘Content-Type‘: ‘application/json; charset=UTF-8‘}
        payload = ‘{"method":"do","login":{"password":"%s"}}‘ % encryptPwd
        response = requests.post(url, data=payload, headers=headers)
        stok = json.loads(response.text)[‘stok‘]
        return stok

    # 获取所有主机信息的方法
    def all_host_info(self):
        payload = ‘{"hosts_info":{"table":"host_info"},"method":"get"}‘
        response = self.post_tp_link(payload)
        return response.text

    # 重启路由器的方法
    def reboot(self):
        payload = ‘{"system":{"reboot":null},"method":"do"}‘
        response = self.post_tp_link(payload)
        return response.text

    # 为了通用,封装的post方法
    def post_tp_link(self, payload):
        headers = {‘Content-Type‘: ‘application/json; charset=UTF-8‘}
        url = ‘%sstok=%s/ds‘ % (‘http://192.168.1.1/‘, self.stok)
        response = requests.post(url, data=payload, headers=headers)
        return response

if __name__ == ‘__main__‘:
    login_tp_link = LoginTpLink()

    result = login_tp_link.reboot()
    import pprint
    pprint.pprint(json.loads(result))

原文地址:http://blog.51cto.com/mapengfei/2063279

时间: 2024-11-04 00:33:34

自动登录TP-LINK路由器,获取所有信息,重启等等,实用方法的相关文章

yii2 自动登录解读

今日遇到一个需要将当前用户,全部登出系统(YII2框架制作)重新登录的需求 仔细回忆一遍,Yii2的登录流程,竟然有些不太明白,于是下午空闲时 重新看了下Yii2的用户登录源码 文件位于YII2项目下:vender/yiisoft/yii2/web/User.php /** * @身份属性类对象 是一个 实现IdentityInterface接口的一个对象 */ public $identityClass; /** * @var bool 属性 是否使用(cookie)自动登录 */ publi

二十 Filter&amp;自动登录功能

Filter过滤器 过滤器,其实就是对客户端发出来的请求进行过滤,浏览器发出,然后服务器用Servelt处理.在中间就可以过滤,起到的是拦截的作用. 不仅仅作用于客户端请求,而且过滤服务器响应 作用: 对一些敏感词汇进行过滤 统一设置编码 自动登录 如何使用Filter? 新建一个类,实现Filter接口 注册过滤器,在web.xml中配置filter,url建议为/* chain.doFilter(request, response);//是否连接下一个过滤器,也就是说,过滤器3是否放行,让后

利用phantomjs模拟QQ自动登录

之前为了抓取兴趣部落里的数据,研究了下QQ自动登录. 当时搜索了一番,发现大部分方法都已经失效了,于是准备自己开搞. 第一个想到的就是参考网上已有方案的做法,梳理登陆js的实现,通过其他语言重写.考虑到js可能会更新,放弃了此方案. 第二个想到的是能不能直接调用QQ自己的js方法,模拟进行提交呢.搜索一番后发现神器 ---- "phantomjs". PhantomJS is a headless WebKit scriptable with a JavaScript API. It

Cookie创建-获取-持久化、自动登录、购物记录、作用路径

1.cookie是啥?随手百度了网友的说说 简单的说,Cookie就是服务器暂存放在你计算机上的一笔资料,好让服务器用来辨认你的计算机.当你在浏览网站的时候,Web服务器会先送一小小资料放在你的计算机上,当下次你再光临同一个网站,Web服务器会先看看有没有它上次留下的Cookie资料,有的话,就会依据Cookie里的内容来判断使用者,送出特定的网页内容给你. 2.cookie在哪里? 3.cookie可以删除吗? 4.cookie实现原理 第一次请求浏览器,在浏览器的cookie存储区,没有co

获取全局上下文(getApplicationContext)_创建Shared Preference工具类_实现自动登录

===========================获取全局上下文(getApplicationContext)======================== 1.在com.example.autologin.myapplication包中创建Myapplication extends Application 代码: 1 public class Myapplication extends Application 2 { 3 private static Context context; 4

python实现QQ机器人(自动登录,获取群消息,发送群消息)

一次偶然的机会我看见了一个群里的一个QQ号总是根据你所发的消息自动回复,当时很感觉到神奇,我知道可以模拟登录网站,没想到竟然也能模拟登录QQ,首先自己想到的就是如何实现模拟登录PC端的QQ, 开始研究了下,发现QQ所发送的包都很难理解. 于是就转到了网页版的QQ,因为在网页里可以捕获所有的请求从而更好的实现模拟功能! 首先第一步就是打开网页版的qq,打开浏览器的开发者模式 这里可以监控所有的请求! 打开登录界面的的时候 会捕捉到一个GET请求 https://ssl.ptlogin2.qq.co

自动重启、定时开关机、自动登录系统...

第一种方法:电脑自动开机.且音乐随你定 .自动定时开机此功能需要在BIOS中设定,并且你的主板的高级电源管理设置必须支持这个功能,不过现在大多数的主板全支持,放心使用吧.步骤一:启动系统按DEL,进入BIOS,然后选中 "POWER MANAGEMENT FEATURES"(电源管理设置),回车进入.在电源窗口中找到"RESTORE ON AC/POWERLOSS"项,按回车,然后通过方向键设置其值为"POWER ON".步骤二:选中"

linux 自动登录ftp 获取文件

1.ftp自动登录批量下载文件 #####从ftp服务器上的remote_path 到 本地的local_path #!/bin/bash ftp -n<<! open ip user username password binary cd remote_path lcd local_path prompt #单个文件用get,多个文件用mget mget * close bye ! 2.ftp自动登录上传文件 ####本地的local_path to ftp服务器上的remote_path#

[Python爬虫] Selenium实现自动登录163邮箱和Locating Elements介绍

目录(?)[+] 前三篇文章介绍了安装过程和通过Selenium实现访问Firefox浏览器并自动搜索"Eastmount"关键字及截图的功能.而这篇文章主要简单介绍如何实现自动登录163邮箱,同时继续介绍Selenium+Python官网Locating Elements部分内容.        希望该篇基础性文章对你有所帮助,如果有错误或不足之处,请海涵~        [Python爬虫] 在Windows下安装PhantomJS和CasperJS及入门介绍(上)