Ответ 1
Вероятно, было бы проще всего основать его на скрученной реализации протокола IRC. Взгляните на http://github.com/brosner/bosnobot для вдохновения.
Мне нужна помощь в написании базового IRC-бота, который просто подключается к каналу. Кто-нибудь может объяснить мне это? Мне удалось подключить его к IRC-серверу, но я не могу присоединиться к каналу и войти в систему. Код, который я до сих пор:
import sockethost = 'irc.freenode.org'
port = 6667
join_sock = socket.socket()
join_sock.connect((host, port))
<code here>
Любая помощь будет принята с благодарностью.
Вероятно, было бы проще всего основать его на скрученной реализации протокола IRC. Взгляните на http://github.com/brosner/bosnobot для вдохновения.
Чтобы подключиться к IRC-каналу, вы должны отправить определенные IRC-протоколы на сервер IRC, прежде чем вы сможете это сделать.
Когда вы подключаетесь к серверу, вы должны подождать, пока сервер не отправит все данные (MOTD и еще что-то), тогда вы должны отправить команду PASS.
PASS <some_secret_password>
Далее следует команда NICK.
NICK <username>
Затем вы должны отправить команду USER.
USER <username> <hostname> <servername> :<realname>
Оба являются обязательными.
Тогда вы, вероятно, увидите сообщение PING с сервера, вы должны отвечать на сервер командой PONG каждый раз, когда сервер отправляет вам сообщение PING. Сервер может запросить PONG между командами NICK и USER.
PING :12345678
Ответить с тем же текстом после "PING" с командой PONG:
PONG :12345678
Что после PING уникально для каждого сервера, я верю, поэтому убедитесь, что вы ответили на то, что сервер отправил вам.
Теперь вы можете присоединиться к каналу с командой JOIN:
JOIN <#channel>
Теперь вы можете отправлять сообщения каналам и пользователям с помощью команды PRIVMSG:
PRIVMSG <#channel>|<nick> :<message>
Завершить с помощью
QUIT :<optional_quit_msg>
Экспериментируйте с Telnet! Начните с
telnet irc.example.com 6667
Подробнее о командах и параметрах см. IRC RFC.
Надеюсь, это поможет!
Я использовал это как MAIN IRC-код:
import socket
import sys
server = "server" #settings
channel = "#channel"
botnick = "botname"
irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #defines the socket
print "connecting to:"+server
irc.connect((server, 6667)) #connects to the server
irc.send("USER "+ botnick +" "+ botnick +" "+ botnick +" :This is a fun bot!\n") #user authentication
irc.send("NICK "+ botnick +"\n") #sets nick
irc.send("PRIVMSG nickserv :iNOOPE\r\n") #auth
irc.send("JOIN "+ channel +"\n") #join the chan
while 1: #puts it in a loop
text=irc.recv(2040) #receive the text
print text #print text to console
if text.find('PING') != -1: #check if 'PING' is found
irc.send('PONG ' + text.split() [1] + '\r\n') #returnes 'PONG' back to the server (prevents pinging out!)
Затем вы можете начать установку команд, таких как: !hi <nick>
if text.find(':!hi') !=-1: #you can change !hi to whatever you want
t = text.split(':!hi') #you can change t and to :)
to = t[1].strip() #this code is for getting the first word after !hi
irc.send('PRIVMSG '+channel+' :Hello '+str(to)+'! \r\n')
Обратите внимание, что все тексты irc.send
должны начинаться с PRIVMSG
или NOTICE
+ channel/user
, и текст должен начинаться с :
!
Это расширение MichaelvdNet Post, которое поддерживает несколько дополнительных вещей:
Записывает изменения в текстовые файлы на канал
#!/usr/local/bin/python
import socket
import ssl
import time
## Settings
### IRC
server = "chat.freenode.net"
port = 6697
channel = "#meLon"
botnick = "meLon-Test"
password = "YOURPASSWORD"
### Tail
tail_files = [
'/tmp/file-to-tail.txt'
]
irc_C = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #defines the socket
irc = ssl.wrap_socket(irc_C)
print "Establishing connection to [%s]" % (server)
# Connect
irc.connect((server, port))
irc.setblocking(False)
irc.send("PASS %s\n" % (password))
irc.send("USER "+ botnick +" "+ botnick +" "+ botnick +" :meLon-Test\n")
irc.send("NICK "+ botnick +"\n")
irc.send("PRIVMSG nickserv :identify %s %s\r\n" % (botnick, password))
irc.send("JOIN "+ channel +"\n")
tail_line = []
for i, tail in enumerate(tail_files):
tail_line.append('')
while True:
time.sleep(2)
# Tail Files
for i, tail in enumerate(tail_files):
try:
f = open(tail, 'r')
line = f.readlines()[-1]
f.close()
if tail_line[i] != line:
tail_line[i] = line
irc.send("PRIVMSG %s :%s" % (channel, line))
except Exception as e:
print "Error with file %s" % (tail)
print e
try:
text=irc.recv(2040)
print text
# Prevent Timeout
if text.find('PING') != -1:
irc.send('PONG ' + text.split() [1] + '\r\n')
except Exception:
continue
Это откроет сокет, но вам также нужно сообщить IRCd, кто вы. Я сделал что-то подобное в perl веке назад, и я нашел RFC IRC очень полезным.
Основной RFC: http://irchelp.org/irchelp/rfc/rfc.html
Другие RFC: http://irchelp.org/irchelp/rfc/index.html