指定のドメインのIPアドレスを、指定のDNSサーバーで引いて結果を返すAppleScriptです。
DNS系のFramework(Objective-Cで書いてあるもの)はいろいろためしてみたものの、不思議とどれも動作が重くて、このようにshell commandを呼び出したほうが手軽で高速でした。
# うまく動いていなかったために遅かった、というのが正確なところかも。タイムアウトエラーを起こして処理が完了しないものばかりだったので、、、書き換えがうまく行っていなかった可能性が50%以上あります
nslookupの結果を取り出すためにいろいろやっていますが、ありもののルーチンを引っ張り出して加工してしているだけです。
apple.comのように、CDNサービスを利用してアクセス負荷分散を行なっているようなドメインだと、問い合わせごとにIPアドレスが変わるようです。
一方で、piyocast.comのように固定ホスト(バーチャルホストではありますが)で細々とホスティングしているようなドメインでは、IPアドレスが毎回変わるということはありません。
AppleScript名:指定のドメインのIPアドレスを指定DNSで引いて返す v2.scptd |
— – Created by: Takaaki Naganoya – Created on: 2020/05/25 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions property NSScanner : a reference to current application’s NSScanner property NSMutableArray : a reference to current application’s NSMutableArray set aDomain to "apple.com" set aDNS to "8.8.4.4" set dnRes to getIPAddress(aDomain, aDNS) of me –> {serverName:"apple.com", serverAddr:{"17.172.224.47", "17.178.96.59", "17.142.160.59"}}–CDNの影響でアドレスが頻繁に変わる? set dnRes to getIPAddress("piyocast.com", aDNS) of me –> {serverName:"piyocast.com", serverAddr:{"157.112.183.74"}} on getIPAddress(aDomain, aDNS) set searchStr to "answer:" using terms from scripting additions set aRes to do shell script ("nslookup " & aDomain & " " & aDNS) set bRes to offset of searchStr in aRes end using terms from if bRes = 0 then return false set cRes to text (bRes + (length of searchStr) + 1) thru -1 of aRes set adRes1 to extractStrFromTo(cRes, "Name:", return) of me set adRes2 to extractStrFromTo(cRes, "Address:", return) of me set outList to {} set erList to {} repeat with i from 1 to (length of adRes2) set j1 to contents of (item i of adRes1) set j2 to contents of (item i of adRes2) if j1 is equal to aDomain then set the end of outList to j2 else set the end of erList to {j1, j2} end if end repeat return {serverName:j1, serverAddr:outList} end getIPAddress –offset命令の実行を横取りして高速実行(x2.5 faster) on offset of searchStr in str set aRes to getOffset(str, searchStr) of me return aRes end offset on getOffset(str, searchStr) set d to divideBy(str, searchStr) if (count d) is less than 2 then return 0 return (length of item 1 of d) + 1 end getOffset on divideBy(str, separator) set delSave to AppleScript’s text item delimiters set the AppleScript’s text item delimiters to separator set strItems to every text item of str set the AppleScript’s text item delimiters to delSave return strItems end divideBy –指定文字と終了文字に囲まれた内容を抽出 on extractStrFromTo(aParamStr, fromStr, toStr) set theScanner to NSScanner’s scannerWithString:aParamStr set anArray to NSMutableArray’s array() repeat until (theScanner’s isAtEnd as boolean) set {theResult, theKey} to theScanner’s scanUpToString:fromStr intoString:(reference) theScanner’s scanString:fromStr intoString:(missing value) set {theResult, theValue} to theScanner’s scanUpToString:toStr intoString:(reference) if theValue is missing value then set theValue to "" –>追加 theScanner’s scanString:toStr intoString:(missing value) anArray’s addObject:theValue end repeat return (anArray as list) end extractStrFromTo |
More from my site
(Visited 49 times, 1 visits today)