指定URLの存在確認を行うAppleScriptです。
以前はNSURLConnectionを使って確認するものを使っていましたが、NSURLSessionへと移行しようかというところ。
もちろん、shellのcurlコマンドを使えば数行で済んでしまいますが、そこをあえてCocoaの機能を利用して、というよりはちょっと前に書いたREST API呼び出しのサブルーチンが絶好調で動いているので、これをそのまま流用してみました。
ライブラリ化して自分のScriptのバンドル内に入れておくとか、~/Library/Script Librariesフォルダに入れておくとか、そういう使い方になると思います。自分でもわざわざこれだけの機能のために、これだけの量のコードをゼロから書くことは……めったにありません。
AppleScript名:URLにリソースが存在するかチェック(curl版)_v2 |
set aURL to "http://www.apple.com/jp/" set aRes to chekURLExistence(aURL) of me on chekURLExistence(aURL) try set aRes to do shell script ("/usr/bin/curl -LI " & aURL) on error return false end try return ((aRes contains "HTTP/1.1 200") or (aRes contains "HTTP/2 200")) as boolean end chekURLExistence |
AppleScript名:URLにリソースが存在するかチェック v5(NSURLSession) |
— Created 2019-05-24 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" property |NSURL| : a reference to current application’s |NSURL| property NSString : a reference to current application’s NSString property NSURLSession : a reference to current application’s NSURLSession property NSJSONSerialization : a reference to current application’s NSJSONSerialization property NSMutableURLRequest : a reference to current application’s NSMutableURLRequest property NSUTF8StringEncoding : a reference to current application’s NSUTF8StringEncoding property NSURLSessionConfiguration : a reference to current application’s NSURLSessionConfiguration property retData : missing value property retCode : 0 property retHeaders : 0 property drecF : false set aURL to "http://piyocast.com/as/" set uRes to chekURLExistence(aURL) of me –> true on chekURLExistence(aURL as string) set webRes to callRestGETAPIAndParseResults(aURL, 5) of me return ((retCode of webRes) as integer = 200) end chekURLExistence — 指定URLにファイル(画像など)が存在するかチェック –> {存在確認結果(boolean), レスポンスヘッダー(NSDictionary), データ(NSData)} on callRestGETAPIAndParseResults(reqURLStr as string, timeOutSec as real) set (my retData) to false set (my retCode) to 0 set (my retHeaders) to {} set (my drecF) to false set aURL to |NSURL|’s URLWithString:reqURLStr set aRequest to NSMutableURLRequest’s requestWithURL:aURL aRequest’s setHTTPMethod:"GET" aRequest’s setValue:"gzip" forHTTPHeaderField:"Content-Encoding" aRequest’s setValue:"application/json; charset=UTF-8" forHTTPHeaderField:"Content-Type" set aConfig to NSURLSessionConfiguration’s defaultSessionConfiguration() set aSession to NSURLSession’s sessionWithConfiguration:aConfig delegate:(me) delegateQueue:(missing value) set aTask to aSession’s dataTaskWithRequest:aRequest set hitF to false aTask’s resume() –Start URL Session repeat (1000 * timeOutSec) times if (my drecF) = true then set hitF to true exit repeat end if delay ("0.001" as real) end repeat if hitF = false then error "REST API Timeout Error" return {retData:retData, retCode:retCode, retHeaders:retHeaders} end callRestGETAPIAndParseResults on URLSession:tmpSession dataTask:tmpTask didReceiveData:tmpData parseSessionResults(tmpSession, tmpTask, tmpData) of me set (my drecF) to true end URLSession:dataTask:didReceiveData: –ないとエラーになるので足した。とくに何もしていない on URLSession:tmpSession dataTask:tmpTask willCacheResponse:cacheRes completionHandler:aHandler — end URLSession:dataTask:willCacheResponse:completionHandler: on parseSessionResults(aSession, aTask, tmpData) set aRes to aTask’s response() set (my retCode) to aRes’s statusCode() set (my retHeaders) to aRes’s allHeaderFields() set resStr to NSString’s alloc()’s initWithData:tmpData encoding:(NSUTF8StringEncoding) set jsonString to NSString’s stringWithString:(resStr) set jsonData to jsonString’s dataUsingEncoding:(NSUTF8StringEncoding) set aJsonDict to NSJSONSerialization’s JSONObjectWithData:jsonData options:0 |error|:(missing value) set (my retData) to aJsonDict as anything end parseSessionResults |
More from my site
(Visited 95 times, 1 visits today)