Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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に勧誘しよう!!!!