本Botは2024/07/06をもって以下のリポジトリにリプレイスしました。
今後こちらのリポジトリは更新されません。
https://github.com/maguro-alternative/remake_bot
Discordの多機能Botです。
- LINEとのメッセージ連携
- ボイスチャンネルの入退室通知
- Web版VOICEVOXによる読み上げ機能
- カラオケ(動作不安定)
Twitter,niconico,YouTubeの通知- PostgreSQLを使用したLINEと入退室の管理
LINE側でメンションも可能です。
/チャンネル名#channel
メッセージの先頭につけることで、送信先のチャンネルを指定できる。
@Discordのユーザー名#4桁の数字#member
Discordのユーザーにメンションが可能。(ニックネームはNG)
@ロール名#role
ロールでメンションが可能。
複数のサーバーにそれぞれLINEグループを作成し、それぞれにメッセージを共有させることもできます。 環境変数の項目で詳しく説明します。
注意:YouTube-dlを使用しています。
/download
YouTubeから音源をダウンロードします。
/start_record
ダウンロードした音源を再生し、同時に録音を行います。
/rank_scoring
音源と録音した音声を比較し、100点満点で採点します。
/zunda
Botがボイスチャンネルに入室し、VoiceVoxでしゃべります。
/stop_zunda
Botをボイスチャンネルから切断します。
本botはrailwayというサービスでのホストを想定しています。
Dockerを使用しているので、簡単にホストできます。
railway側でLINEとDiscordBotをホストできるようにしています。
以下のAPI、サービスを使用します。
![]() |
![]() |
![]() |
![]() |
|
|---|---|---|---|---|
| LINE Developers | Discord Webhook | YouTube Date API | Web版Voicevox | LINE Notify |
| 参考 | 参考 | 参考 |
LINEは画像や動画のファイルがバイナリデータとして渡され、一定時間で削除されてしまうので動画はYouTubeにアップロードしてDiscordに送ります。
YouTube APIは参考リンクをもとに、試しに動画をアップロードしておいてください。そうすると2つのjsonファイルが生成されるので控えておいてください。
client_secret{clientのid}.json
upload_video.py-oauth2.json
DiscordBotのトークン以外にも、登録するものが大量にあります。
すべて.env.sampleに記載されています。
PORT=8080
・ポート番号。railwayでfastapiを立ち上げるのに必須(と公式で推奨されている)。
デフォルトで8080DISCORD_CALLBACK_URL
・Discordログインの認証時に遷移するURL。
Developサイトにも同様に登録しておくこと。DISCORD_CLIENT_ID
DiscordアプリのID。
BotのユーザIDと同じ。DISCORD_CLIENT_SECRET
Discordのシークレットキー
認証時に使用する。Developサイトから発行すること。DISCORD_SCOPE
Discordアプリに許可する権限一覧。
.env.sampleの権限通りにすること。DISCORD_BOT_TOKEN
・DiscordBotのトークン。USER_LIMIT
・DiscordAPIを叩く際に取得するユーザーの上限。
値は何でもいいが大きいと処理が重くなる。YouTube Data API
jsonの中身が機密情報の塊なので、一気に説明する。
登録する環境変数は以下の通り7つ。
YOUTUBE_ACCESS_TOKEN
YOUTUBE_CLIENT_ID
YOUTUBE_CLIENT_SECRET
YOUTUBE_REFRESH_TOKEN
YOUTUBE_PROJECT_ID
YOUTUBE_TOKEN_EXPIRYYouTube Data APIで生成された2つのjsonを以下に示す。
os.environ[]となっている部分が、環境変数に該当する部分になる。
client_secret.json
{
"installed":
{
"client_id":os.environ["YOUTUBE_CLIENT_ID"],
"project_id":os.environ["YOUTUBE_PROJECT_ID"],
"auth_uri":"https://accounts.google.com/o/oauth2/auth",
"token_uri":"https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url":"https://www.googleapis.com/oauth2/v1/certs",
"client_secret":os.environ["YOUTUBE_CLIENT_SECRET"],
"redirect_uris":["http://localhost"]
}
}upload_video.py-oauth2.json
{
"access_token":os.environ["YOUTUBE_ACCESS_TOKEN"],
"client_id":os.environ["YOUTUBE_CLIENT_ID"],
"client_secret":os.environ["YOUTUBE_CLIENT_SECRET"],
"refresh_token":os.environ["YOUTUBE_REFRESH_TOKEN"],
"token_expiry": os.environ["YOUTUBE_TOKEN_EXPIRY"],
"token_uri": "https://oauth2.googleapis.com/token",
"user_agent": None,
"revoke_uri": "https://oauth2.googleapis.com/revoke",
"id_token": None,
"id_token_jwt": None,
"token_response": {
"access_token":os.environ["YOUTUBE_ACCESS_TOKEN"],
"expires_in": 3599,
"scope": "https://www.googleapis.com/auth/youtube.upload",
"token_type": "Bearer"
},
"scopes": ["https://www.googleapis.com/auth/youtube.upload"],
"token_info_uri": "https://oauth2.googleapis.com/tokeninfo",
"invalid": False,
"_class": "OAuth2Credentials",
"_module": "oauth2client.client"
}VOICEVOX_KEY
・Web版VOICEVOXのAPIキー。PGDATABASE
・PostgreSQLのデータベース名PGHOST
・データベースのホスト名PGPASSWORD
・データベースのパスワードPGPORT
・データベースのポート番号PGUSER
・データベースのユーザー名postgresのuriに当てはめると以下のようになる
postgresql://{PGHOST}:{PGPORT}/{PGDATABASE}?user={PGUSER}&password={PGPASSWORD}ENCRYPTED_KEY
・lineのトークン類を暗号化するための暗号鍵
pythonのライブラリ、cryptographyで生成できるMIDDLE_KEY
・セッション保存の際に使用する秘密鍵
文字列(str)であれば何でもいいREACT_URL
・Reactを利用する場合のURLWEBHOOK
・DiscordのWebhook
エラーが出た際に通知するために使用するLINE_CALLBACK_URL
・LINEログインの認証時に遷移するURL。
Developサイトにも同様に登録しておくこと。PostgreSQLを使用しています。
起動時にテーブルを作成するので、接続先のみ用意しておいてください。
データベースのテーブルは以下の通りです。
・guild_set_permissions
・guilds_line_channel
・guilds_vc_signal
・line_bot
・task_table
・webhook_setguild_set_permissions
・サーバーの権限設定を保存するテーブル| カラム名 | 型 | 説明 |
|---|---|---|
| guild_id | NUMERIC PRIMARY KEY | サーバーのID |
| line_permission | NUMERIC | lineへの送信設定を編集できる権限を表すコード |
| line_user_id_permission | NUMERIC[] | lineへの送信設定を編集できるユーザーを表すコード |
| line_role_id_permission | NUMERIC[] | lineへの送信設定を編集できるロールを表すコード |
| line_bot_permission | NUMERIC | line botのトークンや認証情報などを編集できる権限を表すコード |
| line_bot_user_id_permission | NUMERIC[] | line botのトークンや認証情報を編集できるユーザーを表すコード |
| line_bot_role_id_permission | NUMERIC[] | line botのトークンや認証情報を編集できるロールを表すコード |
| vc_signal_permission | NUMERIC | ボイスチャンネルの入退室通知の設定を編集できる権限を表すコード |
| vc_signal_user_id_permission | NUMERIC[] | ボイスチャンネルの入退室通知の設定を編集できるユーザーを表すコード |
| vc_signal_role_id_permission | NUMERIC[] | ボイスチャンネルの入退室通知の設定を編集できるロールを表すコード |
| webhook_permission | NUMERIC | WebHookの設定を編集できる権限を表すコード |
| webhook_user_id_permission | NUMERIC[] | WebHookの設定を編集できるユーザーを表すコード |
| webhook_role_id_permission | NUMERIC[] | WebHookの設定を編集できるロールを表すコード |
guilds_line_channel
・LINEとのメッセージ共有の設定を保存するテーブル| カラム名 | 型 | 説明 |
|---|---|---|
| channel_id | NUMERIC PRIMARY KEY | DiscordチャンネルのID |
| guild_id | NUMERIC | サーバーのID |
| line_ng_channel | BOOLEAN | LINEとのメッセージ共有を無効にするかどうか |
| ng_message_type | VARCHAR(50) | LINEとのメッセージ共有を無効にするメッセージの種類(ピン止め) |
| message_bot | BOOLEAN | LINEとのメッセージ共有をBotが行うかどうか |
| ng_users | NUMERIC[] | LINEとのメッセージ共有を無効にするユーザーのID |
guilds_vc_signal
・ボイスチャンネルの入退室通知の設定を保存するテーブル| カラム名 | 型 | 説明 |
|---|---|---|
| vc_id | NUMERIC PRIMARY KEY | DiscordのボイスチャンネルのID |
| guild_id | NUMERIC | サーバーのID |
| send_signal | BOOLEAN | 入退室通知を送信するかどうか |
| send_channel_id | NUMERIC | 入退室通知を送信するチャンネルのID |
| join_bot | BOOLEAN | Botの入退室を扱うかどうか |
| everyone_mention | BOOLEAN | 入退室通知に@everyoneをつけるかどうか |
| mention_role_id | NUMERIC[] | 入退室通知につけるロールのID |
line_bot
・LINEのトークンや認証情報の設定を保存するテーブル
トークン類は暗号化して保存する| カラム名 | 型 | 説明 |
|---|---|---|
| guild_id | NUMERIC PRIMARY KEY | サーバーのID |
| line_notify_token | BYTEA | LINE Notifyのトークン |
| line_bot_token | BYTEA | LINE Botのトークン |
| line_bot_secret | BYTEA | LINE Botのシークレット |
| line_group_id | BYTEA | LINEグループのID |
| line_client_id | BYTEA | LINEのクライアントID(LINEログイン時に使用) |
| line_client_secret | BYTEA | LINEのクライアントシークレット(LINEログイン時に使用) |
| default_channel_id | NUMERIC | LINEとのメッセージ共有のデフォルトのDiscordチャンネルID |
| debug_mode | BOOLEAN | 有効にするとLINEグループ側でメッセージを送るとそのグループのidが表示される |
task_table
・各サーバのタスクを保存するテーブル| カラム名 | 型 | 説明 |
|---|---|---|
| task_number | BIGSERIAL PRIMARY KEY | タスクの番号 |
| guild_id | NUMERIC | サーバーのID |
| task_title | VARCHAR(50) | タスクのタイトル |
| time_limit | VARCHAR(50) | タスクの期限 |
| task_channel | NUMERIC | タスクのチャンネルID |
| alert_level | SMALLINT | タスクの通知レベル(1~5) |
| alert_role | NUMERIC | タスクの通知につけるロールのID |
| alert_user | NUMERIC | タスクの通知につけるユーザーのID |
webhook_set
・WebHookの設定を保存するテーブル| カラム名 | 型 | 説明 |
|---|---|---|
| uuid | UUID PRIMARY KEY | 投稿する内容を識別するUUID |
| guild_id | NUMERIC | サーバーのID |
| webhook_id | NUMERIC | WebHookのID |
| subscription_type | VARCHAR(50) | 通知するサービスの種類(YouTubeかniconico) |
| subscription_id | VARCHAR(50) | 通知するサービスのID(YouTubeの場合はチャンネルID、niconicoの場合はユーザーID) |
| mention_roles | NUMERIC[] | 通知につけるロールのID |
| mention_members | NUMERIC[] | 通知につけるユーザーのID |
| ng_or_word | VARCHAR(50)[] | いずれかが含まれていれば通知を無効にするワード |
| ng_and_word | VARCHAR(50)[] | すべて含まれていれば通知を無効にするワード |
| search_or_word | VARCHAR(50)[] | いずれかが含まれていれば通知を有効にするワード |
| search_and_word | VARCHAR(50)[] | すべて含まれていれば通知を有効にするワード |
| mention_or_word | VARCHAR(50)[] | いずれかが含まれていれば通知にロールやユーザーをつけるワード |
| mention_and_word | VARCHAR(50)[] | すべて含まれていれば通知にロールやユーザーをつけるワード |
| create_at | VARCHAR(50) | 最終投稿日時 |














