LoginSignup
3
0

YoutubeのコメントをMinecraftに送信する

Last updated at Posted at 2023-12-09

この記事はMinecraft Command Advent Calendar 2023の10日目の2シリーズ記事です。

  • 10日目 1シリーズ記事: Minecraftバニラサーバでも外部アプリから操作する

  • 10日目 2シリーズ記事: YoutubeのコメントをMinecraftに送信する

  • 10日目 3シリーズ記事: バニラのMinecraftでChatGPTに質問したりてコマンド実行する

はじめに

シーズン1では、外部アプリケーションからMinecraftへのコマンド送信について紹介しました。
今回は、外部サイトの情報をMinecraftに送信する方法に焦点を当てます。

準備

この記事では、YouTubeのライブ放送コメントをMinecraftに送信する方法を紹介します。
使用する言語はPython 3.8から3.11です。

使用するライブラリ:

  • mcrcon:

  • pytchat:

(〆切り直前の手直しでデグレした)

requirements.txtをプロジェクト内に作成し、以下を記載します。

mcrcon==0.7.0
pytchat@git+https://github.com/waxsd100/pytchat.git@v0.6.2#egg=pytchat

その後、pip install -r requirements.txtでライブラリをインストールします。

PythonからRcon接続

from mcrcon import MCRcon

# サーバーのアドレス、パスワード、ポート番号を定義
server_address = "127.0.0.1"
server_pass = "my_password"
server_port = 25575

# メイン関数を定義
if __name__ == '__main__':
    # with文を使用してリソースの自動解放を保証
    with MCRcon(server_address, server_pass, server_port) as rcon:
        # サーバーにコマンドを送信し、ログを取得
        rcon.command("say HELLO WORLD MINECRAFT WORLD")

プログラムを実行して、Minecraft内での動作を確認します。

Minecraftのスクリーンショット

YouTubeコメントの取得と流し込み

次に、YouTubeのライブ放送チャットからコメントをリアルタイムで取得します。
ビデオIDはYouTubeのURLから取得できます。

from mcrcon import MCRcon
import pytchat

server_address = "127.0.0.1"
server_pass = "my_password"
server_port = 25575

video_id = "########"  # YouTubeのビデオID

if __name__ == '__main__':
    with MCRcon(server_address, server_pass, server_port) as rcon:
        try:
            chat = pytchat.create(video_id=video_id)  # YouTubeのライブチャットを取得
            print(f"Start: https://www.youtube.com/watch?v={video_id}")
            while chat.is_alive():  # ライブチャットがアクティブな間
                for c in chat.get().sync_items():  # チャットの各メッセージに対して
                    rcon.command(f"say {c.message}")  # Minecraftサーバーにメッセージを送信
        except pytchat.ChatDataFinished:
            print("Chat data finished.")  # チャットデータが終了した場合
        except Exception as ex:
            print(ex)  # その他の例外が発生した場合
        finally:
            # 終了処理
            chat.terminate()

YouTubeチャットをMinecraftに流し込む様子

image.png

この方法で、YouTubeチャットのメッセージを約5~10秒の遅延でMinecraftに送信されます。

リアルタイムで取得したい場合はLiveChatAsyncなどの非同期処理で取得してください。
(何故かブラウザにコメント反映されるより前に取得できる。)

絵文字処理

Emojiのテキストフォーマットは:EmojiName: で表示されるので、

などで絵文字変換するのがおすすめです。

テキストメッセージ以外にスーパーチャットだけ取りたいなどを判定したい場合は
c.typeでType判定できます。

                    match c.type:
                        case "superChat":
                            # スーパチャット受信時の処理
                            print(f"{c.type} [{c.author.name}]- {c.message}")
                        case "textMessage":
                            # 通常のテキストメッセージ受信時の処理
                            print(f"{c.type} [{c.author.name}]- {c.message}")
                        case "superSticker":
                            # スーパースティッカー受信時の処理
                            print(f"{c.type} [{c.author.name}]- {c.message}")
                        case "newSponsor":
                            # チャンネルメンバーシップ新規登録受信の処理
                            print(f"{c.type} [{c.author.name}]- {c.message}")
                        case "giftRedemption":
                            # メンバーシップギフト送信時の処理
                            print(f"{c.type} [{c.author.name}]- {c.message}")
                        case "giftPurchase":
                            # メンバーシップギフト受信時の処理
                            print(f"{c.type} [{c.author.name}]- {c.message}")

これによりスーパーチャットされたら特殊な演出するなどができます。

スーパーチャットでの処理はMinecraftのEULAを確認してから実装してください。
Pay2Winになる行為は禁止されています。

使用例

この連携により、視聴者がリアルタイムで参加できる視聴者参加型のMinecraftが可能になります

クイズ大会などや視聴者コメントをそのまま乗せたりと。。。
様々な使いところがあるかと思います。

どちらも上記で紹介したライブラリを元にしたソフトとデータパックの組み合わせで動いています。

ソフト(YoutubeConnect)

これらは、上記で紹介したライブラリを使用したソフトとデータパックを組み合わせています。

さいごに

主にライブラリと自作ソフトの紹介となりましたが、Modを使用せずに他のプラットフォームと連携できました。

次回はChatGPTとの連携について紹介します。
面白かったらぜひいいねやシェアをお願いします。

それでは、次回お会いしましょう。

次回:

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0