Archive for the 'Safari' Category

04/21 Safariの最前面のWindowの内容を1枚もののPDFにレンダリングしてデスクトップへ

Safariでオープン中の最前面のWindowの内容をデスクトップにPDF出力するAppleScriptです。

Web関係の仕事をすると、地味に必要になってくる「指定ページを1枚ものの画像にまとめた」PDF。Keynoteの書類などに貼り付けてページ遷移の説明を行ったりするのは、よくある話です。

Safariの最前面のWindowでオープン中のURLを取得し、CLI Webレンダラー「Wkpdf」でPDFにレンダリング出力します。

safario.png

その際に、ファイル名は日付をもとに生成。1枚ものの「長いPDF」として出力するためにWkpdfのレンダリングオプションを指定してページネーションを抑止したり、背景画像の表示をイネーブルにしたりと、見所はそのぐらいで、あとはたいしたことのないあっさりとした処理ばかりです。

Script Menuに入れて使うと便利です。ただ、使用頻度は人によって個人差がありそうなので、実用性がきわめて高い便利なScriptの割には忘れ去られそうな可能性も(自分でも、作っていたことを忘れていました)。

Wkpdf自体のインストールについては、Terminalからコマンドを叩いて行っておく必要がありますが、たいして難しくないので大丈夫でしょう。

スクリプト名:最前面のWindowの内容を1枚もののPDFにレンダリングしてデスクトップへ
tell application “Safari”
  set wCount to count every window
  
if wCount < 1 then
    display dialog “Windowが存在しません” buttons {“OK”} default button 1
    
return
  end if
  
  
tell window 1
    set aInfo to properties
  end tell
  
  
set aDoc to document of aInfo
  
  
tell aDoc
    set aURL to URL
  end tell
  
end tell

set aFileName to “webOut” & (do shell script “date +%Y%m%d%H%M%S”)
renderURLtoPDF(aURL, aFileName) of me

on renderURLtoPDF(aURL, aFileName)
  set s1Text to “cd ~/Desktop && “
  
set outPath to POSIX path of (path to desktop) & aFileName & “.pdf”
  
  
set s2Text to “wkpdf –source “ & aURL & ” –paginate false –print-background –output “ & outPath
  
  
set sAll to s1Text & s2Text
  
do shell script sAll
end renderURLtoPDF

(*
–指定URLの内容をレンダリングしてPDFに書き出す
on renderURLtoPDF(aURL, aFileName)
  set dDir to POSIX path of (path to desktop from user domain)
  set outFile to dDir & aFileName & “.pdf”
  try
    do shell script “cd /usr/local/bin && /usr/local/bin/coral -f PDF -o ” & quoted form of outFile & ” ” & aURL & ” &”
  on error
    return false
  end try
  –return outFile
end renderURLtoPDF
*)

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

04/21 iPhoto, iTunes, Safariアップデートについて

iPhoto 9.2.3、iTunes 10.6.1、Safari 5.1.5の各アップデートが提供されていますが、これらのアプリケーションのAppleScript用語辞書に変更はありません。

03/27 Safari 5.1.5でAppleScript用語辞書に変更なし

本日ソフトウェア・アップデートから配布されたSafari 5.1.5のAppleScript用語辞書を確認したところ、とくに前バージョンとの差異は検出されませんでした。

………………………………Safari 5.1.5で「www.apple.co.jp」を表示させると、ちゃんと「www.apple.com/jp」にリダイレクトされるようですが……目の錯覚でしょうか。それとも、サーバーの転送設定が修正されたのでしょうか。

03/14 Safari 5.1.4 AppleScript用語辞書に変更なし

Safariの5.1.4アップデートがリリースされましたが、AppleScript用語辞書に変更はありませんでした。

12/10 SafariでNHKのラジオ局を選局する

Safariで指定のNHKラジオ局をオープンするAppleScriptです。

NHKが行っているインターネットストリーミングラジオ放送「らじる★らじる」のURLをオープンし、ページ内のJavaScriptを呼び出してラジオ局の切り換えを行います。この手の処理の「お約束」で、サイト側の構成が変わった場合には修正を行う必要があります。

radiko1.jpg

自分で使うためだけに作ったRadikoの録音用アプリ(AppleScriptObjCで作成)に、NHKラジオの録音用機能を追加するために作成したものです。

radiko3.jpg

居間でテレビにつないだMac miniが、本アプリケーションを毎週実行してラジオを録音しています。QuickTime Playerの問題で、たま〜に録音を失敗するのがご愛嬌ですが…………。

radiko2.jpg

Safariをコントロールしてラジオ局の放送を聴取し、システムの設定を変更してQuickTime Player X経由で録音を行うものです。

スクリプト名:SafariでNHKのラジオ局を選局する

–set rRes to openNHKstations(”r1″) of me –NHK第一
–set rRes to openNHKstations(”r2″) of me –NHK第二
set rRes to openNHKstations(“fm”) of me –NHK-FM

–NHKのラジオ局を選局する
on openNHKstations(aStation)
  try
    tell application “Safari”
      close every document
      
set nDoc to make new document with properties {URL:“http://www3.nhk.or.jp/netradio/”}
      
      
page_loaded(10) of me
      
      
do JavaScript “RRopen(’” & aStation & “‘);” in document 1
    end tell
    
    
return true
    
  on error
    return false
  end try
end openNHKstations

on page_loaded(timeout_value)
  delay 2
  
repeat with i from 1 to the timeout_value
    tell application “Safari”
      if (do JavaScript “document.readyState” in document 1) is “complete” then
        return true
      else if i is the timeout_value then
        return false
      else
        delay 1
      end if
    end tell
  end repeat
  
return false
end page_loaded

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

12/03 Safari 5.1.2、AppleScript用語辞書に変更なし

2011.12.1にSafari 5.1.2がソフトウェアアップデートから入手可能になっていましたが、AppleScript用語辞書に変更はありませんでした。

10/13 Safari 5.1.1、iPhoto 9.2が登場。AppleScript用語辞書に変更なし

Safari 5.1.1とiPhoto 9.2アップデートが登場しました。また、Mac OS X 10.7.2のアップデートも登場しています。iOS5のアップデートも出てはいるものの、まだアップデートサーバーとつながらずアップデートできず……。

Safari 5.1.1とiPhoto 9.2については前バージョンであるSafari 5.1とiPhoto 9.1.5からAppleScript用語辞書の内容に変更がないことを確認しました。

07/23 Safari 5.1でWeb検索

Safari 5.1で追加になった検索命令を用いて、Safari経由で現在指定中のサービスプロバイダ(Google/Yahoo!/Bingのうちいずれか)でWebのキーワード検索を行うAppleScriptです。

とりあえず検索するよう最低限のコードを書いて実験。あまり期待はしていませんでしたが、Webの検索結果をAppleScriptで利用しやすいようにRecord形式にparseして返すとかいうことは一切ありません。ただSafariの画面上に表示されるだけです。表示内容のソースコードを取得して自前で解析しないとRecord形式で検索結果が返ってきたりはしません。

キーワードだけ指定してただ検索すると、新規ウィンドウがオープンしてそこに結果が表示されます。

スクリプト名:Safari 5.1でWeb検索1
set aKeyword to "ぴよまる"

tell application "Safari"
  set aVer to version as number –バージョン番号
  
if aVer < 5.1 then return
  
  
search the web for aKeyword
  
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

現在オープン中のウィンドウに対して検索結果を表示してほしい場合には、このように指定すれば大丈夫です。ウィンドウの中のTabを指定します。

スクリプト名:Safari5.1でWeb検索2
set aKeyword to "ぴよまる"

tell application "Safari"
  tell window 1
    set curTab to current tab
    
search the web for aKeyword in curTab –検索結果を表示するTabを指定
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

07/23 Safari 5.1でreading listを登録

Safari 5.1でリーディングリスト(reading list)を登録するAppleScriptです。

safa10.jpg

Safari 5.1の、「とりあえずURLをメモっておいてあとで読もう」というリーディングリスト機能。Mac上のSafariだけだとピンと来ませんが、Mac上でとりあえずURLをリーディングリストに入れておくと、iCloud経由で他のiOSデバイス(あるいはその逆)とシンクロされて、職場でメモっておいたURLを移動中にiPhoneやiPadで読む、という使い方が可能になるものです。

iOSデバイスとの自動シンクロはiOS 5の登場を待たなければなりませんが、「AppleScriptでいつも購読しているメールマガジンの本文中のURLを一括でリーディングリストに登録する」といったAppleScriptを用意しておけば、iOS5が登場する頃には便利な状態になっていることでしょう(URLリストの同期だけでなく、コンテンツのローカル保存&シンクロを行ってくれた方がよさそうな……そういうのはEvernoteなどのサービスの領分なんでしょうか)。

safa11.jpg

一番左に表示されているメガネのマークがリーディングリストのボタン。

safa12.jpg

メガネのボタンを押して、リーディングリストを展開した状態。

ここで、AppleScriptからリーディングリストを追加すると、このようになります。

safa13.jpg

文字のサムネイルが若干表示されていますが、メニュー部分なので本文の要約にはなっていません。ちょっとこのあたりがいまひとつ……

タイトルも指定どおりにはなっていませんね。自分たちでAppleScript用語辞書に書いたとおりに動作しないというのは、何事なんでしょう?(ーー;

safa14.jpg

スクリプト名:Safari 5.1でreading listを登録1
set aURL to “http://piyocast.com/as/”

tell application “Safari”
  set aVer to version as number –バージョン番号
  
if aVer < 5.1 then return
  
  
add reading list item aURL with title “AppleScriptの穴”
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

リーディングリストのプレビューテキストを指定しないといまひとつなので、明示的に登録してみました。

が……

safa14.jpg

指定しても、preview textは効きませんね。何をどう指定しても任意の文字が表示されたりはしません。これも、AppleらしいといえばAppleらしい……………(←ほめてない)。

スクリプト名:Safari 5.1でreading listを登録2
set aURL to “http://piyocast.com/as/”
set aPrevText to “AppleScriptの実践的なコードを掲載しているブログです。”

tell application “Safari”
  set aVer to version as number –バージョン番号
  
if aVer < 5.1 then return
  
  
add reading list item aURL and preview text aPrevText with title “AppleScriptの穴”
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

07/23 Safari 5.1でAppleScript用語が追加に

Safari 5.1でいくつか機能が追加され、ひさしぶりにAppleScript用語辞書が更新されました。ここのところ、AppleScript用語が追加されたことはなかったので、本当に久しぶりです。

そのうちのひとつ、「リーディングリストの追加」はコマンド名「add reading list item」。追加のみで削除や書き換えのための命令はありません。

safa1.jpg

また、現在指定の検索プロバイダ(GoogleとかBingとか)を用いてWeb検索を行う「search the web」コマンドが追加されました。

safa2.jpg

返り値はとくにありません。このあたりでListやrecordにparseされた結果が返ってきたら感心したのですが、さすがにそこまでやらないのがAppleらしいといえばAppleらしい(←ほめてない)ところです。

その他、指定のタブの内容をメールで送信する(コンテンツを新規メールに入れるだけ)の命令「email contents」が若干変更に。これは、マイナーチェンジという程度の変更です。

10/07 GUI ScriptingでWebコンテンツを操作

GUI Scriptingでできることは、Mac OS Xのバージョンアップとともに、徐々に広がりを見せつつありますが……実際に試してみて「ついにここまで来たか」と驚かされました。

思えば、Safari自体もバージョンアップにともなって、アクセシビリティ系の機能が向上。このあたりは、読み上げなどの機能がアップしたぐらいにしか考えていなかったのですが……よくよく考えると、アクセシビリティ系の機能がSafariを通じてWebコンテンツにアクセスできるのであれば、AppleScriptもGUI Scriptingを使ってWebコンテンツにアクセスできるのではないか?

やってみたら、大成功。「HTMLコンテンツ」の中にあるフォーム部品(radio button)や画像をクリックしたり、テキストで書かれていることを取得したり……自分には、DOM経由でアクセスするよりも簡単に操作できました(このへんは個人差が……)。

web1.jpg

UI BrowserでSafariのUIを調査……

web2.jpg

▲Safariの「HTMLコンテンツ」から、さらに下位階層を掘り下げていく……

web3.jpg

▲リンクのテキストにアクセス……

このサンプルは、本BlogをSafariでオープンして、ページ上部にあるメニュー「ABOUT」のリンクをクリックします。

この仕組みを利用して、Webブラウザに表示されているフォームにテスト用のデータをAppleScriptから投入し、連続テストを行うことも可能です。

ちなみに、このリストは「ブックマックバー」が非表示の状態で実行したものであり、「ブックマークバー」を表示させた場合には、リンクのクリック部分が、

click static text 1 of UI element 2 of list 1 of UI element 1 of scroll area 1 of group 2 of window 1

となります。

こういうことを考えると、(外部からコントロールできないことが確実な)Flashのコンテンツは勘弁してほしいという気に……。

スクリプト名:GUI ScriptingでWebコンテンツを操作するテスト
–AS HoleのURLをSafariでオープンする
set aURL to “http://piyocast.com/as/”
set webRes to openPageBySafari(aURL) of me

delay 5 –念のため、ページローディング&レンダリングを待つ

activate application “Safari”
tell application “System Events”
  tell process “Safari”
    –ページ上部にあるメニューから、「ABOUT」のテキストをクリックする
    
click static text 1 of UI element 2 of list 1 of UI element 1 of scroll area 1 of group 1 of window 1
  end tell
end tell

–指定のURLをSafariでオープンする
on openPageBySafari(aURL)
  tell application “Safari”
    set d to count every window
    
if d = 0 then
      make new window
      
tell document 1
        set URL to aURL
      end tell
    else
      if aURL is not equal to “” then
        tell document 1
          set URL to aURL
        end tell
      end if
    end if
    
set aRes to page_loaded(10) of me
  end tell
end openPageBySafari

–Safariでオープン中のURLのローディング完了を待つ
on page_loaded(timeout_value)
  delay 2
  
repeat with i from 1 to the timeout_value
    tell application “Safari”
      if (do JavaScript “document.readyState” in document 1) is “complete” then
        return true
      else if i is the timeout_value then
        return false
      else
        delay 1
      end if
    end tell
  end repeat
  
return false
end page_loaded

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

12/01 Safariのキーボード・ショートカットを取得する v1

GUI Scriptingで、Safariのメニューに振られたキーボード・ショートカットの情報を取得するAppleScriptです。

本来は、Mac OS X 10.6で大幅強化された「サービス」を活用して、Automatorで(AppleScriptを実行するステップを活用して)新規サービスを作成。これをキーボードショートカットで呼び出そうと考えていたのですが……どこのキー・コンビネーションが空いているのかさっぱり分りません(これはOS側の気配りが足りない、、、)。

そこで、どこのキーボードショートカットが空いているのか調べようと考えて試作してみたAppleScriptです。Safariが対象になっていることにはとくに意味はありません。最終的には、起動中のアプリケーション一覧から選択するとか、現在最前面にあるアプリケーションに対して調査を行う……といった利用形態を考えています。

とりあえず、メニューの通常階層にある項目の内容を走査(サブメニューは調査していません)し、キーボードショートカットの内容を調査します。ただ……グローバルキーボードショートカットの情報と、日本語インプットメソッドのキーボードショートカットまで勘案しないといけないので、まだまだ発展途上といったところでしょうか。

メニューの属性情報を取得するのにかなり時間がかかっているので、通信量を減らすためにさまざまな工夫(それ以上処理を行っても意味がない処理を早めに打ち切る)を行っています。まだまだ高速化の余地はありそうですが……とりあえず。

スクリプト名:Safariのショートカットを取得する v1
activate application “Safari”

set mList to {}

tell application “System Events”
  tell process “Safari”
    tell menu bar 1
      set iList to every UI element
    end tell
    
    
repeat with i in iList
      tell i
        tell menu 1
          set iiList to every UI element
        end tell
      end tell
      
      
repeat with ii in iiList
        
        
tell ii
          try
            set titleVal to title
            
if titleVal = missing value then set titleVal to “”
          on error
            set titleVal to “”
          end try
          
          
if titleVal is not equal to “” then
            try
              set cmdChar to value of attribute “AXMenuItemCmdChar”
              
if cmdChar = missing value then set cmdChar to “”
            on error
              set cmdChar to “”
            end try
            
            
if cmdChar is not equal to “” then
              try
                set cmdGlyph to value of attribute “AXMenuItemCmdGlyph”
                
if cmdGlyph = missing value then set cmdGlyph to “”
              on error
                set cmdGlyph to “”
              end try
              
              
try
                set cmdMod to value of attribute “AXMenuItemCmdModifiers”
                
if cmdMod = missing value then set cmdMod to “”
              on error
                set cmdMod to “”
              end try
              
              
try
                set cmdVirt to value of attribute “AXMenuItemCmdVirtualKey”
                
if cmdVirt = missing value then set cmdVirt to “”
              on error
                set cmdVirt to “”
              end try
              
              
set the end of mList to {titleVal, {cmdChar, cmdGlyph, cmdMod, cmdVirt}}
            end if
          end if
        end tell
        
      end repeat
    end repeat
  end tell
end tell

mList
–> {{”Takaaki Naganoya をログアウト…”, {”Q”, “”, 1, “”}}, {”Takaaki Naganoya をログアウト”, {”Q”, “”, 3, “”}}, {”環境設定…”, {”,”, “”, 0, “”}}, {”ポップアップウインドウを開かない”, {”K”, “”, 1, “”}}, {”キャッシュを空にする…”, {”E”, “”, 2, “”}}, {”Safari を隠す”, {”H”, “”, 0, “”}}, {”ほかを隠す”, {”H”, “”, 2, “”}}, {”Safari を終了”, {”Q”, “”, 0, “”}}, {”新規ウインドウ”, {”N”, “”, 0, “”}}, {”新規タブ”, {”T”, “”, 0, “”}}, {”ファイルを開く…”, {”O”, “”, 0, “”}}, {”場所を開く…”, {”L”, “”, 0, “”}}, {”ウインドウを閉じる”, {”W”, “”, 0, “”}}, {”ウインドウを閉じる”, {”W”, “”, 0, “”}}, {”すべてのウインドウを閉じる”, {”W”, “”, 2, “”}}, {”すべてのウインドウを閉じる”, {”W”, “”, 2, “”}}, {”別名で保存…”, {”S”, “”, 0, “”}}, {”別名で保存…”, {”S”, “”, 0, “”}}, {”このページの内容をメールで送信”, {”I”, “”, 0, “”}}, {”このページへのリンクをメールで送信”, {”I”, “”, 1, “”}}, {”プリント…”, {”P”, “”, 0, “”}}, {”取り消す”, {”Z”, “”, 0, “”}}, {”やり直す”, {”Z”, “”, 1, “”}}, {”カット”, {”X”, “”, 0, “”}}, {”コピー”, {”C”, “”, 0, “”}}, {”ペースト”, {”V”, “”, 0, “”}}, {”ペーストしてスタイルを合わせる”, {”V”, “”, 3, “”}}, {”すべてを選択”, {”A”, “”, 0, “”}}, {”フォームに自動入力”, {”A”, “”, 1, “”}}, {”特殊文字…”, {”T”, “”, 2, “”}}, {”ブックマークバーを隠す”, {”B”, “”, 1, “”}}, {”ステータスバーを隠す”, {”/”, “”, 0, “”}}, {”タブバーを表示”, {”T”, “”, 1, “”}}, {”ツールバーを隠す”, {”|”, “”, 0, “”}}, {”中止”, {”.”, “”, 0, “”}}, {”ページを再読み込み”, {”R”, “”, 0, “”}}, {”実際のサイズ”, {”0″, “”, 0, “”}}, {”拡大”, {”+”, “”, 0, “”}}, {”縮小”, {”-”, “”, 0, “”}}, {”ソースを表示”, {”U”, “”, 2, “”}}, {”Top Sites を表示”, {”1″, “”, 2, “”}}, {”前へ戻る”, {”[”, “”, 0, “”}}, {”次へ進む”, {”]”, “”, 0, “”}}, {”ホーム”, {”H”, “”, 1, “”}}, {”検索結果に SnapBack で戻る”, {”S”, “”, 2, “”}}, {”すべてのブックマークを表示”, {”B”, “”, 2, “”}}, {”ブックマークに追加…”, {”D”, “”, 0, “”}}, {”メニューにブックマークを追加”, {”D”, “”, 1, “”}}, {”ブックマークフォルダを追加”, {”N”, “”, 1, “”}}, {”Web インスペクタを表示”, {”I”, “”, 2, “”}}, {”エラーコンソールを表示”, {”C”, “”, 2, “”}}, {”JavaScript のプロファイリングを開始”, {”P”, “”, 3, “”}}, {”しまう”, {”M”, “”, 0, “”}}, {”すべてしまう”, {”M”, “”, 2, “”}}, {”ダウンロード”, {”L”, “”, 2, “”}}, {”構成ファイル一覧”, {”A”, “”, 2, “”}}}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

06/29 Safariで表示中のページ内容をMacJournalの現在選択中のJournalにペースト

Safariで表示中のページ内容を、MacJournalの現在選択中のJournalにペーストするAppleScriptです。

AppleScriptに対応しているのに、実践的な機能が欠けているためにいまひとつ自動化しづらいMacJournal。一括自動処理はしづらくても、ワンアクションだけ自動化するのであればなんとか使えることでしょう。

MacJournalには、Webの内容をコピー&ペーストして内容をとっておいています。ブックマークだと、内容が消えたり、Blogなどはサイトごとなくなったりすることは日常茶飯事。ローカルなりWeb上のアルバムにとっておくなりしておく必要があることでしょう。

重要なページだとコピー&ペーストして必要な部分だけクリッピングしておくのですが、そうでもないページはこの程度で十分でしょう。もうちょっと改良して、Safariで表示中のページの内容を、CLIのWebレンダラーを併用してPDFに落としておいてから、MacJournalにPDFを取り込むところまで作り込むといい感じでしょうか。

スクリプト名:Safariで表示中のページ内容をMacJournalの現在選択中のJournalにペースト
ページにフレームを使っていないことが前提条件
tell application Safari
  set wCount to count every window
  
if wCount = 0 then
    display dialog Safariでウィンドウがオープンされていません buttons {”OK“} default button 1
    
return
  end if
  
  
tell document 1
    set aURL to URL
    
set aTitle to name
  end tell
  
set aText to text of document 1 本文テキスト
end tell

MacJournalの操作
createNewEntryonMacJournal() of me

tell application MacJournal
  tell document 1
    set aSel to selected entry
    
set name of aSel to aTitle
    
set plain text content of aSel to (aURL & return & return & aText)
  end tell
end tell

MacJournalで新規エントリを作成して選択状態にしておく
on createNewEntryonMacJournal()
  activate application MacJournal
  
tell application System Events
    tell process MacJournal
      set aName to title of menu item 1 of menu 1 of menu bar item 3 of menu bar 1
      
if aName = 新規エントリー then 日本語環境用。他の言語環境では、ここのチェックを行わないか、あるいは書き換えること
        click menu item 1 of menu 1 of menu bar item 3 of menu bar 1 Menu > New Entry
      end if
    end tell
  end tell
end createNewEntryonMacJournal

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

06/16 Safariで表示中の保存不能なファイルを別途ダウンロード

Safariで、Podcastingのバックナンバーをダウンロードしようとして……ダウンロードフォルダにファイルとしてダウンロードできず、なおかつSafari中のQuickTimeプラグインの保存コマンドも使えなかったので(何故?) その場でありあわせの部品を組み合わせて3分ぐらいで作ったAppleScriptです。

# Mac OS X 10.7では、URL Access Scriptingが廃止になったので、本Scriptはそのままでは動きません

notdl1.jpg

 (1)まず、Safariの最前面のウィンドウからURLを取得
 (2)Safariのダウンロードフォルダの場所を取得
 (3)(1)で取得したURLからファイル名部分を分離
 (4)URL Access Scriptingで自前でダウンロード

という動作を行います(=という部品をかき集めてつなげただけです)。

スクリプト名:Safariで表示中の保存不能なファイルをダウンロード
tell application Safari
  tell document 1
    set aURL to URL
  end tell
end tell

set dlFol to getSafariDownloadFolder() of me

set aFileName to getFNfromURL(aURL) of me

set dlPath to (dlFol as string) & aFileName

try
  with timeout of 3600 seconds
    tell application URL Access Scripting
      activate
      
download aURL to file dlPath with progress
    end tell
  end timeout
on error
  display dialog Download Error
end try

URLからファイル名のみを抽出
on getFNfromURL(aURL)
  if aURL ends with / then
    display dialog 与えられたURLの末尾がスラッシュで終了しているため、ファイルではありません。 buttons {”OK“} default button 1
    
return “”
  end if
  
set aLen to length of aURL
  
set aR to reverse of (characters of aURL)
  
set aNstr to aR as string
  
set aLoc to offset of / in aNstr
  
set aRes to text (aLen - aLoc + 2) thru -1 of aURL
  
return aRes
end getFNfromURL

Safariのダウンロードフォルダを取得
By Phillip Aker, Mark J Reed
on getSafariDownloadFolder()
  set preferencesPath to POSIX path of (path to preferences)
  
set bundleId to bundle identifier of (info for (path to application Safari“))
  
set safariPrefsFile to preferencesPath & bundleId & .plist
  
tell application System Events to set folderName to get value of property list item DownloadsPath of property list file safariPrefsFile
  
set downloadFolder to (POSIX file (do shell script echo & folderName)) as alias
  
return downloadFolder
end getSafariDownloadFolder

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

05/02 Safariの最前面のウィンドウ内のタブを順々に表示

Safariで、最前面のウィンドウに複数のタブが含まれている状態で……ウィンドウ内のタブを順々に表示するAppleScriptです。2秒のウエイトを入れていますが、それ自体にはとくに意味はありません。

タブの切り替えはさほど難しくない操作ですが、そこにたどり着くまでの道筋が分らないと、トンチンカンで遠回りなScript(GUI Scriptingとか、キーストロークを強制操作するScriptとか)を書く羽目になります。

まず、Safariのウィンドウに対してtellブロックを書き、その中に「properties」と書いてすべての属性情報を確認してみましょう。

スクリプト名:Safariでウィンドウのすべての属性情報を確認
tell application Safari
  tell window 1
    properties
  end tell
end tell
> {zoomed:false, closeable:true, resizable:true, miniaturized:false, document:document “AS Hole(AppleScriptの穴) Create New Post ― WordPress” of application “Safari”, bounds:{37, 23, 894, 975}, titled:true, floating:false, miniaturizable:true, zoomable:true, modal:false, class:window, name:”AS Hole(AppleScriptの穴) Create New Post ― WordPress”, id:69191, index:1, visible:true, current tab:tab 1 of window id 69191 of application “Safari”}

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

実行すると、取得したウィンドウの属性情報の中に「current tab」というものがあることに気付きます。この属性がread onlyでなければ、書き換えてカレントタブを変更できることが期待されます。ただし、単なる数字を入れるのではなくtabオブジェクトを指定する必要があることにも注意すべきです。

その結果をふまえて、Safariの最前面のウィンドウ(window 1)内のタブを数え、current tabを順々に変更していけば何の問題もなくウィンドウ内のタブを切り替えられます。

safari01.jpg

safari02.jpg

ここで紹介したScriptはSafari 3.0以降に対してのみ有効です。実際にはMac OS X 10.5+Safari 3.0以降ということになろうかと。10.4上でも動いたらラッキーぐらいの感じでしょうか。動作確認はSafari 4.0Betaで行いました(ASの辞書内容はSafari 3.0と4.0で変わっていません)。

スクリプト名:Safariの最前面のウィンドウ内のタブを順々に表示
tell application Safari
  activate
  
tell window 1
    set tCount to count every tab
    
repeat with i from 1 to tCount
      set current tab to tab i
      
delay 2
    end repeat
  end tell
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

06/14 ヨドバシ.comのWebの画面に表示されている200×200ピクセル以上の画像をダウンロードする v2

ヨドバシカメラで大量に物品購入を行う際に、申請のあった製品の審査を行うため、データベースに各製品のヨドバシ.com上のURLを溜め込んでいました。そこで、せっかくURLが集まったんだからと、AppleScriptでプログラムを書いて、製品画像だけを抽出して指定フォルダにダウンロードさせてみました。本来は、FileMaker ProのDBに対してアクセスする部分とペアになっているのですが、そのURLと申請者IDを取り出した直後の状態からの処理がこのルーチンです。URLを2つ処理しているのは、1申請者あたり2製品までというスペックで申請を受け付けた事情によるものです。
(more…)

05/08 Safariのウィンドウを画面いっぱいに拡大する

ちょうどML上で話題になっていた内容です。Safariで表示中の最前面のウィンドウを画面いっぱいに拡大する、というテーマに対して……

(1)GUI Scriptingで拡大ボタンを押す
(2)AppleScript経由でJavaScriptを実行して画面いっぱいに拡大する
(3)SafariのWindowに対して、Zoomedをtrueに設定する
(4)画面の大きさを取得して、Safariの最前面のウィンドウをその大きさに強制設定する

といったアイデアが議論されていましたが、(1)と(3)は画面いっぱいになる保証はないし、(4)はかったるい(できるけど)ということから……消去法で(2)になるわけで……その(2)が以下のリストです。

スクリプト名:Safariのウィンドウを画面いっぱいに拡大する
tell applicationSafari
  tell document 1 to do JavaScriptjavascript:self.moveTo(0,0);self.resizeTo(screen.availWidth,screen.availHeight);
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

04/22 Safariの選択部分をGoogle Earthで開く

Webサイト上にGoogle Earthの位置情報ファイルkmlの内容が貼付けられているような場合に、それを選択しておくと、kmlファイルに書き出してGoogle Earthでオープンするというサンプルです。

earth1jpeg.jpeg

earth2.jpeg

スクリプト名:Safariの選択部分をGoogle Earthで開く
tell applicationSafari
  set a to do JavaScriptunescape(getSelection())in document 1
end tell

set a to a as Unicode text
if a = “” then return

set dPAth to path to desktop
set tmpOut to (dPAth as string) & “temp.kml
write_to_file(a, tmpOut, false) of me
saveInEncoding(a, tmpOut, “UTF8“) of meUTF8

do shell scriptsync

tell applicationGoogle Earth
  activate
  
open file tmpOut
end tell

指定の文字エンコーディングでファイル書き出し
on saveInEncoding(aText, aPath, aEncoding)
  
  
set a to aText as Unicode text
  
  
set aTmp to path to temporary items
  
  
set outFile to (aTmp as string) & “temporary_utf16be_text_fromAS.txt
  
write_to_file(a, outFile, false) of me
  
  
do shell scriptsync
  
  
set outPPath to quoted form of POSIX path of (outFile as alias)
  
set cnvPPath to quoted form of POSIX path of aPath
  
  
try
    do shell scripticonv -f UTF-16BE -t ” & aEncoding & “ ” & outPPath & “ > ” & cnvPPath
    –
do shell script “iconv -f UTF-16LE -t ” & aEncoding & ” ” & outPPath & ” > ” & cnvPPath
  end try
  
  
do shell scriptsync
  
  
try
    do shell scriptrm -f ” & outPPath
  end try
  
end saveInEncoding

ファイルの追記ルーチン「write_to_file」
追記データ、追記対象ファイル、boolean(trueで追記)
on write_to_file(this_data, target_file, append_data)
  try
    set the target_file to the target_file as text
    
set the open_target_file to open for access file target_file with write permission
    
if append_data is false then set eof of the open_target_file to 0
    
write this_data to the open_target_file starting at eof
    
close access the open_target_file
    
return true
  on error error_message
    try
      close access file target_file
    end try
    
return error_message
  end try
end write_to_file

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

04/22 Safariの選択部分のテキストを取得する

Safariの再前面のウィンドウで選択中のテキストを取得するサンプルです。アプリケーション上で選択中のテキストを取得して処理するというのは、AppleScript対応アプリケーションに期待したい機能です。ただ、アプリケーション開発者の無理解などによりそれが実装されていないケースもあります。

まさにSafariがそれに該当するもので……本来ならお手上げ状態なのですが、SafariがJavaScriptを実行できるためにウラワザ的に選択部分を取得できる、というお話です。

スクリプト名:Safariの選択部分のテキストを取得する(新)
tell applicationSafari
  set a to do JavaScriptunescape(getSelection())in document 1
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

04/22 Safariの最新のダウンロード状況を取得する

Safariのダウンロードリストを監視して最新のダウンロード状況を取得します。途方もなく大きなアーカイブをダウンロードするとか、アクセスが集まりすぎてダウンロードに時間がかかるような場合に、職場のマシンでダウンロードさせつつ(とっとと)帰宅したい。そんなときに、Safariのダウンロード状況を定期的に確認しつつ……完了したらメールで知らせてマシンをスリープさせる……という即席システムを作って運用しました。

dl_statjpeg.jpeg

スクリプト名:Safariの最新のダウンロード状況を取得する
getLatestDLstat() of me

Safariの最新のダウンロード状況を取得する
on getLatestDLstat()
  –activate application “Safari”
  
tell applicationSystem Events
    tell processSafari
      – insert GUI Scripting statements here
      
set wList to name of every window
      
ifダウンロードis not in wList then return “”
      
      
tell list 1 of scroll area 1 of windowダウンロード
        set lastG to last group
      end tell
      
      
tell lastG
        set sCount to count every static text
        
set dispTxt to “”
        
repeat with i from 1 to sCount
          set aVal to value of static text i
          
set dispTxt to dispTxt & aVal & return
        end repeat
      end tell
    end tell
  end tell
  
return dispTxt
end getLatestDLstat

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

04/22 Safariでタイムアウト時間を指定してURLを開く

Safariで指定のURLをオープンするサンプルです。オープンした後にページのローディングが完了するまで待ちますが、指定時間以内に完了しなかったらエラーとします。よくある処理です。

スクリプト名:SafariでURLをローディング
set aURL tohttp://www.piyocast.com/as/
set aURL to “”

tell applicationSafari
  set d to count every window
  
if d = 0 then
    make new window
    
tell document 1
      set URL to aURL
    end tell
  else
    if aURL is not equal to “” then
      tell document 1
        set URL to aURL
      end tell
    end if
  end if
  
  
page_loaded(10) of me
  
  
set a to do JavaScriptdocument.titlein document 1
end tell

on page_loaded(timeout_value)
  delay 2
  
repeat with i from 1 to the timeout_value
    tell applicationSafari
      if (do JavaScriptdocument.readyStatein document 1) iscompletethen
        return true
      else if i is the timeout_value then
        return false
      else
        delay 1
      end if
    end tell
  end repeat
  
return false
end page_loaded

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

03/18 Safariの最前面のウィンドウのタイトルとURLをコピー

Safariの最前面のウィンドウに表示されているページのタイトルとURLをクリップボードに入れます。Web上で調べものをして、サイトの情報をエディタ上にコピー&ペーストしておきたいといった時に、その場で即興で作ったものです。Script Menuに入れて使っています。取るに足らない「作り捨て」レベルのScriptですが、意外と便利です。

スクリプト名:最前面のウィンドウのタイトルとURLをコピー
tell applicationSafari
  set docCount to count every document
  
if docCount = 0 then
    display dialogウィンドウがオープンされていません
    
return
  end if
  
  
set aURL to URL of document 1
  
set a to do JavaScriptdocument.titlein document 1
end tell

set the clipboard to a & return & aURL

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に

03/09 Safariの選択部分のテキストを取得する

スクリプト名:Safariの選択部分のテキストを取得する(新)
tell applicationSafari
  set a to do JavaScriptunescape(getSelection())in document 1
end tell

▼新規書類に ▼カーソル位置に ▼ドキュメント末尾に