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

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

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

できることはシンプル。

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


## Slackでの表示
細かな情報はいくらでも変えられるけど、自分は以下のような構成にしている。
![スクリーンショット 2018-05-02 23.54.35.png](https://qiita-image-store.s3.amazonaws.com/0/14275/3b14b5a4-eccc-b96b-e133-e00bc4f8e9ed.png)

## 競合との比較
自分で作るにあたり、類似サービスとして[PocketRocket](http://getpocketrocket.com/)なるものを利用したが、以下の点が不服だった。以下の要件でよければ、PocketRocketを利用したほうがいい。

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


## 作り方
テンプレつくったので、ここからコピーすると楽。
[テンプレのスプレッドシート](https://docs.google.com/spreadsheets/d/1YM3nYMm6jYEbak6NTqJ9k9QYaB8ZBGa4SSkoaCzsLFU/edit#gid=0)

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

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

### Pocket側の準備
#### PocketでAppを作成
[Pocket: Create an Application](https://getpocket.com/developer/apps/new) からアプリケーションを作成。
Permissionsは `Retrieve`, Platformは `Web` に設定。
設定したらconsumer_keyが発行されるのでメモして、access tokenの取得へ進む。
![スクリーンショット 2018-04-30 4.15.01.png](https://qiita-image-store.s3.amazonaws.com/0/14275/74ac774e-712d-0262-9172-c52cd8c59467.png)

#### Pocketのaccess_tokenを取得
自分のアカウントだけでいいから、curlだけですませる。
[Pocket Developer Program: Pocket Authentication API: Documentation](https://getpocket.com/developer/docs/authentication)

##### 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](https://qiita-image-store.s3.amazonaws.com/0/14275/5fb7f23d-f04b-3f10-25d6-3ed798135507.png)


[Pocket: 接続済みのサービスとアプリケーション](https://getpocket.com/connected_applications) に自分が作成したアプリケーションが表示されていれば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](https://slack.com/apps/A0F7XDUAZ)  でWebHookを作成して、URLを取得する。
![スクリーンショット 2018-05-02 22.10.48.png](https://qiita-image-store.s3.amazonaws.com/0/14275/c95c6ce3-59bc-0fb7-1cfb-8c17a47c7640.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](https://qiita.com/chihiro/items/d23692c308c89e1b1ee2) などを参考にトリガーを作成する。
自分は6時間に1回実行している。

## 自分が気にしたところ
- リンクURLは、Pocketのキャッシュデータがあるページへのリンク
    - すでにリンクが切れている情報も表示できるため
    - アイテムの削除までの導線が短くなるため
- Slackに記事のExerptも表示
    - 本当はタグも表示したかったけど、APIに入っていなかった
- 日時表示の部分はMomentのライブラリを利用
    - [https://tonari-it.com/gas-moment-js-moment/](https://tonari-it.com/gas-moment-js-moment/)

## まとめ
GAS便利。