[toc]
Python获取FW150R无线路由器的客户端列表
目标
- 使用Python代码获取FW150R无线路由器的客户端列表, 为定时检测新加接入的客户端作准备
原因
- 无聊, 顺便熟悉下Python的相关模块
- 其它方式获取无线路由下的客户端设备名称存在局限性(如 nmap, angryip等扫描方式),而路由则是基于DHCP的,相对便捷。
预备
- FW150R无线路由器 (比较旧,属于基本能用的类型)
- VIM (用于编辑Python脚本)
- Chrome (浏览器)
- Python3
- requests (用于发起请求)
- bs4 (用于解析html)
- js2py (用于解析JS)
分析
- 通过Chrome浏览器登录FW150R无线路由
(默认无线路由器管理界面地址: http://192.168.0.1, 默认账号密码 admin/admin , 以实际为准)
- 在无线路由器管理界面左边菜单栏选择DHCP服务器,选择客户端列表,切换到客户端列表页面
- 打开Chrome菜单,选择更多工具,选择开发者工具
- 在开发者工具页面,选择 Network
- 点击客户端列表刷新按钮,并查看开发者工具出现的链接地址
- 确定获取客户端列表的请求
- 在 Network 页面选择 获取客户端列表的请求, 查看 Response 内容
- 分析返回响应内容可知, 页面由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 模块就足够扫描局域网里的存活主机。
网友评论