【问题标题】:Scrape NetGear Switch GS752TPP Information with Python Selenium使用 Python Selenium 抓取 NetGear Switch GS752TPP 信息
【发布时间】: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:

  1. cmd=poe_port&dummy= 之后的值(每个新会话都有这个机会)
  2. 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://&lt;ip_address&lt; -p &lt;password&gt; 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


【解决方案1】:

我最近对 ​​NetGear GS310TP PoE 交换机进行了同样的自动化操作。 它使用“get.cgi”和“set.cgi”对进行管理,就像您的模型一样,因此两个模型可能共享相同的保护方法。

获取 X-CSRF-XSID 的密钥:是一个有点复杂的过程。

您首先必须使用 API (cmd=home_loginStatus API) 获取一次性临时密钥,在您提交正确密码后几秒钟(到 cmd=home_loginAuth API)。该key只能获取一次,多次获取会使认证状态失效。

这个临时密钥包含 2(或 3)个东西:

  1. 前 32 个字节:生成 X-CSRF-XSID 所需的未加密令牌:
  2. 接下来的 5 个字节:RSA 公钥数据(“e”参数)
  3. 剩余字节数:RSA 公钥数据(“n”参数)

使用一些兼容的 RSA 库,使用给定的 RSA 密钥加密 32 字节以上的令牌。 Base64 编码结果并将其设置为 X-CSRF-XSID: header,我很高兴。

进行“兼容”加密需要一些时间,而 openssl 对我来说并不奏效。我最终从 GS310TP 中获取了实际的 JavaScript 文件(rsa.js 及其依赖项)并使用 nodejs 在本地运行它。

GS310TP 还使用“aj4=”、“dummy=”和“bj4=”进行棘手的查询参数验证,但它很容易解决,因为您可以重放捕获的字符串或设置 URL 参数的 MD5 哈希值和将其附加为“bj4=”参数。

我确实有工作代码,但无法共享,因为它目前有我无法透露的硬编码参数。我希望这个描述足以让你继续前进!

【讨论】:

  • 非常感谢您的帮助。现在我只是在手动登录到 Python 请求后从网站解析 X-CSRF-XSID。这工作大约一天,直到它不再有效。对于我当前的用例,它很好,但这绝对不适合永久监控。所以我会试试你的方法:)。
  • 仅供参考,我发布了该工具。希望这可以帮助。 npmjs.com/package/gs310tp
  • 我终于有时间试用您的脚本了。非常感谢您发布您的结果。不幸的是我得到一个错误。我更新了我原来的问题。另外,您能否详细介绍一下如何“使用 API (cmd=home_loginStatus API) 获取一次性临时密钥”?
猜你喜欢
  • 2021-11-05
  • 2021-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-03
相关资源
最近更新 更多