AppleScript名:ドメイン名からIPアドレスを取得 |
— Created 2016-04-03 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set anIP to ((current application’s NSHost’s hostWithName:"www.google.com")’s address()) as string –> "216.58.200.196" |
タグ: 10.11savvy
インターネット接続確認
AppleScript名:インターネット接続確認 |
— Created 2015-12-16 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aRes to hasInternetConnection() of me –> true on hasInternetConnection() set aURL to current application’s |NSURL|’s alloc()’s initWithString:"http://www.google.com" set aReq to current application’s NSURLRequest’s alloc()’s initWithURL:aURL cachePolicy:(current application’s NSURLRequestReloadIgnoringLocalCacheData) timeoutInterval:5.0 set urlRes to (current application’s NSURLConnection’s sendSynchronousRequest:aReq returningResponse:(missing value) |error|:(missing value)) if urlRes = missing value then return false else return true end if end hasInternetConnection |
Twitter投稿
macOS 10.13まではTwitter投稿やFacebook連携などもOSに組み込まれていたので、手軽にこうした機能を利用でき、macOS 10.13までの環境ではこのように呼び出せるようになっていました。
macOS 10.14から方針が変わり、これらの機能はOSに組み込まれなくなりました。いまだと、REST API経由で投稿を行うことになるでしょうか。
AppleScript名:Twitter投稿 |
— Created 2015-01-24 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" set aString to "ぴよ〜" set twService to current application’s NSSharingService’s sharingServiceNamed:(current application’s NSSharingServiceNamePostOnTwitter) set twService’s delegate to me set shareItems to current application’s NSMutableArray’s alloc()’s initWithObjects:aString tell twService to performWithItems:shareItems |
AirDropでファイルを送信する
Sharing Utilitiesを用いてAirDrop経由のファイル送信を行うAppleScriptです。
さすがに、Sharing Utilitiesは仕様も古いので、最新の環境に合わせて書き換えた「AirSharingLib Script Library」を配布、そちらを用いて同様の機能を実現するAppleScriptも掲載しています。
AppleScript名:AirDropでファイルを送信する |
use AppleScript version "2.4" use scripting additions use framework "Foundation" use shareLib : script "Sharing Utilities" –https://macosxautomation.com/mavericks/libraries/examples.html set anItem to choose file with prompt "Select File to send via AirDrop" set aaList to {anItem} begin AirDrop with aaList |
LAN上のHDDをマウントする v2
AppleScript名:LAN上のHDDをマウントする v2 |
–SMB経由でマウント set userAccount to "maro" –ユーザー名(環境に応じて書き換え) set userPass to "xxxxxx" –パスワード(環境に応じて書き換え) set aMachine to "smb://MBA11._smb._tcp.local/Macintosh HD" –11インチMacBook Air (10.9.2)でSMBのみ有効にしてテスト mountVolume(aMachine, userAccount, userPass) of me –通常実行 –AFP経由でマウント set userAccount to "maro" –ユーザー名(環境に応じて書き換え) set userPass to "xxxxxx" –パスワード(環境に応じて書き換え) set aMachine to "afp://MBA13._afpovertcp._tcp.local/Macintosh SSD" –13インチMacBook Air (10.7.5)でAFPとSMBの両方を有効にしてテスト mountVolumeAsync(aMachine, userAccount, userPass) of me –非同期実行 –指定のネットワーク上のディスクをマウントする on mountVolume(aMachine, userAccount, userPass) try with timeout of 100 seconds mount volume aMachine as user name userAccount with password userPass end timeout on error return false end try return true end mountVolume –指定のネットワーク上のディスクをマウントする(非同期実行) on mountVolumeAsync(aMachine, userAccount, userPass) try ignoring application responses mount volume aMachine as user name userAccount with password userPass end ignoring on error — end try end mountVolumeAsync |
無線LANデバイスのMACアドレスを取得する
AppleScript名:無線LANデバイスのMACアドレスを取得する |
— Created 2015-08-18 by Takaaki Naganoya — Created 2015-08-18 by Shane Stanley — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "CoreWLAN" set aRes to retWiFiMACaddress() –> "XX:XX:XX:XX:XX:XX" –WiFi DeviceのMAC ADDRESSを返す on retWiFiMACaddress() –Get WLAN Device Name set allNames to current application’s CWInterface’s interfaceNames()’s allObjects() –> (NSArray) {"en0"} –@MacBook Pro Retina 2012 set hitF to false repeat with i from 1 to allNames’s |count|() set aInterface to (current application’s CWInterface’s interfaceWithName:(allNames’s objectAtIndex:(i – 1))) if aInterface’s serviceActive() as boolean then set hitF to true exit repeat end if end repeat if hitF = false then return false –There is No WiFi Device (Broken or illigal configuration or Hackintosh) set aHWAddress to aInterface’s hardwareAddress() as text –> "b8:xx:xx:xx:xx:xx"–MAC Address return aHWAddress end retWiFiMACaddress |
無線LANの各種情報を取得する v2.2
AppleScript名:無線LANの各種情報を取得する v2.2 |
— Created 2015-08-18 by Shane Stanley — Modified 2015-08-18 by Takaaki Naganoya use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "CoreWLAN" –Get WLAN Device Name set allNames to current application’s CWInterface’s interfaceNames()’s allObjects() log allNames as list of string or string –> (NSArray) {"en0"} –@MacBook Pro Retina 2012 set hitF to false repeat with i from 1 to allNames’s |count|() set aInterface to (current application’s CWInterface’s interfaceWithName:(allNames’s objectAtIndex:(i – 1))) if aInterface’s serviceActive() as boolean then set hitF to true exit repeat end if end repeat if hitF = false then return false –There is No WiFi Device –WiFi device is Power On ? repeat 10 times set aPower to (aInterface’s powerOn()) as boolean if aPower = false then –ActiveなWLANがない場合(WiFiをオフにしている)にはWiFiパワーオン set wRes to aInterface’s setPower:true |error|:(missing value) delay 1 else exit repeat end if end repeat if aPower = false then return false –I could not power on WiFi deveice set aChan to aInterface’s wlanChannel() –> (CWChannel) <CWChannel: 0x60000040cdd0> [channelNumber=1(2GHz), channelWidth={20MHz}] set chanNumber to aChan’s channelNumber() log chanNumber –> 52 set chanBand to aChan’s channelBand() — 0 = unknown, 1 = 2GHz, 2 = 5GHz log chanBand –> 2 set chanWidth to aChan’s channelWidth() — 0 = unknown, 1 = 20MHz, 2 = 40MHz log chanWidth –> 2 set aTransRate to aInterface’s transmitRate() log aTransRate –> 162.0 set aChannnels to aInterface’s supportedWLANChannels() –> (NSSet) {(CWChannel) <CWChannel: 0x60800020fad0> [channelNumber=1(2GHz), channelWidth={20MHz}, active], (CWChannel) <CWChannel: 0x60800020fb90> [channelNumber=2(2GHz), channelWidth={20MHz}, active], ……………(CWChannel) <CWChannel: 0x608000208410> [channelNumber=64(5GHz), channelWidth={20MHz}, DFS], (CWChannel) <CWChannel: 0x60800020f9e0> [channelNumber=136(5GHz), channelWidth={20MHz}, DFS]} set aSSIDdata to aInterface’s ssidData() –> (NSData) <45787472 xxxxxxxx xxxxxxxx xxxx> set aSSID to aInterface’s ssid() as text –> "Extreme net_5G" set aActive to aInterface’s serviceActive() –> true set aSecurity to aInterface’s security() –> 4 set aRSSIval to aInterface’s rssiValue() –> -72 set aPower to aInterface’s powerOn() –> true set aNoise to aInterface’s noiseMeasurement() –> -91 set aIFname to aInterface’s interfaceName() as text –> "en0" set aMode to aInterface’s interfaceMode() –> 1 set aHWAddress to aInterface’s hardwareAddress() as text –> "b8:xx:xx:xx:xx:xx"–MAC Address set aCountry to aInterface’s countryCode() as text –> "JP" set aConfig to aInterface’s configuration() –> (CWConfiguration) <CWConfiguration: 0x6100002348e0> set aCacheRes to aInterface’s cachedScanResults() –> (NSSet) {(CWNetwork) <CWNetwork: 0x618000402740> ……………… [channelNumber=11(2GHz), channelWidth={20MHz}], ibss=0]} set aBSSID to aInterface’s bssid() as text –> "10:XX:XX:XX:XX:XX" set aPhyMode to aInterface’s activePHYMode() –> 4 |
WiFiデバイスのパワーをオンに
AppleScript名:WiFiデバイスのパワーをオンに |
— Created 2015-08-18 by Shane Stanley — Modified 2015-08-18 by Takaaki Naganoya use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "CoreWLAN" set wRes to powerOnEveryWiFiDevices() of me on powerOnEveryWiFiDevices() set allNames to current application’s CWInterface’s interfaceNames()’s allObjects() as list if allNames = {} then return false set powerList to {} repeat with i in allNames set j to contents of i set aInterface to (current application’s CWInterface’s interfaceWithName:j) set wRes to (aInterface’s setPower:true |error|:(missing value)) set aPower to (aInterface’s powerOn()) as boolean if aPower = false then display notification "Error occured in enabling an Wifi deviece ( " & j & " )…." end if set the end of powerList to aPower end repeat return ({true} is in powerList) –return whether some WiFi interface is on end powerOnEveryWiFiDevices |
LAN上のファイルサーバー(smb)のホスト名を取得する
AppleScript名:LAN上のファイルサーバー(smb)のホスト名を取得する |
— Created 2015-12-24 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" property foundHosts : {} property myHostName : "" findHostsViaBonjour("_smb._tcp") of me –smb’s port:445 –> {"MBA13"} on findHostsViaBonjour(aType) set foundHosts to {} set myHostName to (current application’s NSHost’s currentHost()’s localizedName()) as string set aBrowser to current application’s NSNetServiceBrowser’s alloc()’s init() aBrowser’s setDelegate:me aBrowser’s searchForServicesOfType:aType inDomain:"" repeat 1000 times if foundHosts is not equal to {} then exit repeat delay 0.01 end repeat aBrowser’s setDelegate:(missing value) return foundHosts end findHostsViaBonjour on netServiceBrowser:aNetServiceBrowser didFindService:aNetService moreComing:aMoreComing set aDesc to aNetServiceBrowser’s |description|() set bDesc to aNetService’s |description|() set cDesc to (aNetService’s |name|()) as text if cDesc is not in foundHosts and cDesc is not equal to myHostName then set the end of foundHosts to cDesc end if end netServiceBrowser:didFindService:moreComing: |
LAN上のファイルサーバー(afp)のホスト名を取得する
AppleScript名:LAN上のファイルサーバー(afp)のホスト名を取得する |
— Created 2015-12-24 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" property foundHosts : {} property myHostName : "" findHostsViaBonjour("_afpovertcp._tcp") of me –AFP’s port:548 –> {"MBA13", "Mini_2", "MBA11"} on findHostsViaBonjour(aType) set foundHosts to {} set myHostName to (current application’s NSHost’s currentHost()’s localizedName()) as string set aBrowser to current application’s NSNetServiceBrowser’s alloc()’s init() aBrowser’s setDelegate:me aBrowser’s searchForServicesOfType:aType inDomain:"" repeat 1000 times if foundHosts is not equal to {} then exit repeat delay 0.01 end repeat aBrowser’s setDelegate:(missing value) return foundHosts end findHostsViaBonjour on netServiceBrowser:aNetServiceBrowser didFindService:aNetService moreComing:aMoreComing set aDesc to aNetServiceBrowser’s |description|() set bDesc to aNetService’s |description|() set cDesc to (aNetService’s |name|()) as text if cDesc is not in foundHosts and cDesc is not equal to myHostName then set the end of foundHosts to cDesc end if end netServiceBrowser:didFindService:moreComing: |
RTF本文内の色を置換 v2
指定のRTF書類の本文中の色を置換するAppleScriptです。
指定のRTF書類内のカラーをざっくりとした色に分類し、同じくざっくりとした色名で置換対象を指定し(blue, green)、指定色(black)に色置換。結果をデスクトップ上に別名で保存します。
AppleScript名:RTF本文内の色を置換 v2 |
— Created 2018-01-13 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" property NSData : a reference to current application’s NSData property NSUUID : a reference to current application’s NSUUID property NSColor : a reference to current application’s NSColor property NSString : a reference to current application’s NSString property NSPredicate : a reference to current application’s NSPredicate property NSDictionary : a reference to current application’s NSDictionary property NSMutableArray : a reference to current application’s NSMutableArray property NSMutableAttributedString : a reference to current application’s NSMutableAttributedString property NSForegroundColorAttributeName : a reference to current application’s NSForegroundColorAttributeName property NSDocumentTypeDocumentAttribute : a reference to current application’s NSDocumentTypeDocumentAttribute set targFilePath to POSIX path of (choose file of type {"public.rtf"}) set targColorNameList to {"blue", "green"} –replace target color names set toColor to NSColor’s blackColor() –to color set aRes to replaceRTFColorsByColorName(targFilePath, targColorNameList, toColor, 65535) of me –指定RTF書類本文中、名称で指定した色の該当箇所を指定色(NSColor)に置換する(複数色) on replaceRTFColorsByColorName(targFilePath as string, targColorNameList as list, toColor, aColorMax as integer) script spd property hitList : {} end script set (hitList of spd) to {} set aFilePath to NSString’s stringWithString:(targFilePath) set aData to NSData’s dataWithContentsOfFile:aFilePath options:0 |error|:(missing value) set theStyledText to NSMutableAttributedString’s alloc()’s initWithData:aData options:(missing value) documentAttributes:(missing value) |error|:(missing value) set attrList to getAttributeRunsFromAttrString(theStyledText, aColorMax) of me set attrArray to NSMutableArray’s arrayWithArray:attrList theStyledText’s beginEditing() —— repeat with ii in targColorNameList set jj to contents of ii set thePred to NSPredicate’s predicateWithFormat_("colorName == %@", jj) set (hitList of spd) to ((attrArray’s filteredArrayUsingPredicate:thePred)’s valueForKey:"rangeVal") as list repeat with i in (hitList of spd) (theStyledText’s addAttribute:(NSForegroundColorAttributeName) value:toColor range:(contents of i)) end repeat end repeat theStyledText’s endEditing() —— –Save RTF to desktop set targFol to current application’s NSHomeDirectory()’s stringByAppendingPathComponent:"Desktop" set aRes to saveStyledTextAsRTF(targFol, theStyledText) of me return aRes as boolean end replaceRTFColorsByColorName –AttributedStringを書式でlist of record化 on getAttributeRunsFromAttrString(theStyledText, aColorMax) script aSpd property styleList : {} end script set (styleList of aSpd) to {} —for output set thePureString to theStyledText’s |string|() –pure string from theStyledText set theLength to theStyledText’s |length|() set startIndex to 0 repeat until (startIndex = theLength) set {theAtts, theRange} to theStyledText’s attributesAtIndex:startIndex longestEffectiveRange:(reference) inRange:{startIndex, theLength – startIndex} –String set aText to (thePureString’s substringWithRange:theRange) as string –Color set aColor to (theAtts’s valueForKeyPath:"NSColor") if aColor is not equal to missing value then set aSpace to aColor’s colorSpace() set aRed to (aColor’s redComponent()) * aColorMax set aGreen to (aColor’s greenComponent()) * aColorMax set aBlue to (aColor’s blueComponent()) * aColorMax set colList to {aRed as integer, aGreen as integer, aBlue as integer} –for comparison set colStrForFind to (aRed as integer as string) & " " & (aGreen as integer as string) & " " & (aBlue as integer as string) –for filtering else set colList to {0, 0, 0} set colStrForFind to "0 0 0" end if –Color Name set cName to retColorName(aRed, aGreen, aBlue, aColorMax) of me –Font set aFont to (theAtts’s valueForKeyPath:"NSFont") if aFont is not equal to missing value then set aDFontName to aFont’s displayName() set aDFontSize to aFont’s pointSize() end if set the end of (styleList of aSpd) to {stringVal:aText, colorStr:colStrForFind, colorVal:colList, fontName:aDFontName as string, fontSize:aDFontSize, rangeVal:theRange, colorName:cName} set startIndex to current application’s NSMaxRange(theRange) end repeat return (styleList of aSpd) end getAttributeRunsFromAttrString –RGB値から色名称(だいたいの色)を計算する on retColorName(rCol as integer, gCol as integer, bCol as integer, aColMax as integer) set aCol to makeNSColorFromRGBAval(rCol, gCol, bCol, aColMax, aColMax) of me set hueVal to aCol’s hueComponent() as real set satVal to aCol’s saturationComponent() as real set brightVal to aCol’s brightnessComponent() as real if satVal ≤ 0.01 then set satVal to 0.0 if satVal = 0.0 then if brightVal ≤ 0.2 then set colName to "black" else if (brightVal > 0.95) then set colName to "white" else set colName to "gray" end if else if hueVal ≤ (15.0 / 360) or hueVal ≥ (330 / 360) then set colName to "red" else if hueVal ≤ (45.0 / 360) then set colName to "orange" else if hueVal < (70.0 / 360) then set colName to "yellow" else if hueVal < (150.0 / 360) then set colName to "green" else if hueVal < (190.0 / 360) then set colName to "cyan" else if (hueVal < 250.0 / 360.0) then set colName to "blue" else if (hueVal < 290.0 / 360.0) then set colName to "purple" else set colName to "magenta" end if end if return colName end retColorName on makeNSColorFromRGBAval(redValue as integer, greenValue as integer, blueValue as integer, alphaValue as integer, aMaxVal as integer) set aRedCocoa to (redValue / aMaxVal) as real set aGreenCocoa to (greenValue / aMaxVal) as real set aBlueCocoa to (blueValue / aMaxVal) as real set aAlphaCocoa to (alphaValue / aMaxVal) as real set aColor to NSColor’s colorWithCalibratedRed:aRedCocoa green:aGreenCocoa blue:aBlueCocoa alpha:aAlphaCocoa return aColor end makeNSColorFromRGBAval –スタイル付きテキストを指定フォルダ(POSIX path)にRTFで書き出し on saveStyledTextAsRTF(targFol, aStyledString) set bstyledLength to aStyledString’s |string|()’s |length|() set bDict to NSDictionary’s dictionaryWithObject:"NSRTFTextDocumentType" forKey:(NSDocumentTypeDocumentAttribute) set bRTF to aStyledString’s RTFFromRange:(current application’s NSMakeRange(0, bstyledLength)) documentAttributes:bDict set theName to (NSUUID’s UUID()’s UUIDString()) set thePath to NSString’s stringWithString:targFol set thePath to (thePath’s stringByAppendingPathComponent:theName)’s stringByAppendingPathExtension:"rtf" return (bRTF’s writeToFile:thePath atomically:true) as boolean end saveStyledTextAsRTF |
rtf_rtfdからテキスト抽出
RTFないしRTFD(添付ファイルつきRTF)からテキストを抽出するAppleScriptです。
AppleScript名:rtf_rtfdからテキスト抽出 |
— Created 2018-02-10 by Takaaki Naganoya — 2018 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aFile to choose file of type {"com.apple.rtfd", "public.rtf"} set aRes to retTextFromRTF(aFile) of me on retTextFromRTF(aFile) set aFilePath to current application’s NSString’s stringWithString:(POSIX path of aFile) set anExt to (aFilePath’s pathExtension()) as string if anExt = "rtfd" then set aFilePath to aFilePath’s stringByAppendingString:"TXT.rtf" end if set aData to current application’s NSData’s dataWithContentsOfFile:aFilePath options:0 |error|:(missing value) set theStyledText to current application’s NSMutableAttributedString’s alloc()’s initWithData:aData options:(missing value) documentAttributes:(missing value) |error|:(missing value) if theStyledText is not equal to missing value then return (theStyledText’s |string|()) as string else return false –Not RTF file end if end retTextFromRTF |
RTFを読み込んで書式をDictionary化 v3.0
指定のRTF書類の内容を読み取って、書式情報をNSDictionaryに変換するAppleScriptです。
stringVal:文字列データ
colorStr:RGBの色データを文字列化したもの
colorVal:RGBの色データの数値list
colorDomainName:おおまかな色名称
fontName:フォント名
fontSize:フォントサイズ
書式情報で抽出しやすくしてあります。複数要素(例:フォント名+色)を一緒にまとめて格納しておくことで、検索パフォーマンスを稼げるはずです。
AppleScript名:RTFを読み込んで書式をDictionary化 v3.0 |
— Created 2017-12-10 by Takaaki Naganoya — Modified 2017-12-11 by Shane Stanley — Modified 2017-12-11 by Nigel Garvey — Modified 2017-12-12 by Takaaki Naganoya use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "AppKit" property NSData : a reference to current application’s NSData property NSString : a reference to current application’s NSString property NSAttributedString : a reference to current application’s NSAttributedString set fRes to choose file of type {"public.rtf"} set aFilePath to NSString’s stringWithString:(POSIX path of fRes) set aData to NSData’s dataWithContentsOfFile:aFilePath options:0 |error|:(missing value) set theStyledText to NSAttributedString’s alloc()’s initWithData:aData options:(missing value) documentAttributes:(missing value) |error|:(missing value) set attrRes to getAttributeRunsFromAttrString(theStyledText) of me (* –> {{stringVal:"■■■■■■■", colorStr:"0 0 0", colorVal:{0, 0, 0}, colorDomainName:"black", fontName:"ヒラギノ角ゴ ProN W6", fontSize:12.0}, {stringVal:"Xxxxxxx", colorStr:"217 11 0", colorVal:{217, 11, 0}, colorDomainName:"red", fontName:"ヒラギノ角ゴ ProN W6", fontSize:12.0}, … *) on getAttributeRunsFromAttrString(theStyledText) script aSpd property styleList : {} end script set (styleList of aSpd) to {} —for output set thePureString to theStyledText’s |string|() –pure string from theStyledText set theLength to theStyledText’s |length|() set startIndex to 0 repeat until (startIndex = theLength) set {theAtts, theRange} to theStyledText’s attributesAtIndex:startIndex longestEffectiveRange:(reference) inRange:{startIndex, theLength – startIndex} –String set aText to (thePureString’s substringWithRange:theRange) as string –Color set aColor to (theAtts’s valueForKeyPath:"NSColor") if aColor is not equal to missing value then set aSpace to aColor’s colorSpace() set aRed to (aColor’s redComponent()) * 255 set aGreen to (aColor’s greenComponent()) * 255 set aBlue to (aColor’s blueComponent()) * 255 set colList to {aRed as integer, aGreen as integer, aBlue as integer} –for comparison set colStrForFind to (aRed as integer as string) & " " & (aGreen as integer as string) & " " & (aBlue as integer as string) –for filtering else set colList to {0, 0, 0} set colStrForFind to "0 0 0" end if –Color domain name set cdnStr to retColorDomainNameFromNSColor(aColor) of me –Font set aFont to (theAtts’s valueForKeyPath:"NSFont") if aFont is not equal to missing value then set aDFontName to aFont’s displayName() set aDFontSize to aFont’s pointSize() end if set the end of (styleList of aSpd) to {stringVal:aText, colorStr:colStrForFind, colorVal:colList, colorDomainName:cdnStr, fontName:aDFontName as string, fontSize:aDFontSize} set startIndex to current application’s NSMaxRange(theRange) end repeat return (styleList of aSpd) end getAttributeRunsFromAttrString on retColorDomainNameFromNSColor(aCol) set hueVal to aCol’s hueComponent() set satVal to aCol’s saturationComponent() set brightVal to aCol’s brightnessComponent() if satVal ≤ 0.01 then set satVal to 0.0 set colName to "" if satVal = 0.0 then if brightVal ≤ 0.2 then set colName to "black" else if (brightVal > 0.95) then set colName to "white" else set colName to "gray" end if else if hueVal ≤ (15.0 / 360) or hueVal ≥ (330 / 360) then set colName to "red" else if hueVal ≤ (45.0 / 360) then set colName to "orange" else if hueVal < (70.0 / 360) then set colName to "yellow" else if hueVal < (150.0 / 360) then set colName to "green" else if hueVal < (190.0 / 360) then set colName to "cyan" else if (hueVal < 250.0 / 360.0) then set colName to "blue" else if (hueVal < 290.0 / 360.0) then set colName to "purple" else set colName to "magenta" end if end if return colName end retColorDomainNameFromNSColor |
Read Safari Bookmark v2
Safariのブックマーク内容からURLとページタイトルを取得してテキスト書き出しするAppleScriptです。
一番のみどころは、Predicate文でURLStringがnilでなければ、という記述を行っている箇所です。AppleScriptのデータに変換するとnilはmissing valueになるので、ここでmissing valueを指定したくなるところですが、nilを指定しました。
実行のためには、AppleScriptの実行プログラム(スクリプトエディタとかScript Debugger)を「システム環境設定」の「セキュリティとプライバシー」>「プライバシー」>「フルディスクアクセス」に登録しておく必要があります。AppleScriptアプレットから実行する場合には、そのAppleScriptアプレットそのものを「フルディスクアクセス」に登録する必要があります。
AppleScript名:Read Safari Bookmark v2 |
— Created 2016-02-27 by Takaaki Naganoya — Piyomaru Software 2016 use AppleScript version "2.4" use scripting additions use framework "Foundation" script spdBk property outList : {} end script set (outList of spdBk) to {} set libPath to (POSIX path of (path to library folder from user domain)) & "Safari/Bookmarks.plist" set aRec to retDictFromPlist(libPath) of me set aList to aRec’s Children set aPredicate to current application’s NSPredicate’s predicateWithFormat:"URLString != nil" set filteredArray to (aList’s filteredArrayUsingPredicate:aPredicate) as list repeat with i in filteredArray set the end of (outList of spdBk) to "■" & (Title of URIDictionary of i) & return & (URLString of i) end repeat set aRes to listToStringUsingTextItemDelimiter(contents of (outList of spdBk), return & return) of me –Read plist as record on retDictFromPlist(aPath as text) set thePath to current application’s NSString’s stringWithString:aPath set thePath to thePath’s stringByExpandingTildeInPath() set theDict to current application’s NSDictionary’s dictionaryWithContentsOfFile:thePath return theDict end retDictFromPlist on listToStringUsingTextItemDelimiter(sourceList, textItemDelimiter) set anArray to current application’s NSArray’s arrayWithArray:sourceList set aString to anArray’s componentsJoinedByString:textItemDelimiter return (aString as string) end listToStringUsingTextItemDelimiter |
Safariで表示中のURLをwebarchive保存
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: |
指定URLのページをwebarchive保存 v2
指定のURLの内容をデスクトップ上にwebarchive書類として保存するAppleScriptです。
SafariがAppleScript側にwebarchive保存機能を提供していないので、
(1)GUI Scriptingで無理やりメニューを操作してwebarchive保存
(2)AppleScriptでCocoaの機能を呼び出してwebarchive保存
(3)コマンドラインツールを呼び出してwebarchive保存
といった代替策をとる必要があります。本Scriptは(2)を行なったものです。
オリジナルのAppleScriptはShane StanleyがCocoa Scripting普及初期に書いたもので、非同期で処理しておりそのままではAppleScriptのワークフローに組み込むには難がありました(処理結果が正しく実行できたかなど、結果を確実に確認できたほうがよいので)。
そこで、他のワークフローに組み込みやすいように構造を変えてみました。ただ、内部でdelegateによる通知処理を利用しているのでフォアグラウンドでの実行が必須となります(Command-Control-R)。
AppleScript名:指定URLのページをwebarchive保存 v2 |
— 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 theSearchString : missing value property loadDone : false –original was "webFrame" property aWebView : missing value set aPath to (POSIX path of (path to desktop)) & ((current application’s NSUUID’s UUID()’s UUIDString()) as string) & ".webarchive" set archRes to archivePageToPath("https://www.apple.com/jp/shop/browse/home/specialdeals/mac", aPath, "Mac mini", me, 10) of me on archivePageToPath(thePageURL, aPath, searchString, 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 theSearchString to searchString — store 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 text of the page set theText to ((my loadDone)’s DOMDocument()’s documentElement()’s outerText()) — search it if (theText’s rangeOfString:theSearchString)’s |length|() > 0 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" else return "Seach string not found" end if end if end archivePageToPath — 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: |
指定URLをロードしてページ中の画像を取得 v2
AppleScript名:指定URLをロードしてページ中の画像を取得 v2 |
— Created 2015-09-07 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "WebKit" property loadDone : false property theWebView : missing value set aURL to "http://piyocast.com/as/archives/1176" set aRes to getPage(aURL) set aList to getPageImages() of me set theWebView to missing value –Purge aList –theWebViewにロードしておいたページから画像情報を取得 on getPageImages() set aList to {} set imgNum to ((my theWebView)’s stringByEvaluatingJavaScriptFromString:"document.images.length") as integer repeat with i from 0 to (imgNum – 1) set jsT to "document.images[" & (i as string) & "].height" set aHeight to ((my theWebView)’s stringByEvaluatingJavaScriptFromString:jsT) as integer set jsT to "document.images[" & (i as string) & "].width" set aWidth to ((my theWebView)’s stringByEvaluatingJavaScriptFromString:jsT) as integer set jsT to "document.images[" & (i as string) & "].src" set aSRC to ((my theWebView)’s stringByEvaluatingJavaScriptFromString:jsT) as text set the end of aList to {aHeight, aWidth, aSRC} end repeat return aList end getPageImages –theWebViewにロードしておいたページからタイトルを取得 on getPageTitle() set x to ((my theWebView)’s stringByEvaluatingJavaScriptFromString:"document.title") as text return x end getPageTitle –指定のURLの内容をtheWebViewに取得 on getPage(aURL) –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 loadDone to false set my theWebView to missing value openURL(aURL) set waitLoop to 1000 * 60 –60 seconds set hitF to false repeat waitLoop times if my loadDone = true then set hitF to true exit repeat end if current application’s NSThread’s sleepForTimeInterval:("0.001" as real) –delay 0.001 end repeat if hitF = false then return return true end getPage –WebViewにURLを読み込む on openURL(aURL) set noter1 to current application’s NSNotificationCenter’s defaultCenter() set my theWebView to current application’s WebView’s alloc()’s init() noter1’s addObserver:me selector:"webLoaded:" |name|:(current application’s WebViewProgressFinishedNotification) object:(my theWebView) my (theWebView’s setMainFrameURL:aURL) end openURL –Web Viewのローディング完了時に実行 on webLoaded:aNotification set my loadDone to true end webLoaded: |
指定URLをロードしてtitleを取得
AppleScript名:指定URLをロードしてtitleを取得 |
— Created 2015-09-07 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "WebKit" property loadDone : false property theWebView : missing value set aURL to "https://www.youtube.com/watch?v=WuziqYptTyE" set aTitle to getPageTitle(aURL) –> "戦場の絆ポータブル【HD】鉱山都市 オンライン対戦 2015.09.04 – YouTube" on getPageTitle(aURL) –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 loadDone to false set my theWebView to missing value openURL(aURL) set waitLoop to 1000 * 60 –60 seconds set hitF to false repeat waitLoop times if my loadDone = true then set hitF to true exit repeat end if current application’s NSThread’s sleepForTimeInterval:("0.001" as real) –delay 0.001 end repeat if hitF = false then return set jsText to "document.title" set x to ((my theWebView)’s stringByEvaluatingJavaScriptFromString:jsText) as text set my theWebView to missing value return x end getPageTitle –WebViewにURLを読み込む on openURL(aURL) set noter1 to current application’s NSNotificationCenter’s defaultCenter() set my theWebView to current application’s WebView’s alloc()’s init() noter1’s addObserver:me selector:"webLoaded:" |name|:(current application’s WebViewProgressFinishedNotification) object:(my theWebView) my (theWebView’s setMainFrameURL:aURL) end openURL –Web Viewのローディング完了時に実行 on webLoaded:aNotification set my loadDone to true end webLoaded: |
web上の画像をローカルにダウンロードして保存
AppleScript名:web上の画像をローカルにダウンロードして保存 |
— Created 2013-12-27 Shane Stanley use AppleScript version "2.4" use scripting additions use framework "Foundation" set thePicURL to "http://www.macosxautomation.com/applescript/apps/gfx/EverydayCover300.jpg" set thePath to POSIX path of ((path to desktop as text) & "Test.jpg") set aRes to saveImageURLToPath(thePicURL, thePath) on saveImageURLToPath(thePicURL, thePath) set theNSURL to current application’s |NSURL|’s URLWithString:thePicURL set picData to current application’s NSData’s dataWithContentsOfURL:theNSURL picData’s writeToFile:thePath atomically:true end saveImageURLToPath |
URLの妥当性チェック
AppleScript名:URLの妥当性チェック |
— Created 2015-09-06 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –http://stackoverflow.com/questions/1471201/how-to-validate-an-url-on-the-iphone set aRes1 to validateURL("http://www.apple.com/jp") –> true set aRes2 to validateURL("http.s://www.gmail.com") –> false set aRes3 to validateURL("https:.//gmailcom") –> false set aRes4 to validateURL("https://gmail.me.") –> false set aRes5 to validateURL("https://www.gmail.me.com.com.com.com") –> true set aRes6 to validateURL("http:/./ww-w.wowone.com") –> false set aRes7 to validateURL("http://.www.wowone") –> false set aRes8 to validateURL("http://www.wow-one.com") –> true set aRes9 to validateURL("http://www.wow_one.com") –> true set aRes10 to validateURL("http://.") –> false set aRes11 to validateURL("http://") –> false set aRes12 to validateURL("http://k") –> false return {aRes2, aRes3, aRes4, aRes5, aRes6, aRes7, aRes8, aRes9, aRes10, aRes11, aRes12} –> {false, false, false, true, false, false, true, true, false, false, false} –URLの妥当性チェック on validateURL(anURL as text) –set regEx1 to current application’s NSString’s stringWithString:"(http|https)://((\\w)*|([0-9]*)|([-|_])*)+([\\.|/]((\\w)*|([0-9]*)|([-|_])*))+" set regEx1 to current application’s NSString’s stringWithString:"((https|http)://)((\\w|-)+)(([.]|[/])((\\w|-)+))+" set predicate1 to current application’s NSPredicate’s predicateWithFormat_("SELF MATCHES %@", regEx1) set aPredRes1 to (predicate1’s evaluateWithObject:anURL) as boolean return aPredRes1 end validateURL |