slackの各種ランキングを見たい！！！

本記事は [株式会社ピーアールオー（あったらいいな！を作ります） Advent Calendar 2020](https://qiita.com/advent-calendar/2020/pro-japan1) の17日目です

昨日(16日目)は [@pro_matuzaki](https://qiita.com/pro_matuzaki) さんの「[Notion使う上での小ネタや注意点など](https://qiita.com/pro_matuzaki/items/2e6724aefddd921e40c0)」でした
Notion気になってきた:pencil:

是非、よろしければこちらもどうぞ
[2019年のカレンダーはこちら](https://qiita.com/advent-calendar/2019/pro-japan1)

### それでは本題

# :muscle:やりたいこと(実は技術面の目的もあり):muscle:
* AzureFunctions 触ってみたい(AWS以外にAzureも社内のお試し用アカウントができたので使ってみる)
* Python触ってみたい(ド素人)
* slackの情報を集計したい

## :trophy:slackの情報を収集して、作りたいランキング:trophy:
今年、使われたリアクション ランキング
今年、[リアクションエンジニア](https://qiita.com/m_sasaki/items/082764df7a48062bb84c) ランキング(リアクションいっぱいした人)
今年、リアクションレシーバー ランキング(リアクションいっぱい受けた人)
今年、いっぱい発言した人 ランキング

# :tada:結果:tada:
##### チャンネル別使われたリアクション(お試し用ワークスペース)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/b0b64cba-e866-690c-893b-1d81f48c09bb.png)
##### 全チャンネルトータル使われたリアクション(お試し用ワークスペース)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/49e72f19-63f6-3766-3c18-a900634d2e87.png)
##### 人別(お試し用ワークスペース)　※ほぼ黒塗りでごめんなさい
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/80fb3c63-091b-cc86-4948-ad37894fcd30.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/2e1795b5-8d27-0adc-8b69-7643b2e429b7.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/69ce279e-dabf-ca89-cbae-28d79da0762d.png)

## :robot:AzureFunctions(Python)とslack連携:robot:
#### ①AzureFunctions(Python)作る
Azureアカウント作りましょう
AzureFunctions(Python)作りましょう
※[現時点では無料枠でPython3.8は使えなかった](https://docs.microsoft.com/en-us/answers/questions/148581/i-get-error-when-trying-to-create-azure-function-f.html)

#### ②開発のためにローカル環境構築(VS Code)
AzureポータルのAzure関数の追加に記載されている手順を実施
[windowsはpipの前に「py -m」が必要](https://gammasoft.jp/python/python-library-install/)

* Pythonインストール(①で作成済みのAzureのバージョンと併せましょう)
* VS Codeインストール
* VS CodeにAzure Functionsインストール
* Node.js・npmのインストール
* VS Codeで新しい関数を作成

slackのIncoming Webhookを作成

Pythonでslackに投稿するコードを作成
ローカルでURLを叩いて、slackに「ぼちぼちですよ」が投稿されることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/f9a9737c-f683-91d3-56df-918c339e21a5.png)

#### ③slackの発言をトリガにAzureFunctions(Python)を動作させる
ローカルで動作した環境をAzureFunctions(Python)で動作させる
②で作成したコードをデプロイしておく
[AzureFunctions(Python)で動作させるために必要なライブラリはrequirements.txtに記載してデプロイすることで解決](https://qiita.com/yuppejp/items/36b0fee8fb9ac09e75d0)

slackのOutgoing Webhookを作成
slackの発言をトリガにAzureFunctions(Python)が呼び出されるように設定

slackの発言から②と同じ投稿がされることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/320579/e57a82e3-d445-6ebe-ab25-3ed27afb70f8.png)

## :construction_worker:Pythonの中身を作り込む:construction_worker:
#### ①slackAPIで情報を取得してみる(まずは色々お試し)
* [slackapi](https://github.com/slackapi/python-slack-sdk)
* [PythonでSlackの絵文字ランキングを作ってみた話](https://m-gild.com/blog/1652)
* [今年もらったSlackのリアクションを集計してニヤニヤしよう](https://qiita.com/kanaxx/items/fbf40f500e057b0e8b12)
* [日付⇒UNIX時間変換](https://keisan.casio.jp/exec/system/1526003938)

#### ②全体共通処理を作成する
* ユーザー名はidからnameに変換しないと誰か分からないので取得しておく(users_listを利用)
* publicチャンネル一覧を取得する(conversations_list)
* 発言履歴を取得する(conversations_history)
* 発言履歴にはページングがあった(next_cursorを利用)
* 年単位で集計したかったので、年指定(oldest、latestを利用。指定はUNIX時間)
* スレッドは対応間に合わず:joy:

#### ③リアクションランキングを作成する
* 発言に対するリアクションを蓄積する(blocksのemojiとreactions)
* 蓄積したリアクションを集計する(collections.Counterの利用)
* 集計した内容を昇順に並び替え(sortedの利用)
* slackにTOP10を投稿(chat_postMessage)

#### ④リアクションエンジニアランキング(リアクションいっぱいした人)を作成する
* 発言にリアクションしたユーザーを蓄積する(reactionsの中にusers)
* 蓄積したユーザーを集計する(collections.Counterの利用)
* 集計した内容を昇順に並び替え(sortedの利用)
* ユーザーidをユーザー名に変換して、slackにTOP10を投稿(chat_postMessage)

#### ⑤リアクションレシーバーランキング(リアクションいっぱい受けた人)を作成する
* リアクションされたユーザーを蓄積する(reactionsの中のuser)
* 蓄積したユーザーを集計する(collections.Counterの利用)
* 集計した内容を昇順に並び替え(sortedの利用)
* ユーザーidをユーザー名に変換して、slackにTOP10を投稿(chat_postMessage)

#### ⑤いっぱい発言した人ランキングを作成する
* 発言したユーザーを蓄積する(blocksの中のuser)
* 蓄積したユーザーを集計する(collections.Counterの利用)
* 集計した内容を昇順に並び替え(sortedの利用)
* ユーザーidをユーザー名に変換して、slackにTOP10を投稿(chat_postMessage)

# :bulb:最後に:bulb:
これで年末年始の楽しみが1つ増えました
さて、今年のランキングは:trophy: