ふれっしゅのーと

ふれっしゅのーと

趣味に生きる30代エンジニアが心に移りゆくよしなし事をそこはかとなく書きつくるブログ

GASでAPIを叩いてPocketの未読数をGoogleスプレッドシートに連携する

あとで読みたいWebサイトの管理に「Pocket」を愛用してます。かれこれ8年目。

ついつい「あとで読む」を溜めすぎてしまうので、どれぐらいのペースで「あとで読む」を消化できているか可視化するために、以前、下記の記事を書きました。

fffw2.hateblo.jp

1年半ぐらい問題なく動作していたのですが、突然2022年8月10日から未読数を取得できなくなってしまいました。自分でAPIを叩くのが面倒で第三者のサービスに依存していたのですが、こういうときに手も足も出なくなってしまうのが弱いところ。

やむを得ませんね。自分でAPIを叩いてみますか(重い腰を上げる)

Pocket APIを叩いて未読数を取得するまでの道のり

開発者用ページでアプリケーションを作成

https://getpocket.com/developer/ にログインして「Create a New App」からアプリケーションを作成します。作成後に「CONSUMER KEY」(コンシューマーキー)が表示されるのでメモしておきましょう。

<作成例>

curlでアクセストークンを取得

アクセストークンを取得するまでがちょっと大変でしたが、下記の記事を参考にしたらうまくいきました。

ikeyu0806.hatenablog.com

自分の環境で実行したコマンドを載せておきます。…といっても参考記事とほぼ同じ内容です。ローカルサーバーをpythonで起動してる点が違うぐらい。

# リクエストトークン取得
curl -X POST -H "Content-Type: application/json" -H "X-Accept: application/json" -d '{"consumer_key":"{コンシューマーキー}", "redirect_uri":"http://localhost:8080"}' https://getpocket.com/v3/oauth/request

# リダイレクト先のローカルサーバーを起動
python -m http.server 8080

# 認可
open -a '/Applications/Google Chrome.app' https://getpocket.com/auth/authorize?request_token={リクエストトークン}&redirect_uri=http://localhost:8080

# アクセストークン取得
curl -X POST -H "Content-Type: application/json" -H "X-Accept: application/json" -d '{"consumer_key":"{コンシューマーキー}", "code":"{リクエストトークン}"}' https://getpocket.com/v3/oauth/authorize

<認可時の画面>

APIテスト

正常にアクセストークンを発行できていれば、下記コマンドで未読記事リストをJSON形式で取得できます。(膨大なのでhead -n 100で先頭100行のみ表示してます)

curl -X POST -H "Content-Type: application/json" -H "X-Accept: application/json" -d '{"consumer_key":"{コンシューマーキー}", "access_token":"{アクセストークン}"}' https://getpocket.com/v3/get | jq | head -n 100

jq がないよ!って怒られたら brew install jq してください。

Google Apps Script(GAS) でAPIを叩く

Googleスプレッドシートを開き、A1セルに「date」、B1セルに「count」と入力します。そして 拡張機能>Apps Script から Google Apps Script(GAS) のエディターを起動して、下記のソースコードをコピペしてください。日時と未読数を取得して、Googleスプレッドシートの最終行の次の行に書き込むスクリプトです。

function countPocketUnreadArticles() {
  var date = Utilities.formatDate(new Date(), 'Asia/Tokyo', 'yyyy-MM-dd HH:mm:ss');
  var count = countItems();

  Logger.log(date + ' ' + count);

  var spreadsheet = SpreadsheetApp.openById('{GoogleスプレッドシートのID}');
  var sheet = spreadsheet.getSheetByName('シート1');
  var lastrow = sheet.getLastRow();
  var recordrow = lastrow + 1;
  sheet.getRange("A" + recordrow).setValue(date);
  sheet.getRange("B" + recordrow).setValue(count);
}

function countItems() {
  const url = "https://getpocket.com/v3/get";
  const consumer_key = "{コンシューマーキー}";
  const access_token = "{アクセストークン}";
  const data = {
    "consumer_key":consumer_key,
    "access_token":access_token
  };
  const options = {
    "method" : "POST",
    "contentType" : "application/json",
    "payload" : JSON.stringify(data)
  };
  const response = UrlFetchApp.fetch(url, options);
  const pocketItems = JSON.parse(response).list;
  const itemIds = Object.keys(pocketItems);
  return itemIds.length;
}
  • {コンシューマーキー}{アクセストークン}には先述のAPIテストで使った値を入力してください。
  • {GoogleスプレッドシートのID}には、GoogleスプレッドシートのURLのhttps://docs.google.com/spreadsheets/d/の後ろの文字列を入力してください。

試しに「実行」ボタンを押してみて、うまくGoogleスプレッドシートに書き込まれたら成功です。

仕上げに、自動実行されるようにトリガーを設定しておきましょう。これで完成です!

<トリガーの設定例>

完成

最終的にはGoogleスプレッドシートにこんな感じで「あとで読む」の未読数が時系列順に蓄積されていきます。グラフは後付けでGoogleスプレッドシートの標準機能を使って描画しました。

これで再び「あとで読む」がどれだけ残っているか視覚的に把握できるようになりました。あとはひたすら「あとで読む」を消化するだけですね……(遠い目)