2011/06/18

Applescriptで特定の場所にいるときだけ特定のアプリケーションを起動する方法

久しぶりの更新になりますが,またもやPC関連の話.


結論を先に書いておくと,
つないでいるWi-Fiの情報から今いる場所を判断して,
ロケーション毎に好きな挙動を取らせるAppleScriptを作りました
という話.





とりあえず,どういうモチベーションから始まった話かという話から.

最近,Growlを使ってディスプレイの隅に
TwitterのTweetを流すように変更しまして,
これはこれでTwitterがつぶやき感を取り戻した感じでいいなぁ
と思っていました.

ここのところリストばかり使って,
普通のフォロワーのTweetを見なくなってきていたので...


ただ,この難点が,
ワークタイムにもGrowlのポップアップが出るので,
気が散って仕方がないという点.
っていうかちょっと不謹慎で罪悪感ある.

そこで,何とかワークタイムの時間帯だけ
Twitterのクライアントを自動でオフにすることはできないもんか
と考えました.


いろいろ探してみたんだけど,
これが意外と難しい.

例えば,time zone launcherというアプリは
曜日の指定ができないし,
CronniXというのは
切り替えの時刻にスリープしているとオンオフできない.
CronniXで10分ごとに時刻を確認するというのも考えたけど,
あんまりスマートとは言えない.



こまった...
自分で作るしかないかなと考えていると,ふと気づく.
そもそも時間帯で分けるって方法が不便なんじゃないか?

だいたい,ワークタイムが何時までかなんて,
日によって全然違う.
遅めのミーティングのときに,
いきなりTweetが流れ出したらまずい...


さらに気づく.
っていうか,つないでるWi-Fiの情報使えば,
今どこにいるかわかるし!!


軽く探して,やはりこういうアプリもなさそうなので,
結局自分で作ることに.


まずは今つないでるWi-Fiの情報を得る方法.
AppleScriptでシステム関連の情報を得るには


(get system info)


なるものを使えばいいらしい.
これで


IPv4 address of (get system info)


とすれば,IPアドレスが判別できるけど,
時々変わるしスマートじゃない.
他にも以下のような使い方ができるらしいが,
ネットワーク名(SSID)とかはなさそう.


system version of (get system info)
primary Ethernet address of (get system info)
long user name of (get system info)
short user name of (get system info)
CPU type of (get system info)
AppleScript Studio version of (get system info)
AppleScript version of (get system info)
user ID of (get system info)
user locale of (get system info)
home directory of (get system info)
boot volume of (get system info)
computer name of (get system info)
host name of (get system info)
CPU speed of (get system info)
physical memory of (get system info)


さらに探すと,シェルで,


/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport --getinfo


とかやると以下のようなネットワーク名を含む情報を得られるらしい.


     agrCtlRSSI: -48
     agrExtRSSI: 0
    agrCtlNoise: -92
    agrExtNoise: 0
          state: running
        op mode: station 
     lastTxRate: 117
        maxRate: 130
lastAssocStatus: 0
    802.11 auth: shared
      link auth: unknown
          BSSID: 0:22:cf:2f:e:49
           SSID: <ネットワーク名>
            MCS: 14
        channel: 4



AppleScriptからシェルを使うことにして,
以下のAppleScriptを組んでみた.


set ssid to (do shell script "/System/Library/PrivateFrameworks/Apple80211.framework/Versions/A/Resources/airport --getinfo")
if ssid contains "<ネットワーク名>" then
tell application "<アプリケーション名>" to launch
else
tell application "<アプリケーション名>" to quit
end if


内容的には
シェルからネットワーク名を含む情報を得て,
変数ssidに格納.
そこに<ネットワーク名>が含まれれば,
<アプリケーション名>をバックグラウンドで立ち上げ.
含まれなければ終了.
という感じ.


これをCronniXで適当な間隔毎に起動すればOK(osascriptコマンドを使う).
この点はあんまりスマートじゃない.
スリープからの復帰をトリガーにするとか考えたけど難しいみたい.


条件分岐の中身をいじれば,
もっとおもしろいことがいろいろできそう.
満足.


0 件のコメント:

コメントを投稿