Подтвердить что ты не робот

Как программировать простой IRC-бот в python?

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

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

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

4b9b3361

Ответ 1

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

Ответ 2

Чтобы подключиться к 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.

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

Ответ 3

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

Ответ 4

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

  • Использование оболочки 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