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


この記事は[Minecraft Command Advent Calendar 2023](https://qiita.com/advent-calendar/2023/mccmd)の10日目の2シリーズ記事です。

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

https://qiita.com/waxsd100/private/baf3e3bd6e8069f5e81d

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

https://qiita.com/waxsd100/private/f9cc735f3fba6b67bdea

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

https://qiita.com/waxsd100/private/9fe00127c1c63c451fa6

## はじめに

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

## 準備

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

使用するライブラリ：

- **mcrcon**: 

https://pypi.org/project/mcrcon

- **pytchat**:

https://github.com/waxsd100/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接続

```python
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のスクリーンショット](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187514/af4985e7-1541-3c9c-32b5-bbf47f7a83f2.png)

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

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

```py
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に流し込む様子](https://drive.google.com/uc?id=1RAJdQmZPzz9rNx61FS1wPPQMinmRMgMG)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/187514/410217ef-17e2-8dc6-e82e-a3454119b780.png)


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

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


### 絵文字処理

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

https://pypi.org/project/emoji/

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


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

```python
                    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}")
```

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

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


## 使用例

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

https://www.youtube.com/watch?v=pTUt689Z6gU

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

https://www.youtube.com/watch?v=vqLRGlsMWmE

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

ソフト(YoutubeConnect)

https://github.com/waxsd100/YoutubeConnect

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

## さいごに

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


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

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


次回:

https://qiita.com/waxsd100/private/9fe00127c1c63c451fa6