Create an IRC Bot Using Python 2
IRC(Internet Relay Chat)に馴染みがない方のために説明すると、IRC(Internet Relay Chat)は、世界中のユーザーとのチャットを促進するために使用されるアプリケーション層プロトコルであり、1980年代後半から存在し、今日でも広く使用されています。
IRC(Internet Relay Chat)に馴染みがない方のために説明すると、IRC(Internet Relay Chat)は、世界中のユーザーとのチャットを促進するために使用されるアプリケーション層プロトコルであり、1980年代後半から存在し、今日でも広く使用されています。
IRCネットワークにはいくつかの異なるものがあるため、どれを使用するかは個人の好みによって異なります。
Why Create an IRC Bot?
簡単に言えば、IRCボットは一般的にシンプルで楽しく作成できます。これにより、チャンネルの機能を拡張したり、チャンネルの楽しいインタラクティブゲームを作成したりすることもできます。基本的に、ボット機能の可能性は無限大であり、Pythonの使いやすさと組み合わせれば、非常に少ないコード行で複雑なボットを作成できます。
IRCサーバーに接続するにはどうすればいいですか?
IRCサーバーへの接続プロセスは簡単です*。
- Connect to XXXX server on port XXXX (typically 6667)
- USER コマンドの送信
- NICK コマンドの送信
- 任意の PING コマンドに応答する
* – 一部のIRCサーバーでは、接続方法や受信するメッセージの形式が異なるため、通常接続するホストの参照情報を必ず検索してください。
IRCサーバーに接続する前に、server、botnick、connectで参加するチャネル、およびsentUserとsentNickのブールフラグの変数を設定します。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プロトコルについて学ぶための優れた参考資料です。