エンジニア

2022.04.06

[Slack API]社内Slackのスタンプ利用ランキングを調べてみました。

[Slack API]社内Slackのスタンプ利用ランキングを調べてみました。

ごきげんよう。Sempleです。
在宅勤務も多くなってきた昨今、チャットやテキストでのコミュニケーションにはスタンプなどを用いて、感情表現する機会が多くなっています。

ハンズラボのSlackでも、日々さまざまなスタンプが使われています。いわゆるカスタム絵文字というものですが、非常にユニークなものも多く毎日新たな発見があります。そこで今回は、SlackのAPIを用いて、どんなスタンプが使われているのかを調査してみました。

なお個人が特定されるような公開できないスタンプ等がある場合は、加工いたします。あらかじめご了承ください。

結論

上位10位までの結果はこのようになりました。

下記の条件を調査対象としています。
・全ての公開チャンネル:855件。(アーカイブされたチャンネルも含む。2021年12月2日時点)
・それぞれのチャンネルの直近1000件の投稿。(Slack APIの上限が1000件のため)
・集計対象は、リアクションに用いられたスタンプのみ。投稿内に使用されたスタンプは対象外。

調査結果をざっとみた感じですと、挨拶や労いなどのスタンプが多いようです。ハンズラボでは、それぞれの分報にて出勤や退勤の際に挨拶を添えて投稿する慣習があります。その挨拶投稿へのリアクションスタンプが上位を占めております。面白いですね。

実装してみた。

from collections import Counter
import csv
from datetime import datetime as dt
import time

from slack_sdk.web import WebClient


# トークン
SLACK_API_TOKEN = "xxxx-****-your-token"
# 集計結果を送信するチャンネル
POST_ID = "your_post_id"

START_TIME = dt.now()
client = WebClient(token=SLACK_API_TOKEN)
CHANNELS_LIST = client.conversations_list(limit=1000)

def _get_public_list(CHANNELS_LIST:list):
    """
    Workspaceの全ての公開チャンネルの名称とIDを取得する。

    Parameters
    ----------
    CHANNELS_LIST : list
        ワークスペースに含まれる全ての公開リスト

    Returns
    -------
    _public_list :list
        公開チャンネルの名称とIDを入れたリスト
    """
    _public_list = []
    for i, j in enumerate(CHANNELS_LIST['channels']):
        row_dict = {
            'name' : j['name'],
            'id' : j['id']
        }
        _public_list.append(row_dict)

    return _public_list

def _get_sticker_list(CHANNELS_ID:str):
    """
    任意のチャンネルの会話履歴を取得する。

    Parameters
    ----------
    CHANNELS_ID : string
        会話履歴を取得するChannelのID

    Returns
    -------
    None
    """
    #特定の会話を、APIの上限まで取得する。
    response = client.conversations_history(channel=CHANNELS_ID, limit=1000)

    # 会話履歴から、一つの投稿ごとに処理する。
    for num, post in  enumerate(response['messages']):

        # リアクションのあったものだけを取り出す。
        if 'reactions' in post.keys():
            all_reaction_list.append(post['reactions'])

# 公開チャンネルを格納するリスト
public_list = _get_public_list(CHANNELS_LIST)

# それぞれの投稿についたリアクションをリストに貯めておく。
all_reaction_list = []
for index, row in enumerate(public_list):
    print(index, row)
    if index % 7 == 0:
        time.sleep(1)
    try:
        _get_sticker_list(row['id'])
    except Exception as e:
        print(e, len(all_reaction_list))
        time.sleep(3)
        pass

sticker_list = []
user_list = []

# 抽出したリアクションから、スタンプの数をカウントする。
for reaction_list in all_reaction_list:
    for reaction_dict in reaction_list:

        max_count = reaction_dict['count']
        user_list.append(reaction_dict['users'])

        count = 1
        while count <= max_count:
            sticker_list.append(reaction_dict['name'])
            count += 1

# 上位100件を取得する。
# スタンプのランキングを作成する。
sticker_rank = Counter(sticker_list).most_common(100)

# e. スタンプのリストを取得する。
with open('emoji.csv', 'w') as f:
    writer = csv.writer(f)
    writer.writerow(sticker_rank)

# スタンプのリストを取得する。
for rank, sticker_row in enumerate(sticker_rank):
    # print(index, i)
    # SlackへPostする数、かつterminalに表示するのも10個。
    if rank >= 10:
        break
    # terminal用
    rank_string = str(rank+1) + "位は、:" + sticker_row[0] + ":です。回数は" + str(sticker_row[1]) + "回です。"
    print(rank_string)

    # 自分のDMへ送信する。
    client.chat_postMessage(channel=POST_ID, text=rank_string)

END_TIME = dt.now()
print("開始時間:", START_TIME, ". 終了時間:", END_TIME)
time_log = f"開始時間: {START_TIME},  \n終了時間: {END_TIME}"
client.chat_postMessage(channel=POST_ID, text=time_log)

なおtimes_sendaという自分の分報チャンネルがあるのですが、そこのランキングには下記のスタンプがランクインしていました。素敵なスタンプですね。

こちらの記事はQiitaでも公開しています。
実際の手順等が気になる方はQiita記事も合わせてご参照ください。

https://qiita.com/Senple/items/0e4626307b4559d26bc5

一覧に戻る