HOME > AppleScript > はてなブックマークの後に del.icio.us にもポスト (Safari 用)


(*
Mac OS 10.4.5 on PPC、Safari 2.0.3 で動作確認。

はてなブックマークのブックマーク追加画面で必要事項を入力し、そのウインドウを前面に出したままで実行。
はてなブックマークに送信→del.icio.usのブックマーク追加画面を開く→先ほど入力したタグとコメントをdel.icio.usのテキストボックスにコピー→del.icio.usに送信という流れで処理される。
*)

tell application "System Events" to if not (exists application process "Safari") then return

tell application "Safari"

activate
set firstDocument to document 1 --はてブの編集画面
if URL of firstDocument does not start with "http://b.hatena.ne.jp/add?" then return
set theString to (do JavaScript "document.add.comment.value" in firstDocument)
set tempTags to (do shell script "echo " & quoted form of theString & " | sed -E 's/^\\[[^]\\[]+\\](\\[[^]\\[]+\\])*/&\\" & (ASCII character 10) & "/g'")

if (number of paragraphs of tempTags) is 1 then
set notes to (paragraph 1 of tempTags)
set tags to ""
else
set notes to (paragraph 2 of tempTags)
set tags to (do shell script "echo " & quoted form of (paragraph 1 of tempTags) & " | sed 's/^\\[//;s/\\]\\[/ /g;s/\\]$/ /'")
end if

set theTitle to (do JavaScript "document.add.title.value" in firstDocument)
set theURL to (do JavaScript "document.add.url.value" in firstDocument)

do JavaScript "document.add.submit()" in firstDocument

if not my existsDocument(100, firstDocument) then --はてブのウインドウが閉じる(または切り替わる)のを待つ。
display dialog "送信の完了を確認できませんでした。" & return & "スクリプトを中断します。" buttons {"キャンセル"} default button 1 giving up after 5
return
end if

try
URL of document 1
on error
display dialog "このウインドウで URL を開くことはできません。" buttons {"OK"} default button 1 giving up after 2
delay 1
try
URL of document 1
on error
make new document
end try
end try
--はてブのウインドウが閉じた後にソースのウインドウなどが前面に出てきてしまった場合の処理。基本的にはエラーとなるが、AppleScript がダイアログを開いて閉じる過程で前面のウインドウが背面に回ることがあるという Safari のあやしい挙動をこの場面で利用できる。try 文を入れ子にしてもう一度チャンスを与え、2回目の URL of document 1 でエラーが出なければそのままスクリプトを続行、そうでなければ新規ウインドウを開いて続行。

set bookmarklet to "location.href='http://del.icio.us/post?v=4;url='+encodeURIComponent('" & theURL & "')+'&title='+encodeURIComponent('" & theTitle & "')"
do JavaScript bookmarklet in document 1

if not my readyStateComplete(100) then
display dialog "ページの読み込み完了を確認できませんでした。" & return & "スクリプトを中断します。" buttons {"キャンセル"} default button 1 giving up after 5
return
end if

if (text of document 1) contains "delete this post" then --del.icio.us にすでにブックマークされていた場合。
display dialog "すでにブックマークされているようです。" buttons {"キャンセル"} default button 1 giving up after 5
return
else if (URL of document 1) starts with "http://del.icio.us/login" then --del.icio.us をログアウトしていた場合。
display dialog "3分以内にログインすれば" & return & "スクリプトを続けられるかもしれません。" & return & "ここでキャンセルボタンを押せば" & return & "スクリプトを中断できます。"
end if

do JavaScript "document.delForm.notes.value='" & notes & "'" in document 1
do JavaScript "document.delForm.tags.value='" & tags & "'" in document 1

with timeout of 200 seconds
set theTime to (time of (current date))
if not my stringBool(notes, tags, theTime) then
display dialog "del.icio.us 編集画面の" & return & "読み込みを確認できませんでした。" & return & "スクリプトを中断します。" buttons {"キャンセル"} default button 1 giving up after 30
return
else
do JavaScript "document.delForm.submit()" in document 1
end if
end timeout

end tell

on existsDocument(timeoutValue, theDocument)
repeat with i from 1 to timeoutValue
tell application "Safari"
if not (exists theDocument) then
return true
else if i = timeoutValue then
return false
else
delay 1
end if
end tell
end repeat
return false
end existsDocument

on readyStateComplete(timeoutValue)
delay 2
repeat with i from 1 to the timeoutValue
tell application "Safari"
if (do JavaScript "document.readyState" in document 1) is "complete" then
return true
else if i = timeoutValue then
return false
else
delay 1
end if
end tell
end repeat
return false --この return false は何だろう。おまじない? (http://www.apple.com/applescript/safari/jscript.01.html)
end readyStateComplete

on stringBool(noteString, tagString, timeoutValue)
with timeout of 200 seconds
tell application "Safari"
set str1 to (do JavaScript "document.delForm.notes.value" in document 1)
set str2 to (do JavaScript "document.delForm.tags.value" in document 1)
if (str1 = noteString) and (str2 = tagString) then
return true
else if ((time of (current date)) - timeoutValue) > 180 then
return false
else
do JavaScript "document.delForm.notes.value='" & noteString & "'" in document 1
do JavaScript "document.delForm.tags.value='" & tagString & "'" in document 1
delay 1
my stringBool(noteString, tagString, timeoutValue)
end if
end tell
end timeout
end stringBool

HOME > AppleScript > はてなブックマークの後に del.icio.us にもポスト (Safari 用)

TOP

created: 2006-04-04T16:34:48+09:00
last modified: 2006-04-04T17:17:39+09:00
author: AquaBowler