【发布时间】:2021-05-08 20:19:29
【问题描述】:
我正在为一个项目使用 NetGear 交换机型号 GS752TPP。这个模型能够提供以太网供电,我想通过网络界面自动抓取这些信息,因为没有 API 存在。随着时间的推移,我需要连接设备的功耗。看下图加深理解:NetGear Switch Power Monitoring Table
pynetgear Python 脚本不适用于我的模型。
我正在使用 Python Selenium 打开无头 Firefox 以访问 Web 界面。我可以将我的密码发送到相应的字段,登录并单击我的方式进入右侧选项卡(下面的代码)。我可以在表格中看到数据,但它在 HTML 中不可见。我无法通过 CSS 或 xpath 访问这些字段。为了找到正确的 CSS 或 xpath,我使用了 Firefox 的 Selenium IDE 插件。
检查网站网络后,我找到了正确的请求,该请求返回了我需要的数据:
网址https://<ip_address>/cgi/get.cgi?cmd=poe_port&dummy=1612446184975&bj4=07e0349a9b364bf17177eafe167deaa6
卷曲 curl 'https://<ip_address>/cgi/get.cgi?cmd=poe_port&dummy=1612446184975&bj4=07e0349a9b364bf17177eafe167deaa6' -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:85.0) Gecko/20100101 Firefox/85.0' -H 'Accept: application/json, text/javascript, */*; q=0.01' -H 'Accept-Language: en-US,en;q=0.5' --compressed -H 'X-CSRF-XSID: xZTyso9GzNQ5sMRarzmkCSJQAssA1WLUlk0Q5cwdPStiUJb0KlE+92EkFgVgroCVlMuOjcR8Rk6EIYCixMl53z+dCunTYwWs0Z76er0EvZPiSGIjCUtYi3BV0VS0OLq6sA32EIPfSDBE/xE5xa/3Uzovxo6Sc8OodurgbgxWGoE=' -H 'X-Requested-With: XMLHttpRequest' -H 'Connection: keep-alive' -H 'Referer: https://<ip_address>/html/sys_poe_port.html?aj4=2a08be6&bj4=9fa58c963a822462157cbfc45f82c702' -H 'Cookie: testcookie; cookie_language=defLang'
NetGear 使用 X-CSRF 令牌来更安全地抵御攻击。 This 大致描述了那是什么。所以我假设我需要以下内容来重新创建 URL:
-
cmd=poe_port&dummy=之后的值(每个新会话都有这个机会) - X-CRSF-XSID 令牌(遗憾的是,cookie 中没有这个令牌)
我是否必须自己运行任何 Javascript 才能访问 Selenium,或者如何自动下载功耗?
非常感谢任何帮助,我会为您提供任何缺失的信息。
感谢和问候,
勒内
在数据导出之前访问 NetGear 网络界面的代码。
from selenium import webdriver
from selenium.webdriver.common.by import By
profile = webdriver.FirefoxProfile()
profile.accept_untrusted_certs = True
options = webdriver.FirefoxOptions()
options.headless = True
driver = webdriver.Firefox(executable_path="/home/ubuntu/geckodriver", firefox_options=options, firefox_profile=profile)
driver.get("https://<ip_address>")
driver.find_element(By.ID, "password").send_keys(<password>)
driver.find_element(By.ID, "local_login").click()
driver.find_element(By.ID, "menu_fld2SysPoE").click()
driver.find_element(By.ID, "menu_fldAdv").click()
driver.find_element(By.ID, "menu_doc4SysPoEPort").click()
更新我
在 Raspberry Pi 上安装 npm 后,我安装了来自 Taisuke Yamada 的 gs310tp 包。您会找到包裹here。然后用.node_modules/gs310tp/bin/gs310tp.js -u https://<ip_address< -p <password> poe status 运行它。但是,这会产生错误(node:444693) UnhandledPromiseRejectionWarning: Error: self signed certificate。要禁用此消息,可以在之前运行export NODE_TLS_REJECT_UNAUTHORIZED='0'。但请注意,这会降低安全性。
一个包含 Javascript 的简单 Python 脚本如下所示
import subprocess
import re
p = subprocess.Popen(["./gs310tp.js", "-u https://ip", "-p SecurePassword", "poe", "status"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
p.wait()
out, err = p.communicate()
out = bytes.decode(out) # Convert from byte to string
# Conversion from string to dict is quite tricky and I dont need that so I used regex instead
out = out.replace('"', '')
out = out.replace("'", "")
voltage = re.findall("voltage: \d+", out)
ampere = re.findall("amphere: \d+", out)
power = re.findall("power: \d+", out)
【问题讨论】:
-
"pynetgear Python 脚本不适用于我的模型。" ——您是否调查过为 pynetgear 提供补丁以支持您的模型是否更容易?这可能会为您带来很多功能。
-
或者该项目的源代码可能有一些线索可以帮助您解决这个特定问题
-
这似乎是前进的最佳方式。我将对 pynetgear 包进行更深入的研究,并可能对其进行一些改进,因为监控每个端口的功耗对我来说至关重要。尽管如此,任何其他反馈仍然受到高度赞赏:)。
标签: python selenium networking router