ngym.org

はてなブックマークのお気に入りのブックマークをSlackに投稿する

HBFav の Mac 版を心待ちにしていたんだけど、

これから先、モンスターハンタークロス、シュタインズ・ゲート0、Fallout 4 の猛攻をくぐり抜け HBFav for Desktop が完成する確率は限りなくゼロに近い

— Naoya Ito (@naoya_ito) November 9, 2015

という事なので、 貧者の Amazon Lambda であるところの Google Apps Script(GAS)をつかって、はてなブックマークの「お気に入りのブックマーク」を Slack に投稿するというのを作ってみた。

仕組みは簡単で、はてなブックマークの Webhook で渡された情報を加工して Slack にポストしているだけ。 自分のアイコンでポストすると視認性が悪いので、はてな ID のアイコンとユーザー名で投稿するようにしている。

ちょっと前まで Hubot で動かしていたんだけど、GAS で POST リクエストを受けとれるというのを知ったので移植した。

手順

API トークンの取得

Slack にポストできるように、https://api.slack.com/web#authentication からxoxp-からはじまる API トークンを取得しておく。

GAS の準備

次に、https://script.google.com/ で GAS のプロジェクトを作る。

GAS から Slack への投稿は、SlackApp というライブラリをつかっているので、 メニューの「リソース > ライブラリ」から M3W5Ut3Q39AaIwLquryEPMwV62A3znfOO で SlackApp を検索して保存しておく。

メニューから [ファイル] → [プロジェクトのプロパティ] → [スクリプトのプロパティ] で

  • プロパティ: slack_api_token
    • 値: slack の API トークン(xoxp-からはじまるやつ)
  • プロパティ: channel
    • 値: チャンネル名 (#general とか)

と 2 つの行を追加して保存。

その後に以下のコードをスクリプトエディタにコピペして

function doPost(req) {
  var params = req.parameter
  var token = PropertiesService.getScriptProperties().getProperty(
    'slack_api_token',
  )
  var channel = PropertiesService.getScriptProperties().getProperty('channel')
  var slack = SlackApp.create(token)
  slack.postMessage(channel, createMessage(params), {
    username: params.username,
    icon_url: iconUrl(params.username),
  })
  return
}

function createMessage(p) {
  var link = [
    '<',
    p.url,
    '|',
    p.title.replace(/>/g, '&gt;').replace(/</g, '&lt;'),
    '> ',
    p.count,
    p.count == 1 ? 'user' : 'users',
  ].join('')
  return [link, p.comment].join('\n')
}

function iconUrl(id) {
  return [
    'http://cdn1.www.st-hatena.com/users/',
    id.slice(0, 2),
    '/',
    id,
    '/profile.gif',
  ].join('')
}

メニューから「公開 > ウェブ アプリケーションとして導入」を選択。

  • 「次のユーザーとしてアプリケーションを実行」は「自分」に
  • 「アプリケーションにアクセスできるユーザー」は「全員(匿名ユーザーを含む)」を選択して保存
  • 「現在のウェブ アプリケーションの URL」をコピーしておく。

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

最後にはてなブックマークから GAS へ POST してもらうために、http://b.hatena.ne.jp/-/my/config/developer にアクセスして、

  • 「イベント通知を受けとる URL」に先程つくったウェブアプリケーションの URL を入力
  • 「受け取るイベントの種類」は「お気に入りユーザーによるブックマーク追加」にチェックをいれて保存

)

以上で、API トークンを発行したチームの指定したチャンネルに投稿される。はず。

しばらくつかっているけど、Slack は普段から立ち上げているし、ざっくり未読も管理してくれるので、そこそこ満足している。