post: 2023-08-04
update: 2023-08-04
INDEX ▶
GAS, Feedly, ChatGPTでSlackに技術記事と要約をシェアするBotを作った
AI関連のブログ記事を社内Slackでシェアしようということになりどうせなら自前で実装しようと思い、作りました。
構成
- GAS
- claspをさらにラップしたasideというのが最近でたので使ってみた
- linter, test, 環境ごとのデプロイ設定などがclaspに組み込まれた感じになってた
- aside(github)
- ただしgoogle公式でサポートしているものでは無いので注意(説明)
- Feedly
- AI関連の記事のフィードを管理するように使った
- RSS管理ツールで有名なのはFeedlyかInoreaderくらいだと思われる
- APIも充実しているので使いやすい
- ただし、無料プランだと30日に1回、tokenを手動で更新する必要がある
- 使用したAPI
- Mixes API: 登録したフィードからFeedly側でおすすめ記事をチョイスしたものを取得する
- Marers API: 既読処理
- ChatGPT
- 社内でAzureが好きにある程度使える環境があるのでそれを使用
- Azure ChatGPTをデプロイし、パブリックAPIとして使えるように準備しておく
フロー
だいたいこんな感じです
- Feedly Mixes APIで記事を取得(複数件)
- Feedlyデータ1件ごとの処理
- Feedlyデータからtitle, urlを取得
- Feedlyデータの使用上、記事内容(content)が含まれていないパターンがあるらしい。その場合はurlをfetchして記事内容を取得する。
- 記事内容を元にChatGPTで記事要約
- title, url, 記事要約をslack通知用に見やすく加工する
- Feedly Markers APIで取得したデータの既読処理を行う
はまったポイント
- GASでは通常外部パッケージが使えない
- 以前も同じ問題に当たった気がする、すっかり忘れていた。
- claspにwebpackだとかの設定をすればいける(以前はそうした)が、忘れてしまったので今回はやめる
- 使いたかったのがdayjsのみだったのでネイティブのDateクラスで頑張った
- GASのデバッグが止まることがある
- 特に記事内容文字列からタグを削る処理等でステップ実行してるとき等
- 原因は分からないが、GAS上のメモリ問題?
- 始めはエラーになっていると勘違いして色々試したが、通常実行すると問題無かったので一旦無視することにした
- Feedlyで永遠に同じ記事を取得してしまう
- 単純に既読処理をしていなかった
- 既読処理をしつつ、Mixes APIのパラメータに
unreadOnly
をつけると未読のもののみ取得できる
出来上がり
このような感じに。