marukot-chの日記

弱小SEの雑記です

DiscordとSlackのメッセージをやりとりできるやつ作りました

これはなに?

タイトルのとおりですが、Webhookを使って、Discordのメッセージ・写真をSlackの特定のチャンネルに投稿、SlackのメッセージをDiscordの特定のチャンネルに投稿するBotを作成できるツール?(DiscordのBot(discord.py)とSlackのBot(bolt製))を作りました。

 

何も考えてないので複数のサーバーとかに対応はできていません。そのため、1つBotを作ったら、1つのSlackワークスペースと1つのDiscordギルドに対応させる感じです(1つのBotで複数対応はできません)。

 

なぜ作ったの?

DiscordとSlackでコミュニティが分かれてしまっていて、知見が分散してしまうことがあって悲しいので作ってみました。

また、Slackは無料版を使っているのでデータが失われてしまうのことも悲しんでいたことを思い出しました。

 

注意点

  • Discordの写真はURLが分かればアクセスできる系なので、慈悲もなくSlackに投稿しちゃいます
  • Discordのアイコン画像やギルド画像も躊躇せずSlackに投稿しちゃいます
  • Slackのニックネーム、アイコン画像も取得してなんとなくDiscordに投稿しちゃいます

こんな感じ

Slackに写真付きで「afawefaw」って書くと、DiscordにWebhookで投稿されます。

(四角いアイコンがSlackで、丸いアイコンがDiscord側ですね)

f:id:marukot-ch:20220416124352p:plain

f:id:marukot-ch:20220416124409p:plain

*Slackに投稿されたファイルを問答無用で連携するとダメな例が多いと思うので、ファイルが有ったことだけ書いておくことにしています

 

Discordにaaaって書くと、SlackにaaaってWebhookで投稿されます。

(上がDiscord、下がSlackです)

f:id:marukot-ch:20220416124110p:plain

f:id:marukot-ch:20220416124031p:plain

 

動かすための流れ(けっこう面倒くさいです)

Discord
  1. Discord開発者ポータルでBotを作成
  2. Discord側のSlackからの投稿チャンネルにWebhookを作成
    1. Webhook Urlをメモする
  3. ギルドにBotを追加
Slack
  1. Slackのアプリ作成画面でAppを作成
  2. Basic Informationで、App-Level Tokensを作成(Scopeはconnections:write)
    1. トークンをメモする
  3. Socket ModeでSocket ModeをEnableにする
  4. Incoming WebhooksでWebhookを作成、Slack側で許可する
    1. Webhook Urlをメモする
  5. OAuth & PermissionsのScopesの項目にいき、Bot Token ScopesでOAuth Scopeを追加する
    1. channels:history
    2. chat:write
    3. incoming-webhook
    4. users:read
  6. この画面の上の方にいき、Bot User OAuth Tokenをメモする
  7. Event Subscriptionsを開き、Subscribe to bot eventsでmessage.channelsを追加する
  8. Install AppあたりでSlackワークスペースにAppをインストールする(タイミング忘れました、、、)
    1. Webhookしたいチャンネルを選べと言われ選択を強制されますが、適当でOKです(4.で作った方を使います)
Botを動かす
  1. poetryをインストール
  2. start.shに実行権限を与える(chmod 755 start.sh)
  3. .envを.env.sampleからコピーして編集する(メモっておいたやつらを書く) or 環境変数エディタ的なものに書き込む
  4. start.shを実行

GitHubリポジトリ

github.com

 

参考(環境変数の説明)

全部必須なのでイメージ的にはこんなノリです(たくさん必要で大変ですね!)

それぞれの環境変数についての細かい説明はGitHubリポジトリに載せています。

(動かす流れはこのブログの方が細かいですね)

{
"DISCORD_TOKEN": "Discordのトークン",
"LOG_LEVEL": "INFO",
"IGNORE_WEBHOOK_ID": "指定された場合、このWEBHOOK_IDのものはSlackへ連携しません(無限ループしちゃうので/未指定の場合Botのメッセージはすべて連携しません)",
"DISCORD_NAME": "お茶会",
"ALLOW_CHANNELS": "DiscordのチャンネルIDを複数指定できます;Discordチャンネル2;Discordチャンネル3",
"SLACK_WEBHOOK_URL": "DiscordからSlackに投稿するためのWEBHOOK_URL",
"SLACK_APP_TOKEN": "SlackのApp-Level Tokens",
"SLACK_BOT_TOKEN": "SlackのBot Token",
"SLACK_BOT_IDS": "指定された場合、このWEBHOOK_IDのものはSlackへ連携しません",
"DISCORD_WEBHOOK_URL": "SlackからDiscordに投稿するためのWEBHOOK_URL"
}

 

反省点

  • SlackのチャンネルとDiscordのチャンネルを同期する的な説明をして導入したのですが、Discord側だけ複数のチャンネルを連携できる仕様にして動かしたので、Slack側にはいろんなチャンネルの話題が混入してわかりづらい(たくさんできたらうれしいよね的発想はわかりづらさを生むことがわかりました)
  • BOT_ID的やつはもしかするとWEBHOOK_URLから取れば素直だったかもしれないと思いました