コンテンツへスキップ
Create an IRC Bot Using Python 2

Create an IRC Bot Using Python 2

IRC(Internet Relay Chat)に馴染みがない方のために説明すると、IRC(Internet Relay Chat)は、世界中のユーザーとのチャットを促進するために使用されるアプリケーション層プロトコルであり、1980年代後半から存在し、今日でも広く使用されています。

4min read

IRC(Internet Relay Chat)に馴染みがない方のために説明すると、IRC(Internet Relay Chat)は、世界中のユーザーとのチャットを促進するために使用されるアプリケーション層プロトコルであり、1980年代後半から存在し、今日でも広く使用されています。

IRCネットワークにはいくつかの異なるものがあるため、どれを使用するかは個人の好みによって異なります。

Why Create an IRC Bot?

簡単に言えば、IRCボットは一般的にシンプルで楽しく作成できます。これにより、チャンネルの機能を拡張したり、チャンネルの楽しいインタラクティブゲームを作成したりすることもできます。基本的に、ボット機能の可能性は無限大であり、Pythonの使いやすさと組み合わせれば、非常に少ないコード行で複雑なボットを作成できます。

IRCサーバーに接続するにはどうすればいいですか?

IRCサーバーへの接続プロセスは簡単です*。

  1. Connect to XXXX server on port XXXX (typically 6667)
  2. USER コマンドの送信
  3. NICK コマンドの送信
  4. 任意の PING コマンドに応答する

* – 一部のIRCサーバーでは、接続方法や受信するメッセージの形式が異なるため、通常接続するホストの参照情報を必ず検索してください。

IRCサーバーに接続する前に、server、botnick、connectで参加するチャネル、およびsentUsersentNickのブールフラグの変数を設定します。sentUserおよびsentNickブール・フラグは、これらのコマンドが接続中に以前にサーバーに送信されていたかどうかを判別するために使用されます。

server = "ix.undernet.org"
channel = "#usa"
botnick = "uberbot" + str(random.randint(1, 10000))
sentUser = False
sentNick = False

Connect to XXXX server on port XXXX

サーバーに接続するには、単純なソケットを作成し、connectメソッドを呼び出して接続します。

irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "\nConnecting to:" + server
irc.connect((server, 6667))

USER コマンドの送信

次に、短いユーザー名と人間が読める実名を使用してユーザーセッションを登録(および何かが認証)します。コマンドの形式は、次のようになります。

USER (username) (hostname) (unused) (realname)
if sentUser == False:
   irc.send("USER " + botnick + " " + botnick + " " + botnick + " :This is a fun bot\n")
   sentUser = True
   continue

NICK コマンドの送信

USER コマンドの後に NICK コマンドを送信して、チャットのニックネームを指定します。コマンドの形式は、次のようになります。

NICK (nickname)
if sentUser and sentNick == False:
   irc.send("NICK " + botnick + "\n")
   sentNick = True
   continue

任意の PING コマンドに応答する

IRC サーバーは、接続されているクライアントに定期的に PING コマンドを送信して、クライアントがまだ接続されているかどうかを判断します。接続されていることを示すには、各PINGにPONGと提供されたPINGトークンで応答する必要があります。PING コマンドは、次の形式を使用します。

PING (token)
if text.find("PING") != -1:
   irc.send("PONG " + text.split()[1] + "\n")

ボットはどのようにコマンドを受け入れますか?

ボットがコマンドを受け入れるようにするには、バッファーからの入力を解析し、それに応じて応答する必要があります。IRC はテキストベースであるため、サーバーからのメッセージはすべて正規表現や単純なテキスト検索を使用して簡単に解析できます。次のスニペットは、「!host」を含むチャネルまたはプライベートメッセージのメッセージテキストを検索します。見つかった場合、ボットは OS バージョン情報で応答します。

if text.find(":!host") != -1:
irc.send("PRIVMSG " + channel + " :" + str(platform.platform()) + "\n")

Codezだけをもらうことはできますか?

以下のソースコードは、この投稿で使用されたコードの完全なリストです。

import platform
import random
import socket
import sys

reload(sys)
sys.setdefaultencoding('utf8')

server = "ix.undernet.org"
channel = "#usa"
botnick = "uberbot" + str(random.randint(1, 10000))
sentUser = False
sentNick = False

irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
print "\nConnecting to:" + server
irc.connect((server, 6667))

try:
   while 1:
      text = irc.recv(2048)
      if len(text) > 0:
         print text
      else:
         continue

      if text.find("PING") != -1:
         irc.send("PONG " + text.split()[1] + "\n")

      if sentUser == False:
         irc.send("USER " + botnick + " " + botnick + " " + botnick + " :This is a fun bot\n")
         sentUser = True
         continue

      if sentUser and sentNick == False:
         irc.send("NICK " + botnick + "\n")
         sentNick = True
         continue

      if text.find("255 " + botnick) != -1:
         irc.send("JOIN " + channel + "\n")

      if text.find(":!host") != -1:
         irc.send("PRIVMSG " + channel + " :" + str(platform.platform()) + "\n")

except KeyboardInterrupt:
   irc.send("QUIT :I have to go for now!\n")
   print "\n"
   sys.exit()

詳細はどこで学べますか?

以下のリンクは、IRC、IRCボット、およびIRCプロトコルについて学ぶための優れた参考資料です。

By トーリー・ベッツ

デモを予約