如何编写从路由器的Web界面下载Wi-Fi网络状态的AppleScript?


3

目标:

我想创建一个AppleScript .scpt文件来执行以下操作:

  1. 访问路由器的网页(即其IP地址)。

  2. 从此网页中获取当前连接到两个网络的IP地址。(通过“两个网络”,我指的是单独的2.4Ghz和5.0Ghz无线网络。)

  3. 从网页中获取每个连接设备的相应Dbm信号强度(即,每个连接的IP地址)。


执行:

我想要一个AppleScript list对象包含所有IP地址:

  • 例如:theListOfIPs包含{"192.168.0.1", "192.168.0.", "192.168.0.3", "192.168.0.4", "192.168.0.5", "192.168.0.6.", "192.168.0.7"}

(我不需要区分连接到2.4GHz网络的IP和连接到5.0GHz网络的IP。所有IP都应该包含在内theListOfIPs。)

并且,一个AppleScript list对象包含其相应的信号强度:

  • 例如:theListOfTheirSignalStrengths包含{"0", "-75", "-40", "0", "0", "-63", "-72"}

笔记:

  • 我希望所有这些都能在“幕后”完成。不引人注意是关键,因为脚本需要定期检查路由器的网站以获取网络更新。

  • 最终,对网络状态的更改将写入.txt日志文件,并在满足特定条件时显示警报通知。我知道如何编写这些组件的代码; 我需要帮助实际将数据导入脚本。

  • 选择的浏览器:谷歌浏览器


背景:

我之前使用过shell命令,curl以便将给定网站的未删节HTML源代码导入到AppleScript中作为text对象。我理解,遗憾的是,无法将所有JavaScript元素作为单个文本对象同样或方便地转换为AppleScript。

相反,必须得到每一个JavaScript的元素独立,一些标识,喜欢它的idclasstag,或name。这会使事情变得更复杂(因为您不能简单地解析AppleScript中的所有内容)。

通过使用Chrome的Inspect功能,以及Elements窗格 Chrome的JavaScript控制台,我已经确定相应的JavaScript标识符。包含所有IP地址的两个JavaScript元素ID以及它们的信号强度是wifi-24wifi-5

有人可以教我如何正确编写必要的JavaScript代码,然后解析生成的HTML文本,以隔离我想要的基本网络数据吗?



问题是所需的URL位于用户名/密码页面后面。如果我在这里粘贴了URL,那对你来说就毫无意义了。
魔芋的球体

好的。我没有要求定制解决方案。我只是想知道这是否可能,如果是,那就是如何处理它的一般概念。这是我的问题的更直接版本:是否可以从网站中删除所有 JavaScript元素?您的评论让我相信这个问题的答案因站点而异,但我不明白为什么答案会有所不同。这不是一个是/否的问题?
魔方球队于2012年

你的问题到处都是。对的,这是可能的。如果没有您感兴趣的网站的实际示例.js抓取,没有一个适合所有方法的AppleScript。
肯尼迪先生

@Kennedy先生你能指出我正确的方向,所以我可以开始学习这个吗?完成此任务的相关命令是什么?我不知道从哪里开始。
魔方球队

要刮掉所有的javascript,你需要学习html和javascript如何协同工作。查看源HTML - 查找*.js文件。动态页面会出现更多问题。从一个简单的html / JS小例子开始,构建你的AppleScript。然后找出更复杂的HTML / JS情况并开发适合它们的工具。
肯尼迪先生

Answers:


3

根据讨论情况,这应该处理问题的原始范围。

注意:这是示例代码,并且不包含太多(如果有)错误处理。我将把它留给你,因为这只是整个剧本的一部分,一旦你将所有其他部分组合在一起。

--  # 
--  #   Get the target information from theTargetURL in Google Chrome.
--  #   
--  #   Do this in the background, so get the 'tab id' and 'window id' of
--  #   the target URL ('theTargetURL') if it exists, and process accordingly. 

set theTargetURL to "http://192.168.1.1/0.1/gui/#/"

tell application "Google Chrome"
    if running then
        set theWindowList to every window
        repeat with thisWindow in theWindowList
            set theTabList to every tab of thisWindow
            repeat with thisTab in theTabList
                if theTargetURL is equal to (URL of thisTab as string) then

                    --  #   Get the targeted content of the web page which contains the information.
                    --  #   Note that document.getElementById(elementID) can only query one
                    --  #   element at a time, therefore call it twice, once with each elementID.

                    set rawWiFi24HTML to thisTab execute javascript "document.getElementById('wifi-24').innerHTML;"
                    set rawWiFi5HTML to thisTab execute javascript "document.getElementById('wifi-5').innerHTML;"

                    tell current application

                        --  #   Process the 'rawWiFi24HTML' and 'rawWiFi5HTML' variables.
                        --  #   Setup some temporary files to handle the processing.

                        set rawHTML to "/tmp/rawHTML.tmp"
                        set rawIP to "/tmp/rawIP.tmp"
                        set rawDBM to "/tmp/rawDBM.tmp"

                        --  #   Combine the value of  the'rawWiFi24HTML' and 'rawWiFi5HTML' variables into the 'rawHTML' temporary file.

                        do shell script "echo " & quoted form of rawWiFi24HTML & " > " & rawHTML & "; echo " & quoted form of rawWiFi5HTML & " >> " & rawHTML

                        --  # Process the 'rawHTML' into the 'rawIP' and 'rawDBM' temporary files.
                        --  # These files will contain comma delimited content of the targeted info.

                        do shell script "grep 'IP:' " & rawHTML & " | sed -e 's:</span>.*$::g' -e 's:^.*>::g' | tr '\\12' ',' > " & rawIP & "; grep 'device.parsedSignalStrength' " & rawHTML & " | sed -e 's: dBM.*$::g' -e 's:^.*\"::g' | tr '\\12' ',' > " & rawDBM

                        -- Process 'rawIP' and 'rawDBM' temporary files into 'theIPAddressList' and 'theSignalStrengthList' lists.

                        set theIPAddressList to my makeListFromCSVFile(rawIP)
                        set theSignalStrengthList to my makeListFromCSVFile(rawDBM)

                        --  #   Clean up, remove temporary files.

                        do shell script "rm /tmp/raw*.tmp"

                    end tell

                end if
            end repeat
        end repeat
    end if
end tell

--  # Handler used to create a list from a CSV file.

on makeListFromCSVFile(thisFile)
    set thisFilesContents to (read thisFile)
    set AppleScript's text item delimiters to {","}
    set thisList to items 1 thru -2 of text items of thisFilesContents as list
    set AppleScript's text item delimiters to {}
    return thisList
end makeListFromCSVFile




--  #########################################
--  #   
--  #   Checking the output of the code:
--  #   
--  #   The following commands are here just to show the contents
--  #   of the two lists displayed in a default list box, and then a way 
--  #   both lists might be combined, the output of which is logged.
--  #   
--  #   This of course can be removed after testing is finished.
--  #   
tell current application
    --  #
    choose from list theIPAddressList & theSignalStrengthList
    --  #
    repeat with i from 1 to (count of theIPAddressList)
        log "IP: " & item i of theIPAddressList & " @ " & item i of theSignalStrengthList & " Dbm"
    end repeat
    --  #
end tell
--  #   
--  #########################################

我不得不说,一般来讲,一个是不应该有一样的工具来解析HTML grepsed,但是,对于某些网页,像这种使用情况下,它是很安全的事情。虽然,如果它破裂,它并不难修复。


当我将您的代码合并到我的大型脚本中时,我收到了错误:Can’t make current application into type file.。我意识到我的脚本中的以下行负责错误:use framework "Foundation"。在我将您的行更改(read POSIX file thisFile)(read POSIX path of thisFile)或仅仅是(read thisFile),您的代码现在在我的脚本中正常运行,没有错误。
魔方球队于2012年

是的,这就是为什么我说“注意:这是示例代码 ...”,因为如果您按原样获取代码并将其作为脚本编辑器中的唯一代码复制到脚本编辑器中的新文档中,它可以工作,但是一开始整合来自其他来源的代码,必然会有需要解决的问题。
3439894

它只是我,还是最终列表对象的嵌套版本?也就是说,如果你return theIPAddressList或你return theSignalStrengthList,你会看到item x任何一个列表(列表中x的任何项目),实际上是所需的列表本身。如果您使用choose from list,这种特性将被掩盖,但如果您使用,您可以看到真正的列表内容return这是截图
魔方的球体

@ rubik的球体,我已经更改了代码以创建逗号分隔的临时文件以及将这些文件的内容转换为所需列表的方式。
3439894

你写道,“一般来说,不应该使用像grep和sed这样的工具来解析HTML。” 你能解释一下这是为什么吗?解析HTML文本的替代方法是什么?
魔方的球体

0
  1. 转到Chrome浏览器中的网页。
  2. 打开Dev Tools的JavaScript浏览器。
  3. 将其粘贴在控制台中并按Enter键:

 

$('script').each(function(){
    console.log($(this).html())
});

我遵循了这些指示。我应该寻找什么或下一步是什么?谢谢。
魔方球队

你至少可以记录而不是提醒,这只是痛苦的。
警报器于

@Sirens你去。我的主要观点是证明OP的方向是错误的。根据聊天室的谈话,他们找到了更好的方法。
肯尼迪先生
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.