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

[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 模块就足够扫描局域网里的存活主机。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。