Create an IRC Bot Using Python 2
IRC(Internet Relay Chat)에 익숙하지 않은 분들을 위해 설명하자면, IRC는 전 세계 사용자와의 채팅을 용이하게 하는 데 사용되는 애플리케이션 계층 프로토콜이며 1980년대 후반부터 사용되어 왔으며 오늘날까지 널리 사용되고 있습니다.
IRC(Internet Relay Chat)에 익숙하지 않은 분들을 위해 설명하자면, IRC는 전 세계 사용자와의 채팅을 용이하게 하는 데 사용되는 애플리케이션 계층 프로토콜이며 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, 연결 시 참여할 채널, 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")
코드만 가질 수 있습니까?
아래 소스 코드는 이 게시물에 사용된 코드의 전체 목록입니다.
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 프로토콜에 대해 배울 수 있는 훌륭한 참고 자료입니다.