インターネット・リレー・チャット(IRC)を利用したことがある人なら、どこかでボットに遭遇したことがあるかもしれません。ボットは、人間と同じようにネットワークに接続する独立したプログラムやスクリプトです。ボットは、ユーザーのコマンドに応答したり、チャットをするようにプログラムすることができます。このガイドでは、IRCボットを構築するためのオプションと、ゼロからボットを構築する方法を紹介します。
オプションの評価
-
クライアントスクリプトのインストールを検討してください。単純な作業をさせたいだけで、独立したプログラムにしたくない場合もあります。その場合、IRCクライアントにスクリプトを添付することができる。これは、堅牢なスクリプト・エンジンと多種多様な利用可能スクリプトを持つIRCクライアントで行うのが一般的です。これは最も簡単な方法であり、プログラミングの経験があまりない、あるいは全くない場合に強くお勧めします。このガイドの残りの部分については、コンピュータ・プログラミングの知識が必要です。
-
ボット用に既存のコードベースを利用する。自分用にカスタマイズされたボットを素早くセットアップするのに役立つオープンソースやフリーのプログラムがたくさんあります。そのような例の一つが、現在もメンテナンスされている最も古いIRCボットです。
-
あなた自身のボットを書くことを検討してください。IRCの上級ユーザーや、すでにプログラミング言語を使いこなしている開発者にとっては、これは素晴らしい選択肢です。ソケットサポートさえあれば、どんな言語でも使えますが、よく使われるのはPython、Lua、PHP、C、Perlなどです。これらの言語を知らなくても、他の言語を知っていれば問題ない。どんな言語でも、たいていウェブ上でサンプルを見つけることができる。この記事では、PHPを使って説明します。PHPを使うには、PHP-CLIをコンピュータかサーバーにインストールする必要があります。
- PHP は以下からダウンロードできます。
- PHP スクリプトはコマンドラインから実行することができます。PHPを使用するための追加情報やヘルプについては、.PHPを参照してください。
独自のボットを開発する
-
接続の詳細を収集する。ネットワークへの接続を成功させるには、以下の情報を取得する必要があります。
- サーバー:chat.freenode.netなど、IRCに接続するために使用するサーバーのドメイン名。
- ポート: ほとんどの場合6667ですが、わからない場合は自分のIRCクライアントかネットワークのウェブサイトを確認してください。
- ニックネーム: あなたのボットが使うニックネームです。通常、いくつかの特殊文字は許可されていないことに注意してください (@#!~)。
- Ident:ident フィールドは誰かが WHOIS を実行したときにニックネームの後に次のように表示されます: nickname!ident@hostname
- GECOS:このフィールドには通常、ユーザーの本名やボットの一般的な説明を書きますが、好きなものを書くことができます。
- チャンネル:通常、ボットは1つ以上のチャンネルに存在させたい。ほとんどのネットワークでは、これらの先頭に '#' が付きますが、それ以外の場合もあります。
-
スクリプトで設定を初期化する。最も基本的な方法は、上記の設定名に従っていくつかの変数に名前を付けることです。これらの変数を設定ファイルに保存し、それを解析することもできますが、今は必要なものだけにしましょう。
-
ネットワークに接続する。そのためには、指定されたポートでサーバーへのソケットを開く必要がある。また、何らかの理由で接続に失敗した場合に備えて、この部分にエラー処理コードを追加しておく必要があります。この場合、PHPにはエラーを効率的に処理するための関数が用意されています。
-
ボットを登録します。これは NickServ に登録するのではなく、ニックネーム、ident、GECOS をサーバーに供給することを意味します。これを行うには、単にNICKとUSERコマンドをサーバーに書き、キャリッジリターンと改行が続きます。これは IRC プロトコルの仕様である RFC1459 で指定されている方法なので、図のように正確に行うことが必須です。
- 真ん中の2つのパラメータ(この場合、*と8)は指定しなければならないが、サーバーでは無視されることに注意。この2つはリンクされたサーバー間でのみ使用され、直接接続するクライアントでは使用されません。
-
ループを使ってソケットからデータを取得し続ける。ループを使わないと、スクリプトはすぐに終了してしまい、ボットは基本的に使い物にならなくなってしまう。接続を維持するためには、サーバーからデータを取得し、必要なストリームに入力がないかチェックし、入力があればそれに応答する必要があります。ここでは、socket_read()を使ってデータを取得している。入力があれば、ループ内の処理を続ける。生データをコンソールに出力して、ボットの視点から何が起こっているのかを確認することもできます。
-
pingハンドラを書く。これは重要です。Pingにタイムリーに応答しないと、サーバーはあなたを切断します。まずはそれを解決しましょう。サーバーから送信されるPingは次のようになります:PING :rajaniemi.freenode.net.サーバーは自分の名前を ':' の後に書く必要はありません。PONGを使う以外は、サーバーが言ったことをそのまま返さなければならない。
-
チャンネルに参加する。さて、ネットワークに接続してPingに応答するボットができましたが、それ以外は何もしません。人々があなたのボットを見たり使ったりするためには、ボットをチャンネルに参加させる必要があります(そうでなければ、プライベートメッセージに応答するように指示しなければなりません)。
- そのためには、サーバーのステータスコード 376 か 422 をチェックします。376はMOTD(今日のメッセージ)が終了したことを意味します。422は送信するMOTDがなかったことを意味します。MOTDは接続時にサーバーが送信するものですが、いつチャンネルに参加できるかの目安になります。
- JOINコマンドを発行する必要がある。このコマンドの後には、1つ以上のチャンネルをカンマで区切って指定することができる。
- サーバーが送信するデータはスペースで区切られていることに注意してほしい。こうすることで、データを分割し、配列のインデックスを使って参照することができます。
-
チャネルメッセージに応答するさて、ここからが楽しいところです。ボットがチャンネルに参加したので、次はそれを好きなように使うことができます。それでは、@moo というコマンドの例を作ってみましょう。
- メッセージの開始位置のオフセットに注意してください(これはチャンネルとプライベートメッセージの両方に当てはまります)。これは常に同じ場所にあります。
- 空白を含むコマンドは、チャンクされたデータをスプライスすることで扱うことができます($d)。それはこの記事の範囲外です。
- 対象がチャンネル(#botters-testなど)なら、それに返信する。プライベートメッセージの場合、このビットがあなたのボットのニックネームになります!その場合、あなたのニックネームではなく、送信者のニックネームを使用して返信しなければなりません (そうしないと、自分自身に話しかけていることになり、それはただの愚かな行為です)。
-
ボットを拡張する上記の実装を使って、多くの新機能を追加することができます。IRCネットワークに対して発行できるコマンドは他にもたくさんあります。例えば、opsの管理、キックや禁止、トピックの設定など、他にもたくさんの機能があります。
コメント
最新を表示する
NG表示方式
NGID一覧