Safariで表示中の最前面のウィンドウのURLの内容をデスクトップ上にWebarchive書類として保存するAppleScriptです。
webArchiveはDeprecatedになったので、macOS 10.14あたりまでのOSで使うならOK。今後については何か別の機能が実装されるのかどうか。macOS 10.15で別の何かが紹介されるのでしょうか。
AppleScript名:Safariで表示中のURLをwebarchive保存 |
— Created 2014-11-13 Shane Stanley — Modified 2018-02-11 Takaaki Naganoya use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "WebKit" property theSender : missing value property thePath : missing value property loadDone : false –original was "webFrame" property aWebView : missing value tell application "Safari" if (count every document) = 0 then return tell front document set aURL to URL end tell end tell set aPath to (POSIX path of (path to desktop)) & ((current application’s NSUUID’s UUID()’s UUIDString()) as string) & ".webarchive" set archRes to archivePageToPathWithoutSearching(aURL, aPath, me, 10) of me on archivePageToPathWithoutSearching(thePageURL, aPath, sender, timeoutSec) –Check If this script runs in foreground if not (current application’s NSThread’s isMainThread()) as boolean then display alert "This script must be run from the main thread (Command-Control-R in Script Editor)." buttons {"Cancel"} as critical error number -128 end if set my theSender to sender — store main script so we can call back set my thePath to aPath — store path for use later set my aWebView to missing value set my loadDone to false — make a WebView set theView to current application’s WebView’s alloc()’s initWithFrame:{origin:{x:0, y:0}, |size|:{width:100, height:100}} — tell it call delegate methods on me theView’s setFrameLoadDelegate:me — load the page theView’s setMainFrameURL:thePageURL –wait for download & saving repeat timeoutSec * 10 times if my loadDone is not equal to false then exit repeat end if delay 0.1 end repeat if my loadDone = false then return "timed out" — the main frame is our interest if (my loadDone) = aWebView’s mainFrame() then — get the data and write it to file set theArchiveData to (my loadDone)’s dataSource()’s webArchive()’s |data|() theArchiveData’s writeToFile:thePath atomically:true — tell our script it’s all done return "The webarchive was saved" end if end archivePageToPathWithoutSearching — called when our WebView loads a frame on WebView:curWebView didFinishLoadForFrame:webFrame set my loadDone to webFrame set my aWebView to curWebView end WebView:didFinishLoadForFrame: — called when there’s a problem on WebView:WebView didFailLoadWithError:theError forFrame:webFrame — got an error, bail WebView’s stopLoading:me set my loadDone to false error "The webarchive was not saved" end WebView:didFailLoadWithError:forFrame: |
More from my site
(Visited 330 times, 1 visits today)
コンテンツ中の表示中のエリア座標を取得する – AppleScriptの穴 says:
[…] (1)表示中のURLを取得して処理 (2)表示中のコンテンツにJavaScriptを実行したりGUI Scripting経由で操作(特定要素をカウントしたりFormに値を入れたりボタンを押したり) (3 […]
shige02 says:
Naganoyaさん、ご無沙汰しております。
重松です。
そこそこの量のページをPDFで保存しないといけないのですが、認証してあるページで、わけのわからないCSSで解析するのも嫌なので、AppleScriptでSafariを操作して保存できないかと思っていて、こちらのコードにたどり着きました。
早速実行しようと試みたのですが、うちの環境だと、エラーになります。
Check If this script runs in foreground のところで引っかかります。
もちろん、Script Editor から Command+R で実行しているんですが。
環境ですが、OSは10.14.6 (18G103)で、SafariはVersion 13.0.2 (14608.2.40.1.3)、ScriptEditorはVersion 2.11 (203.1), AppleScript 2.7です。
Takaaki Naganoya says:
ごぶさたしておりますー。でっかいテレビもお元気でしょうか?(^ー^;
一応、これはPDFではなくWebArchiveなのですがそこは大丈夫でしょうか。
最近はAppleScriptもCocoaの機能を直接呼べるようになったので、いろんな凝ったことが(アプリケーションを介在せずに)できるようになってきています。WebKit(WebView)を呼ぶ場合には、メインスレッドでの実行を強制しないといけないので、
Control-Command-Rで実行してください。同じくmacOS 10.14.6+Safari 13.0.2で実行してみましたが、問題なくデスクトップにWebArchiveを保存できています。