2022/02/15に更新

【GASで便利に】DNSレコードの内容を取得する

APIスプレッドシート

Google Public DNSを利用して、指定したタイプ、ラベルのリソースレコードを取得するGoogle Apps Scriptです。登録値の確認や変更時の反映確認に使えるかも。

こんな悩みを解決します


  • DNSの名前解決結果をまとめることになったが、1個ずつnslookupやdigをするのはめんどくさいので自動化したい。

用意するもの


特にありません。今お使いのスプレッドシートに組み込めます。

このスクリプトで出来ること


  • 指定したタイプ(AとかNSとか)とラベル(www.yahoo.co.jp等)のリソースレコードを取得します。
  • 取得した結果はセルに書き込まれます。
  • Google Public DNS over HTTPSを利用しています。

使い方


1.準備

A列とB列にそれぞれ「タイプ」と「ラベル」を入力しておきます。
たとえばmyfunc.jpのAレコードを調べたい場合は、タイプが「A」、ラベルが「myfunc.jp」となります。

2.スクリプトの実行

準備が終わったら上部のメニューから「DNSレコードを取得する」を実行します。

3.結果の確認

C列に結果が書き込まれました。複数のレコードが返ってきた場合は改行して表示しています。

4.注意点

存在しないタイプとラベルの組み合わせや、そもそもそのドメインが存在しない場合等は結果の列に書き込まれません。
Google Public DNSへはGAS(クラウド側)から問い合わせています。そのため自分のPCでの名前解決結果とは異なる場合があります。監視用途で使う場合はこの点にご注意ください。

スクリプト


/**
 * このスクリプトの説明、使い方はこちら。
 * https://myfunc.jp/items/00044/index.html
 */

function onOpen() {
  // スプレッドシートを開いたときに実行される関数

  // UIの取得
  const ui = SpreadsheetApp.getUi()

  // メニューの表示名
  const menu = ui.createMenu('スクリプト実行');

  // メニューに追加するボタン
  menu.addItem('DNSレコードを取得する', 'get_dns_resource_record');

  // メニューを画面に追加する
  menu.addToUi();
}

function get_dns_resource_record() {

  // アクティブなスプレッドシート、シートを取得
  const sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();

  // シートが使用されている範囲を取得
  let range = sheet.getRange(1, 1, sheet.getLastRow(), sheet.getLastColumn());

  // 値を取得する
  const values = range.getValues();

  // 値が存在する限り、DNSサーバへのデータ取得を実行する
  for (let i = 1; i < values.length; i++) {

    // Google Public DNS over HTTPSを利用して、クエリを送信する
    let url = 'https://dns.google.com/resolve?name=' + values[i][1] + '&type=' + values[i][0];

    // レスポンスからテキストを取得
    let response = UrlFetchApp.fetch(url).getContentText();

    // JSONの文字列からオブジェクトに変換
    let json = JSON.parse(response);

    // キー名:Answerにリソースレコードが格納されるが、存在しないラベル、タイプの組み合わせだと返ってこない。
    // 無い場合は何もせずにスキップする。
    if (!json['Answer']) {
      continue;
    }

    // 結果を格納する配列を用意
    let result = [];

    // Answerは複数存在しうるため、ループして結果用配列に格納する
    for (let j = 0; j < json['Answer'].length; j++) {
      result.push(json['Answer'][j]['data']);
    }

    // 取得結果(C列)に結果を書き込む
    range = sheet.getRange(i + 1, 3, 1, 1);
    range.setValue(result.join('\n'));

  }
}

関連するアプリ


タグ一覧

最新のアプリ

人気のアプリ

myfunc.jp