사내 Slack의 인기 TOP30 이모티콘 조사하기

![s00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/767277b3-29af-15e6-4972-36ac76dd266f.png)
## TL;DR
> 사내 Slack의 전체 Public 채널에서 사용된 TOP30 인기 이모티콘을 조사하는 방법을 공유합니다.
> 이모티콘의 사용량과 자주 사용되는 이모티콘을 통해서 회사 분위기를 대략 파악해 볼까요?! :eyes:

※ 제악사항 : 채널 별 최신 1000개의 메시지 대상, 스레드에 포함된 이모티콘 제외

## 준비물 
- Python 3.x
- Slack OAuth Access Token (`xoxp-` 로 시작하는 값)  
https://api.slack.com/apps > Create New App > Permissions > User Token Scopes 3개 권한 추가 (`channels:history`, `channels:read`, `emoji:read`) > Install App to Workspace
![s01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/8a92cd31-67b6-53fd-ef06-a03ededcaa13.png)
![s02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/21f9abbe-a4a1-85ea-ed5e-b12bcc0945f8.png)
![s03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/bc73dd0a-87c0-dcff-0e2e-ac2f1293ae92.png)
![s04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/4ac4bd05-49de-f45b-5e96-b523fe36112a.png)
![s05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/e178857d-5bb2-eb69-8b42-1fdce11bf4f8.png)
![s06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/22aca085-9d0a-fc93-32e4-bd93d5b12bc2.png)
![s07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/8af695d1-9551-bda7-b89e-0b1fcc9a135f.png)
![s08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/d4cbfca1-a812-4ace-fb38-7381394b1598.png)

## 소스코드, 실행
```bash:실행방법
$ python ./get_emoji_count.py
=> result.txt 결과 파일이 생성 됩니다.
```
아래 코드의 `token` 값을 윗 단계에서 본인의 `Slack OAuth Access Token`으로 바꿔줍니다.

```python:get_emoji_count.py
import requests
import json
import time
import sys

def get_channel_list(params):
    r = requests.get("https://slack.com/api/conversations.list", params=params)
    json = r.json()

    # Public Channel ID를 저장
    channels = []

    for channel in json["channels"]:
        channels.append(channel["id"])
        print(channel)

    print("공개 채널 수: ", len(channels))
    return channels


def count_emoji(channels, param):
    # 이모티콘 저장
    emojis = {}

    for channel in channels:

        params.update(count=1000, channel=channel, inclusive=1)
        r = requests.get("https://slack.com/api/conversations.history", params=params)
        json = r.json()

        # 메시지가 없을 때
        if "messages" in json == False:
            continue

        # 채널의 메시지 (최대 1000개 메시지까지만..)
        for message in json["messages"]:
            if "reactions" in message:
                # 종류
                for reaction in message["reactions"]:
                    # 집계 목록
                    if reaction["name"] in emojis:
                        emojis[reaction["name"]] += reaction["count"]
                    else:
                        emojis[reaction["name"]] = reaction["count"]

        # 1초 슬립
        time.sleep(1)

    print("이모티콘 수: ", len(emojis))
    return emojis

# ------------------------
# 사용 횟수가 많은 순서로 이모티콘 30개 정렬
# ------------------------
def sort_30(emojis):
    emojis_sorted = sorted(emojis.items(), key=lambda x: x[1], reverse=True)[:30]
    return emojis_sorted

if __name__ == '__main__':
    # 아래의 토큰값을 본인의 값으로 변경하시면 됩니다.
    token = "xoxp-394838520754-723291506419-1330403625172-123456789012345678901234567890"
    params = {"token": token}

    channel = get_channel_list(params)
    emojis = count_emoji(channel, params)
    emojis_sorted = sort_30(emojis)

    # 결과 파일로 출력
    f = open('result.txt', 'w')
    for data in emojis_sorted:
        f.write(str(data).replace("'",":") + "\n")
    f.close()
```
`result.txt` 파일을 열어보면 다음과 같습니다. (이 파일 내용을 그대로 Slack 메시지에 복붙하면 됩니다!)

```text
(:+1:, 1172)
(:a:, 227)
(:heart:, 161)
(:b:, 137)
(:raised_hands:, 117)
(:three:, 110)
(:two:, 90)
(:heavy_check_mark:, 87)
(:100:, 57)
(:the_horns:, 50)
(:-1:, 42)
(:one:, 38)
(:tada:, 28)
(:+1::skin-tone-2:, 27)
(:clap:, 25)
(:heavy_plus_sign:, 18)
(:slightly_smiling_face:, 13)
(:ok_hand:, 13)
(:four:, 11)
(:fire:, 11)
(:blush:, 9)
(:white_check_mark:, 9)
(:zero:, 8)
(:wave:, 7)
(:+1::skin-tone-4:, 7)
(:hugging_face:, 7)
(:pray:, 7)
(:heart_eyes:, 7)
(:joy:, 5)
(:five:, 5)
```
![s09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144058/6686696f-205f-9a42-2aa2-31175194e3e0.png)

## 참고 링크
- [https://qiita.com/bakuwarorin/items/1c4ff06c52555b80abea](https://qiita.com/bakuwarorin/items/1c4ff06c52555b80abea)
- [https://github.com/keisuke111/slack_emoji_count](https://github.com/keisuke111/slack_emoji_count)