Pat*_*ook 3 ip desktop applescript dialog menubar
我有一个简短而甜蜜的程序,用AppleScript输出我的内部和外部ip.
这是Applescript代码:
set inIP to IPv4 address of (get system info)
set exIP to (do shell script "curl ipecho.net/plain")
display dialog "Internal: " & inIP & "
External: " & exIP
Run Code Online (Sandbox Code Playgroud)
我希望它能在后台不断更新,最好不要像现在那样在显示对话框功能中更新.
我不希望显示对话框不断弹出,所以我正在查找示例,在菜单栏中显示IP .
我不知道这是否可以与Applescript一起使用
从10.10开始(我想)你可以直接在脚本编辑器中使用ApplescriptOBJC创建真正的应用程序.
我之前没有真正尝试过,但是一旦开始它就比我想象的要容易.
将此代码粘贴到新的脚本编辑器Applescript文档中.
它保存为保持开放应用程序使用另存为...菜单选项.
然后将应用程序作为普通应用程序运行.
使用OP的原始AppleScript代码
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
property StatusItem : missing value
-- check we are running in foreground - YOU MUST RUN AS APPLICATION. to be thread safe and not crash
if not (current application's NSThread's isMainThread()) as boolean then
display alert "This script must be run from the main thread." buttons {"Cancel"} as critical
error number -128
end if
-- create an NSStatusBar
on makeStatusBar()
set bar to current application's NSStatusBar's systemStatusBar
set StatusItem to bar's statusItemWithLength:-1.0
-- set up the initial NSStatusBars title
StatusItem's setTitle:"IP"
end makeStatusBar
-- update statusBar
on displayIP(theDisplay)
StatusItem's setTitle:theDisplay
end displayIP
--repeat run update code
on idle
--get the IPs
set inIP to IPv4 address of (get system info)
set exIP to (do shell script "curl ipecho.net/plain")
set theDisplay to "Internal: " & inIP & " External: " & exIP
my displayIP(theDisplay)
return 30 -- run every 30 seconds
end idle
-- call to create initial NSStatusBar
my makeStatusBar()
Run Code Online (Sandbox Code Playgroud)
该应用程序设置为每30秒运行一次.它将使用您的ips更新菜单栏中的状态栏菜单.

我没有把任何错误检查并留给你.
还要记住,如果要在脚本编辑器中运行代码,请确保使用"运行应用程序".
更新:1 我已更改内部IP地址代码以使用NShost,这比" 获取系统信息 " 更快,可能更可靠
更新:2
更新外部代码以使用NSURL请求而不是Original Curl do shell脚本命令.
如果由于没有网络连接而无法获得外部IP地址等,则可以更容易地进行错误检查.
卷曲将返回一个完整的信息记录,说明它失败的原因,并且恕我直言.
更新了AppleScript代码
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
property StatusItem : missing value
-- check we are running in foreground - YOU MUST RUN AS APPLICATION. to be thread safe and not crash
if not (current application's NSThread's isMainThread()) as boolean then
display alert "This script must be run from the main thread." buttons {"Cancel"} as critical
error number -128
end if
-- create an NSStatusBar
on makeStatusBar()
set bar to current application's NSStatusBar's systemStatusBar
set StatusItem to bar's statusItemWithLength:-1.0
-- set up the initial NSStatusBars title
StatusItem's setTitle:"IP"
end makeStatusBar
-- update statusBar
on displayIP(theDisplay)
StatusItem's setTitle:theDisplay
end displayIP
--repeat run update code
on idle
--get the IPs
set stringAddress to ""
--use NSHost to get the Internal IP address
set inIPAddresses to current application's NSHost's currentHost's addresses
--work through each item to find the IP
repeat with i from 1 to number of items in inIPAddresses
set anAddress to (current application's NSString's stringWithString:(item i of inIPAddresses))
set ipCheck to (anAddress's componentsSeparatedByString:".")
set the Counter to (count of ipCheck)
if (anAddress as string) does not start with "127" then
if Counter is equal to 4 then
set stringAddress to anAddress
-- found a match lets exit the repeat
exit repeat
end if
else
set stringAddress to "Not available"
end if
end repeat
-- Get extenal IP
set anError to missing value
set iPURL to (current application's NSURL's URLWithString:"http://ipecho.net/plain")
set NSUTF8StringEncoding to 4
set exIP to (current application's NSString's stringWithContentsOfURL:iPURL encoding:NSUTF8StringEncoding |error|:anError) as string
if exIP contains missing value then
set exIP to "Not available"
end if
set theDisplay to "Intl: " & stringAddress & " Extnl: " & exIP
--call to update statusBar
my displayIP(theDisplay)
return 30 -- run every 30 seconds
end idle
-- call to create initial NSStatusBar
my makeStatusBar()
Run Code Online (Sandbox Code Playgroud)
更新3
这个将按照OP在评论中提到的那样做.
它现在有一个下拉菜单,有两个选项外部或内部.
选择一个或另一个菜单项将更改状态栏以显示所选的IP.
最后一个很快就被扔到了一起,所以它并不漂亮.:-)
(更新4 它还会保留退出应用程序并重新启动的选择.)

新代码:
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
use framework "AppKit"
property StatusItem : missing value
property selectedMenu : "" -- each menu action will set this to a number, this will determin which IP is shown
property theDisplay : ""
property defaults : class "NSUserDefaults"
-- check we are running in foreground - YOU MUST RUN AS APPLICATION. to be thread safe and not crash
if not (current application's NSThread's isMainThread()) as boolean then
display alert "This script must be run from the main thread." buttons {"Cancel"} as critical
error number -128
end if
-- create an NSStatusBar
on makeStatusBar()
set bar to current application's NSStatusBar's systemStatusBar
set StatusItem to bar's statusItemWithLength:-1.0
-- set up the initial NSStatusBars title
StatusItem's setTitle:"IP"
set newMenu to current application's NSMenu's alloc()'s initWithTitle:"Custom"
set internalMenuItem to current application's NSMenuItem's alloc()'s initWithTitle:"Internal" action:"showInternal:" keyEquivalent:""
set externalMenuItem to current application's NSMenuItem's alloc()'s initWithTitle:"External" action:"showIExternal:" keyEquivalent:""
StatusItem's setMenu:newMenu
newMenu's addItem:internalMenuItem
newMenu's addItem:externalMenuItem
internalMenuItem's setTarget:me
externalMenuItem's setTarget:me
end makeStatusBar
--Show Internal ip Action
on showInternal:sender
defaults's setObject:"1" forKey:"selectedMenu"
my runTheCode()
end showInternal:
--Show External ip Action
on showIExternal:sender
defaults's setObject:"2" forKey:"selectedMenu"
my runTheCode()
end showIExternal:
-- update statusBar
on displayIP(theDisplay)
StatusItem's setTitle:theDisplay
end displayIP
on runTheCode()
set stringAddress to ""
--use NSHost to get the Internal IP address
set inIPAddresses to current application's NSHost's currentHost's addresses
--work through each item to find the IP
repeat with i from 1 to number of items in inIPAddresses
set anAddress to (current application's NSString's stringWithString:(item i of inIPAddresses))
set ipCheck to (anAddress's componentsSeparatedByString:".")
set the Counter to (count of ipCheck)
if (anAddress as string) does not start with "127" then
if Counter is equal to 4 then
set stringAddress to anAddress
-- found a match lets exit the repeat
exit repeat
end if
else
set stringAddress to "Not available"
end if
end repeat
-- Get extenal IP
set anError to missing value
set iPURL to (current application's NSURL's URLWithString:"http://ipecho.net/plain")
set NSUTF8StringEncoding to 4
set exIP to (current application's NSString's stringWithContentsOfURL:iPURL encoding:NSUTF8StringEncoding |error|:anError) as string
if exIP contains missing value then
set exIP to "Not available"
end if
set selectedMenu to (defaults's stringForKey:"selectedMenu") as string
if selectedMenu is "" or selectedMenu contains missing value then
set selectedMenu to "1"
end if
if selectedMenu is "1" then
set theDisplay to "Intl: " & stringAddress
else if selectedMenu is "2" then
set theDisplay to " Extnl: " & exIP
end if
--call to update statusBar
my displayIP(theDisplay)
end runTheCode
--repeat run update code
on idle
my runTheCode()
--my displayIP(theDisplay)
return 30 -- run every 30 seconds
end idle
-- call to create initial NSStatusBar
set defaults to current application's NSUserDefaults's standardUserDefaults
my makeStatusBar()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
934 次 |
| 最近记录: |