Azure FunctionとSlack Appを連携して新規Qiita記事を通知するアプリを作成するためにやったこと

こんにちは。torippy1024です。
会社でAzureに関してラボ環境を貸してもらっていろいろいじっているので、簡単なアプリを作ってみました。
Azureラボ環境メンバーのQiitaアカウントをストーキングし(失礼)、メンバーが新しい記事が書いたらそのリンクを取得してSlack Channelに通知してくれるアプリです。

作ってしまえば大したことがないのですが、Azure functioinの勉強にはなりました。
簡単ではありますが、処理フローと環境構築の手順を書いておきます。

# 簡単なアーキテクチャ
アーキテクチャは以下となります。

![20220313_Qiita記事.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/684500/9d36963c-a715-1a8d-3994-5f22e205d863.jpeg)

# 処理フロー
[1]Qiita API実行
　Azure FunctionのTimer Triggerで起動します。
　環境変数で指定したQiita Token、対象のUser List、検索範囲日Search Scopeを使用して
　Qiita APIを実行してユーザー毎の記事一覧を取得し、記事の投稿日が検索範囲日内にであるか絞り込みます。(今回は毎日9時に実行させるようにしたのでSearch Scope=1日とし、1日以内に投稿された記事を対象とすることにしました)
[2]記事URLを返却
　1日以内に投稿された記事があったら、そのURLを取得します。
[3]Slack App実行
　投稿先Slack Channel、Slack Token、Article URLを使用してSlackチャンネルに投稿します。

# 環境構築に必要な作業
[1]投稿先のSlack Channel開設
[2]Azure functionから叩かれるAPIを用意するSlack App作成
[3]Qiitaトークンの取得
[4]開発のためのローカル環境用意
[5]Azure Functionによる新規プロジェクト設定

会社によっていろいろな制限があると思います。
[2]については、大きな会社であれば、Slack Appを作成する際、承認が必要となっており手続きが大変になることもあると思います。
[5]については、Azure Functionには無料枠があるので、それを越えなければ個人アカウントでも問題ないと思います。
(参考：https://azure.microsoft.com/ja-jp/pricing/details/functions/)

では、それぞれについて解説します。

# [1]投稿先のSlack Channel開設
テスト用のSlack Channelを作成します。特に言うことはありません。

# [2]Azure functionから叩かれるAPIを用意するSlack App作成
上記のSlack Channelに投稿してくれるSlack Appを用意します。
大雑把には以下の作業を行います。

[2-1]Slack App作成
　以下URLからApp名と作成先Workspaceを決めてSlack Appを作成します。
　作成先Workspaceは、投稿先Slack Channelが所属しているWorkspaceを指定します。
　https://api.slack.com/apps
　アイコンや説明文をどこまでこだわるかはお好みです。後で変更可能なので、最初は適当でいいでしょう。
[2-2]Slack Appへの権限を付与
今回は以下の権限を付与しました。
　・chat:write
　・chat:write:user
　・chat:write:bot
[2-3]Slack Appをインストール
　投稿先Slack Channelが所属しているWorkspaceにSlack Appをインストールします。
　ここで、場合によっては管理者側の承認などが発生します。
[2-4]tokenの発行
　Slack App作成画面にて、トークンが発行できる画面があるので、そこでアクセストークンを発行します。
　"xoxb-"ではじまるトークンがBot用です。今回はBotとしてデプロイしたため、こちらのトークンを使用しました。
[2-5]Slack AppをSlack Channelに追加
　インストールが完了したら、Slack Channelの設定画面から、Integration - Appを選択し、作成したSlack Appを登録すれば準備完了です。

Qiitaではありませんが、Zennの以下記事が参考になります。(というか、この記事は以下記事のほぼ二番煎じ・・・・・・)
https://zenn.dev/nyancat/articles/20211219-create-slack-app

# [3]Qiitaトークンの取得
　QiitaのAPIに関するドキュメントは以下にあります。
　https://qiita.com/api/v2/docs

　使ったAPIは、「ユーザー毎の投稿取得」のみです。この中から「created_at」で対象となる範囲の投稿日の記事だけを抽出すればよいです。
```
GET /api/v2/users/:user_id/items
```

　ちなみに、上記APIを実行するだけであれば実は不要だったのですが、QitaのAPIの中にはトークンを付与していないと実行できないAPIもあります。
　その場合は、自分のQiitaアカウントのアイコンをクリックし「設定」-「アプリケーション」から作成しましょう。一度しか表示されず、忘れてしまったら再作成する必要があります。(とはいえ、再作成もそんなに時間がかかるものではないですが)
　スコープは「read_qiita」のみでOKです。

# [4]開発のためのローカル環境用意
　人によって異なると思いますが、大したことはありません。
　私は会社貸与のmacbookにVSCodeを入れて開発することにしました。

　Macbook用のVSCodeをダウンロードしてインストールします。
　https://code.visualstudio.com/download

その後、VScodeを起動した後、左側のメニューバーから「拡張機能」を選択し、
「Azure Account」と「Azure Function」の拡張機能をインストールしたらとりあえず準備環境です。
　(githubとの連携などは省略)

[5]Azure Functionによる開発
　投稿先のSlack Channelが作成でき、Slack Appのインストールが終了し、トークンが取得でき、開発環境も整ったら後は作るだけ！！です。(ていうかそれがメインですが・・・・・・)
　
　VSCode左のメニューバーのAzure機能を選択し、稲妻マークをクリックして「Create New Project」を選択して新しくプロジェクトを作成します。いろいろ聞かれるのですが、以下は私が指定した一例です。

|項目名|値|補足|
|-|-|-|
|言語|python|なんとなくpython3を選びました|
|トリガー|Timer Trigger|時間指定で実行するため。最初は"HTTP Trigger"のほうが作りやすいかもしれません|
|関数名|TimerTrigger1|デフォルトの値|
|スケジュール|* */1 * * * *|テストのため、1分毎に実行する設定。また時刻はUTCで指定するため注意|
|プロジェクト作成後の動作|新しいウインドウで開く|別にどっちでもいい|


以上です。