3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

はじめに

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

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

できることはシンプル。

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

Slackでの表示

細かな情報はいくらでも変えられるけど、自分は以下のような構成にしている。
スクリーンショット 2018-05-02 23.54.35.png

競合との比較

自分で作るにあたり、類似サービスとして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の取得へ進む。
スクリーンショット 2018-04-30 4.15.01.png

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

スクリーンショット 2018-04-30 19.57.59.png

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を取得する。
スクリーンショット 2018-05-02 22.10.48.png

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便利。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?