技術のメモ帳

気が向いたときに書いてます

[GAS]はてなブックマーク Web Hookを扱うライブラリ

Google Apps Scriptで、はてなブックマーク Web Hookを扱う場合、タグのパースやコメントの抽出などの処理が必要なため、ライブラリ化しました。

過去に書いた、以下の記事を実装しやすくしたパターンとなります。

使い方

[リソース]→[ライブラリ]を選択し、M9Hrt_ERStnFAtzJz2yY8LkqO0XQ_ydfbを入力すると、HatenaBookmarkWebhookが表示されます。

はてなブックマーク Web Hookは、各イベントに併せて、POST送信が行われるため、doPost関数を実装し、アプリケーションとして公開する必要があります。

Web Hookで送られるデータを、SpreadSheetの末尾に挿入するサンプルコードは次の通りです。

function doPost(e) {
  var handler = {
    success: function (data) {
      var sheet = SpreadsheetApp.openById('***YOUR_SPREAD_SHEET_ID***').getActiveSheet(),
          row   = [data.timestamp, data.status, data.title, data.url, data.count, data.tags, data.comment, data.permalink, data.is_private, data.uid, data.username, data.key, data.client, data.color, data.quote];
      sheet.appendRow(row);
    },
    failure: function (data) {
      Logger.log(data);
    }
  };
  HatenaBookmarkWebhook.getInstance().onSuccessHandler(handler.success).onFailureHandler(handler.failure).requestHandler(e);
}

// for Testing Function
function doPostTest() {
  var expected_parameter = {
    parameter: {
      timestamp:  'timestamp',
      status:     'test',
      title:      'title',
      url:        'url',
      count:      'count',
      comment:    '[one][two][three] sing a song for everything you want.',
      permalink:  'permalink',
      is_private: 'is_private',
      uid:        'uid',
      username:   'username',
      key:        'key',
      client:     'client',
      color:      'color',
      quote:      'quote'
    }
  };
  doPost(expected_parameter);
}

使い方は非常にシンプルで、次の3点を理解すれば、ご利用いただけます。

  1. HatenaBookmarkWebhook.getInstance()メソッドインスタンスを生成(必須)
  2. onSuccessHandler()onFailureHandler() でコールバック関数を登録(任意)
  3. 最後に requestHandler() メソッドに、doPostで渡される引数 e を渡す(必須)

なお、コールバック関数が未登録の場合は、オブジェクトを返しますので、ミニマムの実装としては、以下のようになります。

function doPost(e) {
  var data = HatenaBookmarkWebhook.getInstance().requestHandler(e);
  Logger.log(data);
}

動作確認

上記のサンプルの結果ですが、次のようになります。

ヘッダーを追加していないため、何が何のデータか不明かもしれませんが、ブックマークのCRUDが動作するたびに、SpreadSheetにデータが蓄積されていきます。

特定のアクションの場合のみ動作させる場合は、そういった処理をライブラリを呼び出す関数に書けば、簡単に実装できるでしょう。

ライブラリのコード

ライブラリのコードも掲載しておきます。

最後に

今回、初めてライブラリとして、別のスクリプトファイルから呼び出してみましたが、容易でした。

特に、特定のWEBサービスに依存する処理については、モジュールを細かく分割した方が、再利用性も高くて、いろいろと最適化ができそうです。

もしご興味があったら、使ってみてください。