Как мне запрограммировать простого бота IRC на python? - PullRequest
22 голосов
/ 03 июня 2010

Мне нужна помощь в написании базового бота IRC, который просто подключается к каналу. Кто-нибудь может мне это объяснить? Мне удалось подключить его к IRC-серверу, но я не могу подключиться к каналу и войти в систему. Код, который у меня есть на данный момент:

import sockethost = 'irc.freenode.org'
port = 6667
join_sock = socket.socket()
join_sock.connect((host, port))
<code here> 

Любая помощь будет принята с благодарностью.

Ответы [ 5 ]

48 голосов
/ 04 июня 2010

Чтобы подключиться к каналу 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 для дополнительных команд и опций.

Надеюсь, это поможет!

17 голосов
/ 31 августа 2012

Я использовал это в качестве основного кода 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, а текст должен начинаться с :!

12 голосов
/ 03 июня 2010

Вероятно, было бы проще основать его на реализации протокола IRC от Twisted. Взгляните на: http://github.com/brosner/bosnobot для вдохновения.

2 голосов
/ 12 мая 2014

Это расширение Пост MichaelvdNet , которое поддерживает несколько дополнительных вещей:

  • Использует оболочку SSL для сокета
  • Используется аутентификация по паролю сервера
  • Используется аутентификация по паролю nickserv
  • Использует неблокирующие сокеты, чтобы другие события могли срабатывать
  • Записывает изменения в текстовые файлы на канал

    #!/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
    
0 голосов
/ 03 июня 2010

Это откроет сокет, но вы также должны сообщить IRCd, кто вы. Я делал что-то подобное еще много лет назад и нашел, что IRC RFC очень полезны.

Основной RFC: http://irchelp.org/irchelp/rfc/rfc.html

Другие RFC: http://irchelp.org/irchelp/rfc/index.html

...