背景
まとめたメモは、Notionのリマインド機能を使って、1か月後に「自分にメモを読み返すように通知」を飛ばしています
こちらのブログに刺激を受け、
自分も読書ログを書いているが、完全に書きっぱなしになっているのをなんとかしたい!からはじまった。
各種リマインドツールを使うのでもよかったが、つくりたくなってしまったので、しょうがない。
読書ログ
読書ログはパーソナルなKibelaに書き溜めてある。
>引用 一言コメント
の形でまとめてある。
リマインド通知の全体像
Cloud Schedulerから定期的にHTTPリクエストをCloud Functionに送り、
Cloud Functionはリクエストをトリガーにスプレッドシートにまとめてある読書ログをSlackに通知する。
Kibelaからスプレッドシートへ
Kibela APIを直接利用してもよいが、ちょっと自分のKibelaが整理できておらず、ゴミが混じってしまうので、
というステップを挟むことにした。
query { search(query: "読書ログ", first: 100, sortBy: RECENT) { edges { node { title, url, } } } }
上記のクエリをKibela APIで実行、結果を整形して、下記のようなスプレッドシートをつくる。
スプレッドシートの内容を取得
GitHub - googleapis/google-api-php-client: A PHP client library for accessing Google APIs
// スプレッドシートからデータ取得 $client = new Client(); $client->useApplicationDefaultCredentials(); $client->addScope(Sheets::SPREADSHEETS); $service = new Sheets($client); $ssId = 'シートID'; $range = 'シート名!範囲'; $result = $service->spreadsheets_values->get($ssId, $range); $books = $result->getValues();
Slackへ通知
// Slackに通知する $logger = new Logger('slack'); $logger->pushHandler( new SlackWebhookHandler( $_ENV['SLACK_WEBHOOK_URL'], null, null, true, '', true, true, Level::Info ) ); $logger->info("<@gamu1012>\n 読書ログを読み返してみよう!\n <{$book[1]} | {$book[0]}>\n");
Slack通知はmonologのHandlerを利用してしまうのが楽なので、上記のように実装した。
Cloud Function
依存関係の指定 | Google App Engine スタンダード環境のドキュメント | Google Cloud
上記の公式を参考に、スプレッドシートからの取得とSlack通知を組み合わせる。
<?php require_once __DIR__ . '/vendor/autoload.php'; use Google\Client; use Google\Service\Sheets; use GuzzleHttp\Psr7\Response; use Monolog\Handler\SlackWebhookHandler; use Monolog\Level; use Monolog\Logger; use Psr\Http\Message\ServerRequestInterface; function execute(ServerRequestInterface $request) { // HeaderのAPIキーのチェック 略 // スプレッドシートからデータ取得する 略 // 通知する本を抽選する 略 // Slackに通知する 略 // レスポンス $now = new DateTimeImmutable(); $response = ['book' => $book[0], 'url' => $book[1], 'send_at' => "{$now->format('Y-m-d H:i:s')}"]; return json_encode($response) . PHP_EOL; }
下記のようなコマンドでデプロイする。
gcloud functions deploy my-function \ --gen2 \ --region=asia-northeast1 \ --runtime=php81 \ --source=. \ --entry-point=execute \ --trigger-http \ --allow-unauthenticated \ --env-vars-file .env.yaml
Cloud Schedulerで定期実行
Cloud Schedulerはcronのように設定できるので、上記のように設定する。
最初は週1で設定していたが、物足りなかったため、今は月水金と土日の朝10時にSlackに通知している。
HTTPリクエストの実行も簡単で、下記のように設定する。
サービス名
完全にプライベートなツールだが「Blueberry」と読んでいる。*1