Slackのカスタム絵文字によるコミュニケーション活性化

武蔵野アドベントカレンダーの企画が発足した某Slackチームでは日々多くのカスタム絵文字が生み出され、活発に利用されています。絵文字によるリアクションはポチッとクリックするだけなので文章を書いて投稿するよりも気軽に行えるため、ROM率を下げる効果があり、コミュニケーション活性化につながります(注：筆者の体感)。

本記事では、執筆時点でSlack Web APIを用いて某Slackチームから取得できたメッセージのデータから絵文字の利用状況を分析しました。

| 項目 | 値 |
|:--|:-:|
| ユーザ数 | 656 |
| 絵文字数 | 1756 |
| メッセージ取得数 | 8185 |

無料プランのため過去のメッセージが消えてしまっており、期間と数があまり多くないのが残念です。取得できたメッセージの期間は `11/28(火) 15:44 ～ 12/4(月) 1:54` でした。

絵文字数1756個は圧巻です。なお、多くの絵文字は [Slack Reaction Decomoji](https://github.com/oti/slack-reaction-decomoji) を導入後、これにインスパイアされたSlackチームの住人が勝手に作って増やしていったものです。

# 絵文字リアクションTOP10

| 順位 | 数 | 絵文字 | name  |
|:-:|:-:|:-:|:-:|
| 1 | 235 | <img width="48" alt="iihanashi.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/81801a49-802b-7b81-ab4a-73d2b8a80077.png"> | iihanashi |
| 2 | 164 | ![ukeru.png](https://qiita-image-store.s3.amazonaws.com/0/31907/10c40101-643c-66be-850f-851368a93a39.png) | ukeru |
| 3 | 143 | ![otukaresama.png](https://qiita-image-store.s3.amazonaws.com/0/31907/be937c01-5c1c-0e2c-54bc-919367f0faa4.png) | otukaresama |
| 4 | 139 | <img width="48" alt="soudane.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/10a82680-7cbe-69b7-c41f-cee04a9fb2ca.png"> | soudane |
| 5 | 136 | ![wakaru.png](https://qiita-image-store.s3.amazonaws.com/0/31907/bb771525-1a66-49d3-2c5c-0b78bc6f6dc1.png) | wakaru |
| 6 | 123 | <img width="48" alt="sore.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/b3a8def2-1e57-7eca-589b-88388dc96b97.png"> | sore |
| 7 | 122 | ![wwww.png](https://qiita-image-store.s3.amazonaws.com/0/31907/6234cbb0-1cf2-b874-efaf-b31b687dd225.png) | wwww |
| 7 | 122 | :thumbsup: | +1 |
| 9 | 93 | ![naruhodo.png](https://qiita-image-store.s3.amazonaws.com/0/31907/2978edf4-c8ef-6b45-d39e-fc409e810603.png) | naruhodo |
| 10 | 76 | ![hai.png](https://qiita-image-store.s3.amazonaws.com/0/31907/e90e19ff-9143-5429-790b-4cc1ef007229.png) | hai |

主にリアクションとして使われている絵文字はオーソドックスなもので、半数は [Slack Reaction Decomoji](https://github.com/oti/slack-reaction-decomoji) のものでした。元祖デコモジの使い勝手はさすがと言えます。肯定や相槌を示す絵文字が多く見られますが、1位の<img width="32" alt="iihanashi.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/81801a49-802b-7b81-ab4a-73d2b8a80077.png">はどのように使われるのかあまり想像つかないのではないでしょうか。
下記に、<img width="32" alt="iihanashi.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/81801a49-802b-7b81-ab4a-73d2b8a80077.png">の利用例を示します。リモート勤務に関する議論の一幕です。

![iihanashi.png](https://qiita-image-store.s3.amazonaws.com/0/31907/bb61bdce-8630-495f-d4f6-0e01c118b6d6.png)

このように、「いい話だな」と思った時に使える便利リアクションです。

# 発言内で使われる絵文字

絵文字は上記のようにリアクションとして使う以外にも、発言の中で使うこともできます。

---

![lagopus.png](https://qiita-image-store.s3.amazonaws.com/0/31907/65ece9d7-3fd9-b80d-f4e8-907a7474794c.png) (lagopus) 

オープンソースのソフトウェアスイッチであるLagopusのロゴです。プロダクトのロゴを絵文字にしていると会話ログの視認性がよくなって便利かもしれません。

![lagopus_ex.png](https://qiita-image-store.s3.amazonaws.com/0/31907/4a40656f-1f5b-2738-7d14-1db3b20230e0.png)

---

<img width="48" alt="tamachi.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/a3072134-551f-dc9f-3e93-a2ff86c63482.png"> (tamachi) 

一般には田町駅のことですが、某Slack内では田町にある特定のオフィスビル、もしくはそこを拠点にしている組織のことを指します。<img width="32" alt="tamachi.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/a3072134-551f-dc9f-3e93-a2ff86c63482.png">以外にも<img width="32" alt="musashino.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/10639688-3a15-49bf-61ae-0110564077fb.png">や<img width="32" alt="toyosu.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/d8174d72-e0b1-04dc-c478-0aee8d389360.png">などがあります。

![tamachi_ex.png](https://qiita-image-store.s3.amazonaws.com/0/31907/cd355d2e-55b2-3655-7324-2863a74a72f2.png)

---

<img width="48" alt="minaseinori.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/a6534845-534d-aff6-c05d-9ba50cbe021a.png"> (minaseinori)

先日22歳の誕生日を迎え、初のソロライブを成功させた声優の水瀬いのりさんの絵文字です。他にも20人以上の女性声優の名前が絵文字化されています。

![minaseinori_ex.png](https://qiita-image-store.s3.amazonaws.com/0/31907/d1b084b4-1d50-ebd4-e40c-27e41be46dcb.png)

# その他の面白い絵文字

今回取得したログの中では使われていなかったり、ランキング圏外だったものの中からいくつか面白い絵文字を紹介します。

## 2文字絵文字

<img width="48" alt="deep1.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/ddbb2246-2da8-f1e3-f1ab-741062c22b95.png"> <img width="48" alt="deep2.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/f7071c80-19c3-4b41-b233-b876a2625172.png">

少し間が抜けた感じが親しみやすさを生む絵文字です。

---

<img width="48" alt="waffle.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/4585081d-8306-eb6a-58e9-32082f3426c7.png"> <img width="48" alt="waffle2.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/1cfc91c8-daa7-a924-dccf-71497c7b8d08.png">

発言を続けるよう促したり、期待を示すために使います。
下記は入社2年目のある社員が社内での成果発表会に向けて意気込みを語った様子です。

![waffle.png](https://qiita-image-store.s3.amazonaws.com/0/31907/e6bacbb6-9afe-1e92-867c-29587ce4b5c4.png)

## 細かすぎて読めない

<img width="48" alt="chinoizumiwokunde.png" src="https://qiita-image-store.s3.amazonaws.com/0/31907/2030d5bd-d471-98ac-fef9-fd19e956d8eb.png">

「知の泉を汲んで研究し実用化により世に恵を具体的に提供しよう」

武蔵野地方に存在する石碑に刻まれた言葉だと言われています。

# まとめ

上記に示したものは某Slackに1756個登録されているカスタム絵文字のうちのほんの一例です。カスタム絵文字を活用することでチャットが楽しくなり、コミュニケーションの活性化につながることがお分かりいただけたのではないでしょうか。
「ROMが多くて過疎ってる」「堅苦しいやり取りが多くコミュニケーションが捗らない」などのお悩みをお持ちのSlackチーム管理者の方、まずは [Slack Reaction Decomoji](https://github.com/oti/slack-reaction-decomoji) の導入をおすすめします。
その後、[絵文字ジェネレーター](https://emoji.pine.moe/)などを使ってチームに合った絵文字を作成し導入していくと良いでしょう。

# おまけ

最後に、今回Slack Web APIからデータを集めるために利用したPythonスクリプトを貼り付けておきます。Web APIを叩いてリモートにあるデータを集めて何かする場合、毎回APIを叩きまくるのは時間がかかる上にお行儀が悪いです。きっちりやるならばMySQLなどのRDBMSに構造化して格納するのが王道でしょうが、API仕様を確かめながら試行錯誤する段階では下記のようにRedisにPythonオブジェクトをまるごと放り込んでしまうと再利用が簡単にできて便利です。
APIの `channels.list` を叩いて得られるリストをRedisの `channels` キーに格納し、チャンネル毎のメッセージのリストをAPIの `channels.history` で取得、Redisの `messages:[ch名]` キーに格納しています。

```py3:fetch_messages.py
import os
import time
import pickle
import datetime

from slackclient import SlackClient
from redis import Redis

import logging
logging.basicConfig(
  format='%(asctime)s %(message)s',
  level=logging.INFO)

# dotenvで環境変数読み込み
from dotenv import load_dotenv, find_dotenv
load_dotenv(find_dotenv())

# Redis のデータを消すまでの秒数
#TTL = 3600 # seconds
TTL = 3600 * 24 * 3 # seconds

token = os.environ['SLACK_API_TOKEN']
slack = SlackClient(token)
redis = Redis()

channels = redis.get('channels')
if channels is None:
  logging.info('fetch channels.list')
  res = slack.api_call('channels.list')
  assert res['ok'] is True
  channels = res['channels']
  redis.setex('channels', pickle.dumps(channels), TTL)
else:
  channels = pickle.loads(channels)

logging.info('%d channels', len(channels))

for channel in channels:
  messages = redis.get('messages:%s' % channel['id'])
  if messages is not None:
    logging.info('skip %s', channel['name'])
    continue
  has_more = True
  latest = datetime.datetime.now().timestamp()
  messages = []
  while(has_more):
    res = slack.api_call('channels.history', channel=channel['id'], latest=latest)
    if res['ok'] is False:
      raise RuntimeError(res['error'])
    if len(res['messages']) == 0:
      break
    latest = res['messages'][-1]['ts']
    has_more = res['has_more']
    messages.extend(res['messages'])
  logging.info('channel %s has %d messages', channel['name'], len(messages))
  redis.setex('messages:%s' % channel['id'], pickle.dumps(messages), TTL)
  time.sleep(1)
```