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

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

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

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

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

絵文字数1756個は圧巻です。なお、多くの絵文字は Slack Reaction Decomoji を導入後、これにインスパイアされたSlackチームの住人が勝手に作って増やしていったものです。

絵文字リアクションTOP10

順位 絵文字 name
1 235 iihanashi.png iihanashi
2 164 ukeru.png ukeru
3 143 otukaresama.png otukaresama
4 139 soudane.png soudane
5 136 wakaru.png wakaru
6 123 sore.png sore
7 122 wwww.png wwww
7 122 :thumbsup: +1
9 93 naruhodo.png naruhodo
10 76 hai.png hai

主にリアクションとして使われている絵文字はオーソドックスなもので、半数は Slack Reaction Decomoji のものでした。元祖デコモジの使い勝手はさすがと言えます。肯定や相槌を示す絵文字が多く見られますが、1位のiihanashi.pngはどのように使われるのかあまり想像つかないのではないでしょうか。
下記に、iihanashi.pngの利用例を示します。リモート勤務に関する議論の一幕です。

iihanashi.png

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

発言内で使われる絵文字

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


lagopus.png (lagopus)

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

lagopus_ex.png


tamachi.png (tamachi)

一般には田町駅のことですが、某Slack内では田町にある特定のオフィスビル、もしくはそこを拠点にしている組織のことを指します。tamachi.png以外にもmusashino.pngtoyosu.pngなどがあります。

tamachi_ex.png


minaseinori.png (minaseinori)

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

minaseinori_ex.png

その他の面白い絵文字

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

2文字絵文字

deep1.png deep2.png

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


waffle.png waffle2.png

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

waffle.png

細かすぎて読めない

chinoizumiwokunde.png

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

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

まとめ

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

おまけ

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

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)