はてなブックマークのお気に入りのブックマークを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, '>').replace(/</g, '<'),
'> ',
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 は普段から立ち上げているし、ざっくり未読も管理してくれるので、そこそこ満足している。