/discord2slack

discord data to slack(use webhook)

Primary LanguagePythonMIT LicenseMIT

このBotについて

環境変数

DISCORD_TOKEN

  • 必須です。あなたのDiscordのトークンを記載(トークンは厳重に管理し、公開されないよう配慮すること!)
  • 例: DISCORD_TOKEN="fdj2iur928u42q4u239858290"

LOG_LEVEL

  • ログレベル(DEBUG/INFO/WARNING/ERROR)
  • 例: LOG_LEVEL="INFO"

ALLOW_CHANNELS

  • Slack投稿を有効にするDiscordのチャンネルID(複数ある場合は「;」を間に挟むこと)
    • 1件の場合: ALLOW_CHANNELS=18471289371923
    • 2件の場合: ALLOW_CHANNELS=18471289371923;1389103890128390

SLACK_WEBHOOK_URL

  • Slack投稿する際に使用するWEBHOOK_URLを1つだけ指定します(必須です)

IGNORE_WEBHOOK_ID

  • 無視するWebhook_id
    • 無視するWebhook_idを1つ指定できます。指定しない場合、すべてのBotメッセージを無視します(Botの投稿はSlackに投稿しません)
  • 例: IGNORE_WEBHOOK_ID=18471289371923

DISCORD_NAME

  • Slackに投稿するフッターで表示する名前。指定しない場合、Discordのギルド名が使用されます
  • 例: DISCORD_NAME=お茶会

SLACK_BOT_TOKEN

  • 必須です。あなたのSlackのBOTトークンを記載(トークンは厳重に管理し、公開されないよう配慮すること!)
    • OAuth & PermissionsBot User OAuth Tokenから取得(同じ場所のBot Token ScopesでScopeを設定すると取得できるようになる)
  • 例: SLACK_BOT_TOKEN="xoxb-987654321123"

SLACK_APP_TOKEN

  • 必須です。あなたのSlackのAPPトークンを記載(トークンは厳重に管理し、公開されないよう配慮すること!)
    • Basic InformationApp-Level Tokensから取得
    • Generate Token and Scopesボタンを押して、App-level tokensを取得する必要あり(Scopeはconnections:write)
  • 例: SLACK_BOT_TOKEN="xapp-1-987654321123"

SLACK_BOT_IDS

  • SlackのWebhook URL(SLACK_WEBHOOK_URL)に入っているIDをコンマ区切りで入力(このBOT_IDは無視する(Discordに連携しない))
    • 本当は勝手に無視するようにしたかったが、Slackに登録されるBOT_IDとWEBHOOKで投稿されるときのBOT_IDが異なっているため自動で判別できなかった
    • Webhookを使わない仕組みなら、こんなムダなことはしなくて良いのだろうけど、それはわからなかった……。
  • 例:
    • https://hooks.slack.com/services/<team_id>/<BOT_ID>/<WEBHOOK_ID>
      • SlackのWebhookを作るとこういう感じでURLが取得できるとする(上はテキトーです)
      • まんなかのやつ(BOT_ID)がココで設定したいBOT_IDです
      • 無視したいWEBHOOKが複数ある場合もあると思うのでこういう形式にしています

DISCORD_WEBHOOK_URL

  • Discord投稿する際に使用するWEBHOOK_URLを1つだけ指定します(必須です)

動かし方

前提

  • poetryがインストールされていること
    • poetry -VしてPoetry version 1.x.xが返ればOK
  • Slack側でAppが作成されており、BOTトークン、APPトークン、Webhookが作成されていること
    • OAuth & PermissionsBot Token Scopesで以下が有効であること
      1. channels:history
      2. chat:write
      3. incoming-webhook
      4. users:read
    • AppのSocket ModeがONになっていること
    • Event SubscriptionsEnable EventがONであること
      • 「Socket Mode is enabled. You won’t need to specify a Request URL.」と書いてあること
      • Subscribe to bot eventsで以下が有効であること
        1. message.channels
    • Slackで該当のチャンネルのインテグレーションにAppが追加されていること
      • チャンネルに追加されていないと、チャンネルの内容を読み込むことができないため
  • Discord側でBotが作成されており、以下の状況であること
    • 作成したDiscord Botのトークンを取得していること
    • 特権インテントの一種であるメッセージ読み込み権限がONであること
    • Slackに連携したいDiscord側チャンネルで、Webhook URLを作成していること
      • DiscordでWebhook URLを作成する方法はこちら
  • cogs/module/filesに .envが作成され、各種環境変数が設定されていること
    • 同階層にある、.env.sampleをコピーして作ると良い
    • 「作成され、各種環境変数が設定」と書いたが、環境変数として登録されている状態ならOK
      • たとえば、replitならToolsにあるsecretsで登録しておく
      • Alt text

動かす

  • 以下のコマンドを実行
poetry install
poetry run python discord2slackbot.py

今後直すメモ

  • 後で見返したら、IGNORE_WEBHOOK_IDって何のために存在するの? と思ったけど、DISCORD_WEBHOOK_URLで設定したURLの一部を使ってた
    • DISCORD_WEBHOOK_URLは必須だし、IGNORE_WEBHOOK_IDという名前が意味不明。これは自動的に設定するべき
    • BotはSlackに投げたくないって場合もありえるので、それは設定でON/OFFできてもいい気がする
  • 動かなくなる可能性があるし、discord.pyのバージョンアップをしておきたい

変えたメモ

  • 2024/4/19
    • discord2slackbot.py
      • keep_aliveをコメントアウト(もういらない気がする)
    • slack2discord.py
      • user_dictで投稿したユーザーを持つようにした(何回もSlackのAPI叩いたらユーザーリミット到達したため)
      • 文字が書かれてない場合は対象外とか、SLACK_BOT_IDSが未記載の場合Botは対象外とかした