Slide 1

Slide 1 text

DiscordとLINEを Python+FastAPI+Docker で連携させる マグロ

Slide 2

Slide 2 text

自己紹介 • 名前:マグロ • 所属:日本大学 学部四年 • スキル: • 勉強中: Twitter:@sigumataityouda GitHub:maguro-alternative

Slide 3

Slide 3 text

背景 • 友達とゲームしながら通話するためDiscordでサーバを作った。 →初めての人が多く、混乱が生じる。 →LINEと連携させて、慣れてもらおう!

Slide 4

Slide 4 text

バージョン • これまで計4回のフルリメイクを行う。 今回はQiitaの記事にあるバージョン4を解説。 バージョン1:Glitch(Discord.js) とGAS(LINE) バージョン2:Railway(pycord)と GAS(LINE) バージョン3:Railwayに完全移行 バージョン4:FastAPIに移行 バージョン5:Postgresでのカスタマイズ 機能追加 今回は これ GitHubの はこれ

Slide 5

Slide 5 text

イメージ 複数でのサーバー運用を想 定

Slide 6

Slide 6 text

イメージ Discordからメッセージを送る と、送信元を解釈してLINEグ ループに送信

Slide 7

Slide 7 text

イメージ 同じようにLINEグループから のメッセージも解釈して Discordに送信

Slide 8

Slide 8 text

選定 • Python 3.10.7 • Railway • FastAPI • Discord.py+Pycord • Docker • LINE Messaging API • LINE Notify

Slide 9

Slide 9 text

設計 • Railway上でDockerを展開、Pythonの実行環境を作成 • DiscordBotとFastAPIのアプリを並列実行 Bot アプリ サーバ

Slide 10

Slide 10 text

設計(LINEBot) FastAPIで立ち上げたサーバー をLINEAPIのWebhookに設定 https://....railway.app/line-bot

Slide 11

Slide 11 text

設計(LINEBot) テキスト、音声ファイル https://....railway.app/line-bot 画像 画像URL 動画 動画URL(限定公開) スタンプ情報 スタンプURL ライブラリなしでDiscordAPIを使用 して送信 画像はGyazoAPI、動画はYouTube Data APIでアップロードして共有

Slide 12

Slide 12 text

設計(DiscordBot) メッセージを読み取りLINEに送 信

Slide 13

Slide 13 text

設計(DiscordBot) 動画、音声はMessaging APIで 送信 テキスト、画像、スタンプは LINE Notifyで送信 1時間に1000件 の送信上限 1か月に200件の 送信上限

Slide 14

Slide 14 text

識別方法 • 環境変数を利用 • 以下のような2つのサーバーで運用を想定(LINEグループもそれぞれ存在) SERVER_A SERVER_B

Slide 15

Slide 15 text

識別方法 サーバー名を頭文字にし、対応す る環境変数を代入 .split(",")で名前を区切り、サーバーを分別 DiscordサーバーidからLINEBotに関するイン スタンスを作成 SERVER_A SERVER_AのLINEグループ SERVER_Aと判断 サーバid メッセージ

Slide 16

Slide 16 text

識別方法 • LINEBotの署名を各サーバごとに行う。 • 一致したものからDiscordのインスタン スを作成。 SERVER_A SERVER_AのLINEグループ SERVER_Aと判断 body

Slide 17

Slide 17 text

識別方法 • 現在はトークンをWeb上で設定。

Slide 18

Slide 18 text

メンション、チャンネル指定 • LINE→Discordでは送信先チャンネルは環境変数で定める。 • だがLINE側からも指定したい。 • メンション機能も付けていたが、Discordの仕様変更により見直し。

Slide 19

Slide 19 text

メンション、チャンネル指定 • メッセージの先頭に「/チャンネル名 #channel」と表記することで変更可能。 • チャンネル一覧から同名のチャンネル を探し、idを取得、そこに投稿。 • 現在は送信先をデータベース で管理しており、Web上で変 更可能

Slide 20

Slide 20 text

ファイルの扱い • DiscordはCDN方式のため、httpsで参照可能。 • 一方、LINEはバイナリで扱われるため扱いが大変。 • どこかしらに保存して共有させる必要あり。

Slide 21

Slide 21 text

ファイルの扱い • それぞれのファイルに特化したストレージサービスを利用。 • 画像:Gyazo API • 動画:YouTube Data API • 音声:Discord API • いずれも「multipart/form-data」でアップロード可能。

Slide 22

Slide 22 text

実行例 • Discord→LINE(テキスト、画像)

Slide 23

Slide 23 text

実行例 • Discord→LINE(動画、音声)

Slide 24

Slide 24 text

実行例 • LINE→Discord(テキスト、画像、動画)

Slide 25

Slide 25 text

実行例 • LINE→Discord(音声、スタンプ)

Slide 26

Slide 26 text

今後 • 現在WebUIでの制御を可能にしているが、サーバもフロントも同一のフルスタッ クアプリとして動かしている。 • フロントと分けるか検討中。

Slide 27

Slide 27 text

最後に • 連携してDiscordに勧誘しよう!!!!