MiniCliを使用してPHPでツイスト/IRCのchatbotを作成する


あなたの何人かが知っているかもしれないように、私はしていましたlive coding on Twitch 今から数ヶ月間、私は多くの実験を行うことができ、私の設定でさまざまな設定を試してみました.
Twitchは私がまだ慣れている機能と詳細の負荷で楽しいプラットフォームです.私がビデオに含まれるために私のストリームに組み込まれたかった1つのものはライブチャットでした、しかし、既製の解決のために捜した後に、私はLinuxのためのOBSが他のプラットホームで利用できるすべての特徴を持っていないと理解しました.それはもちろん、私がそれを成し遂げるのを妨げませんでした!私はいつも道を見つける.)
このガイドでは、どのように私はPHPで使用してtwitch chatbot実装を共有しますMinicli , PHPの依存関係のないフレームワーク.私は、私が私のライブストリームセットアップにそれを取り入れた方法も共有します.
この実装はTwitch Guide for Chatbots .
あなたがむしろrepoをクローン化して、それを試してみたいならばgithub repository or download the 0.1.0 release .

Twitchのストリームチャットについて


TwitchはすべてのチャットのIRCサーバーを使用します.あなたのストリームチャットは、実際にあなたのtwitchのユーザー名の同じ名前のチャンネルです.chatbotはtwitchのIRCサーバに接続し、認証し、ストリームチャネルに参加します.そこから、他のユーザーによって送信されたメッセージを読むことができますし、端末に印刷したり、より高度なことを行う.

必要条件


フォローアップするには、
  • php-cli , 7.2以上
  • 作曲家は新しいミニカープロジェクトを作成する
  • 小言
  • ステップ1 :アプリケーションの起動


    Minicliに基づいた新しいプロジェクトをブートするには、作曲家を使用します.
    composer create-project --prefer-dist minicli/application
    
    では、新しく作成したディレクトリにアクセスします.
    cd minichat
    
    あなたが中を見るならばminichat ディレクトリ、あなたが見つけるものは、ここにあります:
    app  composer.json  composer.lock  LICENSE  minicli  README.md  vendor
    
    重要なディレクトリとファイル
  • app : カスタムアプリケーションファイルはここにあります.これはコマンドフォルダがデフォルトでどこにあるかです.
  • minicli : minicliスクリプトはコマンドラインからコールされる実行可能ファイルです.これはアプリケーションがブートストラップされる場所です.
  • あなたは名前を変更できますminicli あなたが望むもののためのスクリプト.これは通常、アプリケーションの名前ですので、名前を変更しますminichat :
    mv minicli minichat
    
    を実行するhelp コマンドが期待通りに動作していることを確認します.
    ./minichat help
    
    次のように出力してください.
    Available Commands
    
    help
    └──table
    └──test
    
    アプリケーションは3つのデモコマンドが付属しています.これは各コマンドコントローラを見つけることができます.
  • help : app/Command/Help/DefaultController.php
  • help table : app/Command/Help/TableController.php
  • help test : app/Command/Help/TestController.php
  • これにより、コマンドオートローディングがMiniCliでどのように動作するかというアイデアが得られます.
    新しいコマンドを作成しますtwitch . まず、ディレクトリを作成しますTwitch 内部app/Command :
    mkdir app/Command/Twitch
    
    新しいファイルを開くDefaultController.php このフォルダの中.次のブートストラップコンテンツを配置します.
    <?php
    #label app/Command/Twitch/DefaultController.php
    
    namespace App\Command\Twitch;
    
    use Minicli\Command\CommandController;
    
    class DefaultController extends CommandController
    {
        public function handle()
        {
            $this->getPrinter()->info("Starting Minichat...");
        }
    }
    
    ファイルを保存した後、次のコマンドを実行できます.
    ./minichat twitch
    
    これにより、handle コマンドコントローラクラス内のメソッド.

    ステップ2:Twitch OAuthキーを得る


    OAuthトークンはauthenticate TwitchのIRCサーバーでは、あなたのストリームチャットへのアクセスを与える.
    すぐにあなたのアカウントのトークンを取得するにはTwitch Chat OAuth Password Generator (twitchによって提供されます).
    OAuthトークンを取得したら、minichat アプリケーションフォルダのルートに配置されたスクリプトで、あとでコマンドコントローラからアクセスする2つの設定項目があります.twitch_user and twitch_oauth :
    #!/usr/bin/php
    <?php
    
    if (php_sapi_name() !== 'cli') {
        exit;
    }
    
    require __DIR__ . '/vendor/autoload.php';
    
    use Minicli\App;
    
    $app = new App([
        'app_path' => __DIR__ . '/app/Command',
    
        #Twitch
        'twitch_user' => 'YOUR_TWITCH_USERNAME',
        'twitch_oauth' => 'YOUR_TWITCH_OAUTH_TOKEN'
    ]);
    
    $app->setSignature("Minichat for Twitch.\n./minichat twitch");
    $app->runCommand($argv);
    
    
    場所にこれらの資格情報を使用すると、サーバーに接続するに移動することができます.

    ステップ3 :ソケットを使ってサーバに接続する


    TwitchのIRCサーバに接続するには、ソケットを使用します.ソケットでの作業は、特定のポートにある削除サーバへの接続を確立することを除いて、ファイルの操作に非常に似ています.これらは私たちが使用する方法です.

  • socket_create : メソッド呼び出しで提供されたアドレスとポートを使用して新しいソケットを作成します.

  • socket_read : ソケットから読み込みます.

  • socket_write : ソケットに書き込みます.

  • socket_last_error : ソケットから最後のエラーを取得します.

  • socket_close : ソケットを閉じます.
  • 次のクラスは、ソケットを介してtwitch ircサーバに接続し、与えられたNickとOAuthパスワードで認証し、ストリームチャネルに参加するメソッドを提供します.サーバからのメッセージを読み書きできます.
    <?php
    #app/TwitchChatClient.php
    
    namespace App;
    
    class TwitchChatClient
    {
        protected $socket;
        protected $nick;
        protected $oauth;
    
        static $host = "irc.chat.twitch.tv";
        static $port = "6667";
    
        public function __construct($nick, $oauth)
        {
            $this->nick = $nick;
            $this->oauth = $oauth;
        }
    
        public function connect()
        {
            $this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
            if (socket_connect($this->socket, self::$host, self::$port) === FALSE) {
                return null;
            }
    
            $this->authenticate();
            $this->setNick();
            $this->joinChannel($this->nick);
        }
    
        public function authenticate()
        {
            $this->send(sprintf("PASS %s", $this->oauth));
        }
    
        public function setNick()
        {
            $this->send(sprintf("NICK %s", $this->nick));
        }
    
        public function joinChannel($channel)
        {
            $this->send(sprintf("JOIN #%s", $channel));
        }
    
        public function getLastError()
        {
            return socket_last_error($this->socket);
        }
    
        public function isConnected()
        {
            return !is_null($this->socket);
        }
    
        public function read($size = 256)
        {
            if (!$this->isConnected()) {
                return null;
            }
    
            return socket_read($this->socket, $size);
        }
    
        public function send($message)
        {
            if (!$this->isConnected()) {
                return null;
            }
    
            return socket_write($this->socket, $message . "\n");
        }
    
        public function close()
        {
            socket_close($this->socket);
        }
    }
    
    このクラスをファイル名TwitchChatClient.php インサイドapp フォルダ.
    我々は、現在使用しますTwitchChatClient を処理するコントローラのクラスtwitch コマンド
    <?php
    # app/Command/Twitch/DefaultController.php
    
    namespace App\Command\Twitch;
    
    use App\TwitchChatClient;
    use Minicli\Command\CommandController;
    
    class DefaultController extends CommandController
    {
        public function handle()
        {
            $this->getPrinter()->info("Starting Minichat...");
    
            $app = $this->getApp();
            #obtains twitch credentials from app config
            $twitch_user = $app->config->twitch_user;
            $twitch_oauth = $app->config->twitch_oauth;
    
            if (!$twitch_user OR !$twitch_oauth) {
                $this->getPrinter()->error("Missing 'twitch_user' and/or 'twitch_oauth' config settings.");
                return;
            }
    
            $client = new TwitchChatClient($twitch_user, $twitch_oauth);
            $client->connect();
    
            if (!$client->isConnected()) {
                $this->getPrinter()->error("It was not possible to connect.");
                return;
            }
    
            $this->getPrinter()->info("Connected.\n");
    
            while (true) {
                $content = $client->read(512);
                $this->getPrinter()->out($content . "\n", "dim");
                sleep(5);
            }
        }
    }
    
    
    あなたが走るときtwitch コマンドを再度、あなたのチャットと印刷メッセージに接続することができるはずです.
    ./minichat twitch
    
    次のように出力します.
    Starting Minichat...
    
    Connected.
    
    :tmi.twitch.tv 001 erikaheidi :Welcome, GLHF!
    :tmi.twitch.tv 002 erikaheidi :Your host is tmi.twitch.tv
    :tmi.twitch.tv 003 erikaheidi :This server is rather new
    :tmi.twitch.tv 004 erikaheidi :-
    :tmi.twitch.tv 375 erikaheidi :-
    :tmi.twitch.tv 372 erikaheidi :You are in a maze of twisty passages, all alike.
    :tmi.twitch.tv 376 erikaheidi :>
    
    :[email protected] JOIN #erikaheidi
    :erikaheidi.tmi.twitch.tv 353 erikaheidi = #erikaheidi :erikaheidi
    :erikaheidi.tmi.twitch.tv 366 erikaheidi #erikaheidi :End of /NAMES list
    
    
    さて、あなたのストリームマネージャをTwitch ( Creatorのダッシュボードの内部)にアクセスし、チャットウィンドウでメッセージを送信するなら、以下のようなメッセージを受け取ります.

    終了するには、ヒットする必要がありますCTRL+C .
    すべての情報を必要としないので、次のステップで出力前にメッセージを解析し始める.
    あなたがしばらくの間それを開いておくならば、あなたが通知するもう一つのものは、サーバーが定期的にあなたを送るということですPING メッセージを送信し、接続を維持するにはPONG . 次のステップでも実装します.

    ステップ4 :構文解析メッセージ


    メッセージの解析は重要です.
  • 誰がメッセージを送ったかを知っていてください.
  • 特定の文字列を認識し、必要に応じてメッセージを扱います
  • チャットに送信された新しいメッセージによって生成された出力を見てみましょう.
    :[email protected] PRIVMSG #erikaheidi :testing minichat
    
    つの重要なこと:我々は、文字列を探すなら、' ping 'のようなサーバからでないメッセージを認識することができますPRIVMSG テキストで.また、特殊文字を使用できます: and ! それをフィルタリングして、ニック+メッセージを得るストリングで.
    これは更新されたコントローラーです.
    <?php
    #app/Command/Twitch/DefaultController.php
    
    namespace App\Command\Twitch;
    
    use App\TwitchChatClient;
    use Minicli\Command\CommandController;
    
    class DefaultController extends CommandController
    {
        public function handle()
        {
            $this->getPrinter()->info("Starting Minichat...");
    
            $app = $this->getApp();
    
            $twitch_user = $app->config->twitch_user;
            $twitch_oauth = $app->config->twitch_oauth;
    
            if (!$twitch_user OR !$twitch_oauth) {
                $this->getPrinter()->error("Missing 'twitch_user' and/or 'twitch_oauth' config settings.");
                return;
            }
    
            $client = new TwitchChatClient($twitch_user, $twitch_oauth);
            $client->connect();
    
            if (!$client->isConnected()) {
                $this->getPrinter()->error("It was not possible to connect.");
                return;
            }
    
            $this->getPrinter()->info("Connected.\n");
    
            while (true) {
                $content = $client->read(512);
    
                //is it a ping?
                if (strstr($content, 'PING')) {
                    $client->send('PONG :tmi.twitch.tv');
                    continue;
                }
    
                //is it an actual msg?
                if (strstr($content, 'PRIVMSG')) {
                    $this->printMessage($content);
                    continue;
                }
    
                sleep(5);
            }
        }
    
        public function printMessage($raw_message)
        {
            $parts = explode(":", $raw_message, 3);
            $nick_parts = explode("!", $parts[1]);
    
            $nick = $nick_parts[0];
            $message = $parts[2];
    
            $style_nick = "info";
    
            if ($nick === $this->getApp()->config->twitch_user) {
                $style_nick = "info_alt";
            }
    
            $this->getPrinter()->out($nick, $style_nick);
            $this->getPrinter()->out(': ');
            $this->getPrinter()->out($message);
            $this->getPrinter()->newline();
        }
    }
    
    コントローラを更新した後、./minichat twitch コマンドは再び、あなただけの実際のチャットメッセージ、きれいにフォーマット表示されます.さえずりのストリームマネージャに戻って、チャットでいくつかのメッセージを送信することを忘れないでください.
    これが私の端末( zshで)を見ているのです.

    ここから、メッセージの解析を改善することができますので、チャットコマンドを実装し、リストを無視し、頻繁に視聴者の認識.

    ステップ5 : OBSオーバーレイの作成


    今あなたの端末上で実行しているチャットを持っている場合は、オーバーレイを作成するには、OBSのスタジオ上のウィンドウソースを使用することができます.
    私は通常、ストリームの背景と私は、チャットウィンドウとおそらくウェブカメラのように修正される要素のシーンを作成することです.端末のウィンドウや端末のテーマやフォントサイズなどのサイズを調整する必要があります.

    私は、チャットウィンドウのカスタムプロファイルを作成することですので、私は完全に透明な背景とカスタムフォントを持つことができます.
    このチュートリアルを楽しんでいただければ幸いです