[テンプレートあり]無料でPocketの記事をランダムにSlackに送る on GAS


はじめに

ブックマークサービスにPocketを利用している。Pocketのリマインダ機能は多くの投票が寄せられているが、いまのところ実装されていない。では、つくろう。

サーバの保守は考えたくないし、設定などを簡単に変更するためにスプレッドシート+GASで管理しよう、と思った。

できることはシンプル。

  • 時間をトリガにして、Pocketに保存されている記事をSlackに送る
    • GASなので、メール送信も簡単にできる
  • 自分一人が利用する

Slackでの表示

細かな情報はいくらでも変えられるけど、自分は以下のような構成にしている。

競合との比較

自分で作るにあたり、類似サービスとしてPocketRocketなるものを利用したが、以下の点が不服だった。以下の要件でよければ、PocketRocketを利用したほうがいい。

  • メールで送られてくる
  • 1日1件のみ
  • 送られる情報は記事タイトルのみ
  • 送られた記事はPocketから削除される

作り方

テンプレつくったので、ここからコピーすると楽。
テンプレのスプレッドシート

必要なスクリプトは設定しているので、赤いセルの部分に、以下の情報を入れると動く。

  • PocketのConsumer Key, Request Token
  • Pocketに保存されているデータの総量 (多めに入れる分には問題ない)
  • Slackのincoming webhookのURL, channel名

Pocket側の準備

PocketでAppを作成

Pocket: Create an Application からアプリケーションを作成。
Permissionsは Retrieve, Platformは Web に設定。
設定したらconsumer_keyが発行されるのでメモして、access tokenの取得へ進む。

Pocketのaccess_tokenを取得

自分のアカウントだけでいいから、curlだけですませる。
Pocket Developer Program: Pocket Authentication API: Documentation

request tokenの取得
$ curl -H "Content-Type: application/json; charset=UTF-8" -X POST \
   https://getpocket.com/v3/oauth/request \
   -d '
{
  "consumer_key" : "<CONSUMER_KEY>",
  "redirect_uri":"http://localhost:8000"
}
'
> code=xxxxx-xxxxxx-xxxxx
アプリケーションの認可

ブラウザで自分の作成したプロジェクトを認可する。
https://getpocket.com/auth/authorize?request_token={code}&redirect_uri=localhost:8000

Pocket: 接続済みのサービスとアプリケーション に自分が作成したアプリケーションが表示されていればOK.

access tokenの取得
curl -H "Content-Type: application/json; charset=UTF-8" -X POST \
https://getpocket.com/v3/oauth/authorize \
-d '
{
  "consumer_key":"<CONSUMER_KEY>",
  "code":"<code>"
}
'
> access_token=xxxxxxx-xxxxxx-xxxxxxxx&username=tomoyamachi

access_tokenが取得できた。

動作テスト

$ curl -H "Content-Type: application/json; charset=UTF-8" -X POST \
https://getpocket.com/v3/get -d '
{
  "consumer_key":"<CONSUMER_KEY>",
  "access_token":"<access_token>",
  "count":1
}
'
{
  "status": 1,
  "complete": 1,
  "list": { (略) },
  "error": null,
  "search_meta": {
    "search_type": "normal"
  },
  "since": 1525232072
}

Slackのincoming webhook URLを取得

Slack > Incoming WebHooks でWebHookを作成して、URLを取得する。

GASの設定

シートに定数を記入

pocketのretrieve APIはランダムな取得に対応していないので、以下の手順でランダム化している。

  1. アイテムを1つ選ぶ
  2. そのあとのn件を取得する
  3. n件の中から、さらにm件に絞る

whole item count: pocketに保存されているアイテム数。1でアイテムの先頭を選ぶときに利用。
なお、ここの数が大きくても、アイテムがなければ再度抽選が走るので、あらかじめ大きな値を設定しておく。5年くらい利用したら、これくらいになるよね、くらいの数値でいいと思う。

fetch item count : 2で1度に取得するアイテム数。
whole item countよりも小さい値にする。

send item count : 送信するアイテム数。
取得したアイテムの中からランダムで送信するものを選ぶ。

トリガーを設定

【GoogleAppsScript】通知時間を詳細に指定する - Qiita などを参考にトリガーを作成する。
自分は6時間に1回実行している。

自分が気にしたところ

  • リンクURLは、Pocketのキャッシュデータがあるページへのリンク
    • すでにリンクが切れている情報も表示できるため
    • アイテムの削除までの導線が短くなるため
  • Slackに記事のExerptも表示
    • 本当はタグも表示したかったけど、APIに入っていなかった
  • 日時表示の部分はMomentのライブラリを利用

まとめ

GAS便利。