使用 Python Selenium 抓取 NetGear Switch GS752TPP 信息
Scrape NetGear Switch GS752TPP Information with Python Selenium
我正在为一个项目使用型号为 GS752TPP 的 NetGear 交换机。该模型能够提供以太网供电,我想通过网络界面自动抓取该信息,因为没有 API 存在。我需要随时间推移连接设备的功耗。请参阅以下图片以获得更好的理解:NetGear Switch Power Monitoring Table
pynetgear Python 脚本不适用于我的模型。
我正在使用 Python Selenium 打开无头 Firefox 来访问网络界面。我可以将我的密码发送到相应的字段,登录并单击我的方式进入正确的选项卡(下面的代码)。我可以在 table 中看到数据,但在 HTML 中看不到。我无法通过 CSS 或 xpath 访问字段。为了找到正确的 CSS 或 xpath,我使用了 Firefox 的 Selenium IDE 插件。
检查网站网络后,我找到了正确的请求,returns 我需要的数据:
URL
https://<ip_address>/cgi/get.cgi?cmd=poe_port&dummy=1612446184975&bj4=07e0349a9b364bf17177eafe167deaa6
cURL
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 令牌来更安全地抵御攻击。 大致描述了那是什么。所以我假设我需要以下内容来重新创建 URL:
cmd=poe_port&dummy=
之后的值(每个新会话都有这个机会)
- X-CRSF-XSID 令牌(不幸的是,cookie 中没有)
我是否必须自己 运行 任何 Javascript vis Selenium 或如何自动下载功耗?
非常感谢任何帮助,我会为您提供任何缺失的信息。
感谢和问候,
René
访问 NetGear web 界面直到数据导出的代码。
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)
我最近为 NetGear GS310TP PoE 交换机做了同样的自动化。
它使用一对“get.cgi”和“set.cgi”进行管理,就像您的模型一样,因此两个模型可能共享相同的保护方法。
获取 X-CSRF-XSID 的密钥:是一个有点复杂的过程。
您首先必须使用 API (cmd=home_loginStatus API) 获得 one-time 临时密钥,在您提交正确的密码后几秒钟(到 cmd =home_loginAuth API)。此密钥只能获取一次,如果多次获取将导致身份验证状态无效。
这个临时密钥包含 2(或 3)个东西:
- 前 32 个字节:生成所需的未加密令牌 X-CSRF-XSID:
- 接下来的 5 个字节:RSA public 密钥数据(“e”参数)
- 剩余字节:RSA public 密钥数据(“n”参数)
使用一些兼容的 RSA 库,使用给定的 RSA 密钥加密 32 字节以上的令牌。对结果进行 Base64 编码并将其设置为 X-CSRF-XSID: header 我很高兴。
进行“兼容”加密需要一些时间,而 openssl 对我来说没有用。我最终从 GS310TP 中获取了实际的 JavaScript 文件(rsa.js 及其依赖项),并使用 nodejs 在本地 运行 它。
GS310TP 还使用“aj4=”、“dummy=”和“bj4=”进行棘手的查询参数验证,但它很容易变通,因为您只需重放捕获的字符串或设置 URL 参数并将其附加为“bj4=”参数。
我有工作代码,但不能分享,因为它目前有我不能透露的硬编码参数。我希望这个描述足以让你继续前进!
我正在为一个项目使用型号为 GS752TPP 的 NetGear 交换机。该模型能够提供以太网供电,我想通过网络界面自动抓取该信息,因为没有 API 存在。我需要随时间推移连接设备的功耗。请参阅以下图片以获得更好的理解:NetGear Switch Power Monitoring Table
pynetgear Python 脚本不适用于我的模型。
我正在使用 Python Selenium 打开无头 Firefox 来访问网络界面。我可以将我的密码发送到相应的字段,登录并单击我的方式进入正确的选项卡(下面的代码)。我可以在 table 中看到数据,但在 HTML 中看不到。我无法通过 CSS 或 xpath 访问字段。为了找到正确的 CSS 或 xpath,我使用了 Firefox 的 Selenium IDE 插件。
检查网站网络后,我找到了正确的请求,returns 我需要的数据:
URL
https://<ip_address>/cgi/get.cgi?cmd=poe_port&dummy=1612446184975&bj4=07e0349a9b364bf17177eafe167deaa6
cURL
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 令牌来更安全地抵御攻击。
cmd=poe_port&dummy=
之后的值(每个新会话都有这个机会)- X-CRSF-XSID 令牌(不幸的是,cookie 中没有)
我是否必须自己 运行 任何 Javascript vis Selenium 或如何自动下载功耗?
非常感谢任何帮助,我会为您提供任何缺失的信息。
感谢和问候,
René
访问 NetGear web 界面直到数据导出的代码。
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)
我最近为 NetGear GS310TP PoE 交换机做了同样的自动化。 它使用一对“get.cgi”和“set.cgi”进行管理,就像您的模型一样,因此两个模型可能共享相同的保护方法。
获取 X-CSRF-XSID 的密钥:是一个有点复杂的过程。
您首先必须使用 API (cmd=home_loginStatus API) 获得 one-time 临时密钥,在您提交正确的密码后几秒钟(到 cmd =home_loginAuth API)。此密钥只能获取一次,如果多次获取将导致身份验证状态无效。
这个临时密钥包含 2(或 3)个东西:
- 前 32 个字节:生成所需的未加密令牌 X-CSRF-XSID:
- 接下来的 5 个字节:RSA public 密钥数据(“e”参数)
- 剩余字节:RSA public 密钥数据(“n”参数)
使用一些兼容的 RSA 库,使用给定的 RSA 密钥加密 32 字节以上的令牌。对结果进行 Base64 编码并将其设置为 X-CSRF-XSID: header 我很高兴。
进行“兼容”加密需要一些时间,而 openssl 对我来说没有用。我最终从 GS310TP 中获取了实际的 JavaScript 文件(rsa.js 及其依赖项),并使用 nodejs 在本地 运行 它。
GS310TP 还使用“aj4=”、“dummy=”和“bj4=”进行棘手的查询参数验证,但它很容易变通,因为您只需重放捕获的字符串或设置 URL 参数并将其附加为“bj4=”参数。
我有工作代码,但不能分享,因为它目前有我不能透露的硬编码参数。我希望这个描述足以让你继续前进!