Discordのチャンネルごとの個人の発言数をカウントする【discord.py】【GCP】

# コミュニティー活動を可視化する「コミュニティーバンド」
2/10-11QiitaHackathonに参加しました。
私たちは中規模のコミュニティーは時間が経つとメンバーのモチベーションが下がり、運営もそれをうまく把握できないという課題に対して、コミュニティー内のメンバーの活動を可視化して、「運営側がメンバーの活動を把握できる」「メンバーは自分の活動がコミュニティーのポイントにつながり貢献している気持ちになれる」が売りである**コミュニティーバンド**というプロダクトを作りました。その中のDiscordでの発言数管理を簡単にスプレッドシートで行う方法をお示しします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/c14e71b5-095f-e15a-9908-5c3ffd213e38.png)

上のシステム構成が示すように、各SNSでの発言やQiita記事投稿、イベント参加などをポイント化して集計していきます。※API連携やレーダーチャート作成のところはチームの他の方担当なのでこの記事では割愛します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/1601377d-2e20-631c-c3c8-13871b6e3bec.png)

# コミュニティー内で切磋琢磨
私たちのコミュニティー（[プロトアウトコミュニティー](https://note.com/protoout/n/nebe3e2651bda)はさらに6つのコミュニティーに分かれていますが、コミュニティーバンドを使えば、コミュニティー全体としてどれだけの活動ができたかも分かりやすいので達成目標が立てやすいし、コミュニティー対抗で凌ぎを削るなんてこともできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/ef46246b-ab1d-68af-0ed5-aa176861de0c.png)

# Discordからスプレッドシートへ
今回ハッカソンでLINEでの発言部分をLINE MessagingAPI-GoogleAppsScript-スプレッドシートで実装したため、Discordでの発言もスプレッドシートで管理しました。

下記のコードで特定のスプレッドシートのsheetに
>発言の日時、発言者ID、チャンネルID、チャンネル名

が新しい行に追加されます。
他に欲しい項目があれば
```python
sheet.append_row([message.created_at.isoformat(), message.author.id, message.channel.name])
```
のところをカスタマイズしてください。
[公式APIドキュメント](https://discord.com/developers/docs/interactions/message-components)を参考にするか、ChatGPTにぽんっと投げたらいい感じに答えてくれるかもしれません。
合計については、スプレッドシート内で関数を使って計算するもあり、発言ごとにチャンネルやuseridごとにカウントアップするもありです。

## 必要なもの
下記のコードの中でご自身で変更していただく変数について説明します。
スプレッドシートを使う場合はGCP(GoogleCloudPlatform)でいくつか手続きが必要です。
▶︎DiscordBotのトークン：[こちらの記事](https://dev.plus-class.jp/discordpy-intro/)が参考になります。
▶︎サービスアカウントを作成し、GCPで鍵を発行。スプレッドシートの共有にアドレスを登録する。
▶︎Sheets, Drive APIの有効化
新しくプロジェクトを作成し下記に従ってください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/339f9bac-90eb-eb3d-1f49-d6b875b13713.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2653579/4dc40dad-04f0-1793-75ae-82cc5421b27a.png)

前準備として(Macなら)
pip install discord、pip install gspreadを済ませておいてください。

`count.py`:
```python
import discord
import gspread
from oauth2client.service_account import ServiceAccountCredentials

# 全てのIntentsを有効にする
intents = discord.Intents.default()
intents.members = True  

# Intentsを指定してClientを作成
client = discord.Client(intents=intents)
TOKEN = 'DiscordBotのトークン'

@client.event
async def on_ready():
    print(f'We have logged in as {client.user}')


# Googleスプレッドシートの設定
scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
creds = ServiceAccountCredentials.from_json_keyfile_name('鍵を保存したjsonファイルパス', scope)
client_gs = gspread.authorize(creds)

# Discord ボットの設定
intents = discord.Intents.default()
intents.messages = True
client = discord.Client(intents=intents)

    # スプレッドシートにアクセス
    sheet = client_gs.open('スプレッドシートの名前').worksheet('sheet名')
    sheet.append_row([message.created_at.isoformat(), message.author.id, message.channel.name]
```
python count.pyを実行した上で、何かDiscordチャンネルで発言してみてください。
スプレッドシートに入力されるはずです。
うまくいかないなどあればコメントいただけると幸いです！

# LINEとスプレッドシートはGASで
コミュニティーが使用しているLINEグループにコミュニティーバンドを追加することにより、その中の発言数をカウントします。
こちらについては別記事で書きます。