美文网首页
Python获取FW150R无线路由器的客户端列表

Python获取FW150R无线路由器的客户端列表

作者: Pydes | 来源:发表于2020-05-08 01:25 被阅读0次

    [toc]

    Python获取FW150R无线路由器的客户端列表

    目标

    • 使用Python代码获取FW150R无线路由器的客户端列表, 为定时检测新加接入的客户端作准备

    原因

    • 无聊, 顺便熟悉下Python的相关模块
    • 其它方式获取无线路由下的客户端设备名称存在局限性(如 nmap, angryip等扫描方式),而路由则是基于DHCP的,相对便捷。

    预备

    • FW150R无线路由器 (比较旧,属于基本能用的类型)
    • VIM (用于编辑Python脚本)
    • Chrome (浏览器)
    • Python3
    • requests (用于发起请求)
    • bs4 (用于解析html)
    • js2py (用于解析JS)

    分析

    1. 通过Chrome浏览器登录FW150R无线路由

    (默认无线路由器管理界面地址: http://192.168.0.1, 默认账号密码 admin/admin , 以实际为准)

    1. 在无线路由器管理界面左边菜单栏选择DHCP服务器,选择客户端列表,切换到客户端列表页面
    2. 打开Chrome菜单,选择更多工具,选择开发者工具
    3. 在开发者工具页面,选择 Network
    4. 点击客户端列表刷新按钮,并查看开发者工具出现的链接地址
    5. 确定获取客户端列表的请求

    (http://192.168.0.1/userRpm/AssignedIpAddrListRpm.htm)

    1. 在 Network 页面选择 获取客户端列表的请求, 查看 Response 内容
    2. 分析返回响应内容可知, 页面由javascript与html组成, 在页面第一段 javascript 定义了 DHCPDynList的数组对象, 第二段 javascript 定义的数组格式, 最后通过 javascript 重写的页面显示表格, 生成了最终显示的页面内容。

    实现

    
    #!/usr/bin/env python3
    #coding: utf8
    
    ## TODO: 导入模块
    import requests
    from bs4 import BeautifulSoup
    import js2py
    
    ## TODO: 配置信息 
    ''' 定义无线路由器登录账号, 密码 '''
    router_login = ('admin', 'admin')
    ''' 定义获取客户端列表的请求地址 '''
    router_url = 'http://192.168.0.1/userRpm/AssignedIpAddrListRpm.htm'
    
    ## TODO: 获取客户端列表请求响应内容
    get_response_action = requests.get(router_url, auth=router_login).text
    
    ## TODO: 创建 bs 对象
    soup = BeautifulSoup(get_response_action, 'html.parser')
    
    ## TODO: 获取匹配 script 的内容, 根据页面内容选择第一段 script 的内容
    js1 = soup.find_all("script", {'type': 'text/javascript'})[0]
    
    ## TODO: 解析第一段 javascript 的内容, 并只提供客户端列表信息
    dhcpdynlist = list(js2py.eval_js(js1.string))[0:-2]
    
    ## TODO: 格式化显示的内容
    '''dhcpdynlist类型为一维列表, 每四个位置表示一组客户端信息,包括(客户端名,MAC地址, IP地址, 有效时间), 所以这里进行格式化显示'''
    dhcpdynlistf = [{'name': dhcpdynlist[i], 'mac': dhcpdynlist[i+1], 'ip': dhcpdynlist[i+2], 'time': dhcpdynlist[i+3]} for i in range(0, len(dhcpdynlist), 4)]
    
    ## TODO: 打印结果 
    print(dhcpdynlistf)
    

    输出

    
    [{
        'name': 'PC2020',
        'mac': 'xx-xx-xx-xx-xx-xx',
        'ip': '192.168.0.100',
        'time': '01:41:00'
    }, {
        'name': 'RedmiNote7',
        'mac': 'xx-xx-xx-xx-xx-xx',
        'ip': '192.168.0.101',
        'time': '01:43:43'
    }, {
        'name': 'MI4LTE',
        'mac': 'xx-xx-xx-xx-xx-xx',
        'ip': '192.168.0.104',
        'time': '01:07:18'
    }]
    
    

    约束

    • 只对FW150R无线路由有效,其它设备需要具体问题具体分析
      (如360安全路由会在登录前对密码进行加密,则需要通过解析或直接调用它的js对密码明文进行处理后,再发送,同时请求的链接地址和需要解析的内容也不同。)

    扩展

    • 如不是太在意获取客户端名, python-nmap 模块就足够扫描局域网里的存活主机。

    相关文章

      网友评论

          本文标题:Python获取FW150R无线路由器的客户端列表

          本文链接:https://www.haomeiwen.com/subject/jlotnhtx.html