Safariで表示中の全ページを指定したブラウザで一気に開くAppleScript

Safari4は正式版がリリースされた。Google ChromeMac版、Chrominum*1も着々とバージョンアップを重ねている。Firefoxも、3.5プレビュー版が出たようだ。その他にもMacで動作するwebブラウザは結構多い。OperaシイラiCab等々...。
で、実際にダウンロードして試してみるのだが、その時、いつも面倒に感じることがある。それは、常用しているSafariと同じページを多数開くのがとても面倒だということ。比較のため可能な限り同じページを開いて、いつもの感覚で操作してみたい。でも、タブを利用できるようになってから、Safariのタブは開きまくりである。別のブラウザで同じだけタブを開くのは結構しんどい。
色々、やり方はあると思うが、自分が思い付いた方法は以下。

  • URLをコピー&ペースト。(基本に忠実)
  • まとめてブックマークして、書き出して、クリックして開く。
  • 開発メニューを有効にして、「ページをこのアプリケーションで開く」メニューを活用する。(ショートカットを割り当てるとさらに便利)

どの方法もタブの数だけ操作を繰り返す必要があるところが、悩みどころ。理想は、1回の操作で全てのタブを一気に開いて欲しいのだ。いつものごとく、AppleScriptでやってみた。

openコマンドの活用

ターミナルで、openコマンドを実行すると、指定したアプリケーションで、指定した書類を開くことができる。以下のようにすると、はてなトップページと自分の日記の二つのページがSafariで開かれることになる。

open -a Safari 'http://www.hatena.ne.jp/' 'http://d.hatena.ne.jp/zariganitosh/'

URLはスペースで区切っていくつでも追加できるので、あとはSafariが開いているURLを取得できれば、目標は達成される。

全てのURLを取得する

Safariで表示中の全ページのURLは、以下のようにして取得することが出来た。


tell application "Safari"
activate
window 1's tab's URL --最前面のウィンドウのURL
windows's tab's URL --全てのURL
end tell

  • ウィンドウを指定(window 1's...)すれば、シンプルなリストが返ってきた。
{"http://www.hatena.ne.jp/","http://d.hatena.ne.jp/zariganitosh/"}
  • 複数のウィンドウを指定(windows's...)すると、上記リストが要素となった二重のリストになった。
{{"http://www.hatena.ne.jp/","http://d.hatena.ne.jp/zariganitosh/"},{"http://www.hatena.ne.jp/","http://d.hatena.ne.jp/zariganitosh/"}}

コード

あとは、openコマンドのURL指定の引数になるように変換すれば良いのだ。但し、以下の処理を追加する必要があった。

  • 空のURLリスト{}を含んでいることがある。削除してから処理することにした。
  • Safari4の新機能、Top Sitesのページは他のブラウザでは開けない。無視することにした。

最終的には以下のようになった。(Safari_to_Other.scpt)


(*
このスクリプトは、現在Safariで開いている全ページを、指定したブラウザで一気に開きます。 利用したいwebブラウザをアクティブにして、Safari_to_Other.scptを実行します。 全てのページを一つの新規ウィンドウを開いて表示します。 最前面のSafariウィンドウのみに限定することができます。(デフォルト) このスクリプトを動かすために必要なもの AppleScriptライブラリ 依存するAppleScriptライブラリを以下のページからダウンロードしておく必要があります。 http://github.com/zarigani/AppleScript-bebe-s-Library/tree/master
そして、以下のファイルをユーザースクリプトフォルダ(~/Library/Scripts)にインストールしてください。 _lib.scpt _gui.scpt *)
property GUI : load script file ((path to scripts folder as text) & "_gui.scpt")
property LIB : load script file ((path to scripts folder as text) & "_lib.scpt")

--実行時に最前面のアプリケーションを保存する
set app_name to GUI's frontmost_process()

--Safariで開いているページのリストを取得する
tell application "Safari"
activate
delay 0.5
set top_win to window 1
set tab_names to top_win's tab's name
set tab_names to "" & LIB's join(tab_names, return & "")
"Safariで表示中のページを、" & app_name & "で開きます。" & return & return & tab_names
display alert result buttons {"キャンセル", "全ウィンドウの全タブを開く", "最前面の上記タブのみ開く"} cancel button 1 default button 3 giving up after 30
if result's button returned = "最前面の上記タブのみ開く" then
set window_tab_urls to {top_win's tab's URL}
else if result's button returned = "全ウィンドウの全タブを開く" then
set window_tab_urls to windows's tab's URL
else
error number -128
end if
end tell

--空のリストとTop Siteを除外する
repeat with tab_urls in window_tab_urls
if tab_urls's number > 0 then
set tab_urls's contents to LIB's reject_if(tab_urls, "topsites://")
end if
end repeat
--さらに、Top Siteを除外した結果、空になったリストを除外する
set window_tab_urls to LIB's reject_if(window_tab_urls, {})

--シングルクォートしたスペース区切りのURLテキストを生成する
set url_options to "'" & LIB's join(window_tab_urls, "' '") & "'"
--中身が存在すれば新規ウィンドウを開いて表示する
if url_options ≠ "''" then
tell application app_name to activate
delay 0.5
GUI's shortcut("", "command-N")
delay 0.5
do shell script ("open -a " & quoted form of app_name & space & url_options)
end if

解決できない問題

Safariで表示中の全ページ → 任意のブラウザで開く」は可能になったが、その逆もできると便利なはず。でも、AppleScript非対応のブラウザが表示中の全URLは、どうやって取得すれば良いのだろう?

*1:最新バージョンは一番下の方に書いてある。