[Slack]賞賛のemojiを大量に付けるアプリを作りました

# 背景
* おめでたいときに大量にemojiをreactionする文化がある
* 手で一つ一つreactionをつけるのは大変かと思うので自動化してみた

# 作ったもの
![ezgif.com-video-to-gif.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/80a248b5-3028-b7b7-cac4-a85e975d1a66.gif)

# ざっくりフロー
![emoji-praiser.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/99e640b5-fda6-682b-f070-c955a977ac68.jpeg)


* ユーザはメッセージアクションからアプリを起動
* アプリはポジティブなemojiの中からランダムに選択
* アプリはSlack APIでreactionを付与

# ポジティブなemojiの選定の仕組み

* emojiの感情値マッピングに関する論文から引用
  * Kralj Novak, Petra; Smailović, Jasmina; Sluban, Borut and Mozetič, Igor, 2015, Emoji Sentiment Ranking 1.0, Slovenian language resource repository CLARIN.SI,
  * [こちらから表形式で閲覧可能](http://kt.ijs.si/data/Emoji_sentiment_ranking/)
  * 論文のデータを利用できるライブラリ [emoji-sentiment](https://www.npmjs.com/package/emoji-sentiment) を利用
* **`positive` 指数が0.6以上あるemojiを抽出**
  * なんかよくわからないのもいるが・・・
![スクリーンショット 2019-07-16 20.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/93a818df-3da7-9a20-3b76-e04901b6390c.png)

# Slack APIの設定

メッセージアクションを使ったアプリの情報があまりなかったと感じたのでここで詳しく書いてみる。興味のない人はスキップ推奨。

## メッセージアクションとは

Slackのポストに対してユーザがいろんな操作をできるAPI

👇これ
![image.png](https://qiita-image-store.s3.amazonaws.com/0/79697/3e5e180c-ab13-6713-07f0-83ebc11cec4c.png)

https://api.slack.com/actions

## メッセージアクションの仕組み

内部では以下のようなpayloadを載せて設定したURLにPOSTする。

```
{
  "token": "Nj2rfC2hU8mAfgaJLemZgO7H",
  "callback_id": "chirp_message",
  "type": "message_action",
  "trigger_id": "13345224609.8534564800.6f8ab1f53e13d0cd15f96106292d5536",
  "response_url": "https://hooks.slack.com/app-actions/T0MJR11A4/21974584944/yk1S9ndf35Q1flupVG5JbpM6",
  "team": {
    "id": "T0MJRM1A7",
    "domain": "pandamonium",
  },
  "channel": {
    "id": "D0LFFBKLZ",
    "name": "cats"
  },
  "user": {
    "id": "U0D15K92L",
    "name": "dr_maomao"
  },
  "message": {
    "type": "message",
    "user": "U0MJRG1AL",
    "ts": "1516229207.000133",
    "text": "World's smallest big cat! <https://youtube.com/watch?v=W86cTIoMv2U>"
  }
}
```

add reactionするためには、 `channel.id`(チャンネルを特定する情報), `message.ts`(メッセージを特定する情報)を使用する。

## メッセージアクションの作成

### アクションの設定
* Interactive Componentsを押下
* Web APIのURLを記入する

![スクリーンショット 2019-02-23 11.55.05.jpg](https://qiita-image-store.s3.amazonaws.com/0/79697/ae5b965c-1fbb-10cb-9134-0ac8e84138b0.jpeg)

* Slack APIのスコープが変更されるため、再度認可が必要
* 認可されれば、Slackから使えるようになっている。

### APIトークンの設定
* サーバからAPIを叩くためのアクセストークンを取得
* ここで、Bot Usersを定義すればbotユーザ経由でreactionをつけることができる

![スクリーンショット 2019-07-14 10.31.09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/ada1cef1-2bb8-79b4-9e56-091cfbb9c859.jpeg)

### スコープの設定
* APIに認可するアクションを設定する
* 今回はemojiを付与するアクションを定義するので以下のスコープを追加

```
Add slash commands and add actions to messages (and view related content)
Add or remove emoji reactions for user
```

<img width="714" alt="スクリーンショット 2019-07-14 10.31.26.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/79697/de424ed5-a351-c90f-6c15-b9a85e705ae5.jpeg">

# サーバサイドの設定

* https://github.com/t-morisawa/slack-flash-mob
* 今回はCloud Functionsで動かしている
* reactions.add APIを利用 https://api.slack.com/methods/reactions.add

# 使ってみての感想

* とはいえ文脈を無視したemojiを大量に付けると逆に怒りを買う可能性がないとも言えない。