技術のメモ帳

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

[GAS]はてなブックマークのWebhook経由で、ブックマーク情報をSpreadSheetに保存する

はてなブックマークのコンテンツを追加/更新/削除のタイミングで、任意のURLにリクエストを送信するWebhookがあります。

こちらのトリガーを使って、追加コンテンツをSpreadSheetに保存してみます。

準備

スクリプトファイルを新規で作成し、以下のコードを記述します。

URLにアクセスされた際の、HTTPメソッドが、doGet doPost のそれぞれに対応しています。

function doGet(request) {
  if (!request) return;
  return ContentService.createTextOutput('get request');
}

function doPost(request) {
  if (!request) return;
  return ContentService.createTextOutput('post request');
}

[公開]→[ウェブアプリケーションとして導入]を選択し、外部アクセスを許可します。

この際、アプリケーションにアクセスできるユーザーは[全員(匿名ユーザーを含む)]を選択します。

設定後、発行されるURL https://script.google.com/macros/s/**ID**/exec をメモしておきます。

ターミナルからPOST送信テスト

curlコマンドを使って、発行URLにPOST送信のテストをします。

$ curl -F key=value -L https://script.google.com/macros/s/**ID**/exec

post requestという文字列が返ればOKです。

はてなブックマークの設定

[設定]→[開発者向け]ページを表示し、WebhookよりGASで発行されたURLを入力します。

このサンプルでは、[ブックマークの追加 / 更新 / 削除] を監視対象とするため、チェックボックスをtrueにしてください。

今回は、キー(秘密鍵的な文字列)は利用しませんが、誰からもアクセス可能なため、実際は定義します。

初期化関数

次のような初期化関数を作成し、実行します。

function initSpreadSheet() {
  var book   = SpreadsheetApp.create('はてなブックマーク'),
      sheet  = book.insertSheet('bookmarks'),
      header = ['date', 'uid', 'title', 'url', 'permalink', 'count', 'comment', 'is_private', 'username', 'status'];
  PropertiesService.getScriptProperties().setProperty('HATENA_BOOKMARK_BOOK_ID', book.getId());
  PropertiesService.getScriptProperties().setProperty('HATENA_BOOKMARK_SHEET_NAME', sheet.getSheetName());
  sheet.getRange(1, 1, 1, header.length).setValues([header]);
}

SpreadSheetに書き込む関数

doPost 関数を編集し、新たに insertIntoSpreadSheet 関数を作成します。

function doPost(request) {
  if (!request) return;
  var response = insertIntoSpreadSheet(request.parameters);
  return ContentService.createTextOutput(response);
}

function insertIntoSpreadSheet(params) {
  try {
    var book  = SpreadsheetApp.openById(PropertiesService.getScriptProperties().getProperty('HATENA_BOOKMARK_BOOK_ID')),
        sheet = book.getSheetByName(PropertiesService.getScriptProperties().getProperty('HATENA_BOOKMARK_SHEET_NAME')),
        row   = sheet.getLastRow()+1,
        data  = [params.timestamp, params.uid, params.title, params.url, params.permalink, params.count, params.comment, params.is_private, params.username, params.status];
    sheet.getRange(row, 1, 1, data.length).setValues([data]);
    return 'success';
  } catch (e) {
    return 'failure';
  }
}

アプリケーションの更新

コードを変更した場合、アプリケーションの更新を実行しないと、最新版が反映されません。

慣れるまで、ハマりやすい箇所なので、忘れずに変更してください。

変更は設定と同じく、[設定]→[開発者向け]ページを表示し、バージョンを変更します。

ブックマークを実行すると...

はてなブックマークブックマークレット等で、コンテンツを追加すると、SpreadSheetに次のようなデータが追加されます。

追記

はてなブックマーク Web Hookの処理を、ライブラリ化したエントリを書きました。

もしよろしければ併せてご覧ください。

参考リンク