Почему мой ircbot Python останавливается на NOTICE *: *** Поиск вашего имени хоста ... и не присоединяется к каналу? - PullRequest
1 голос
/ 04 марта 2012

Мой бот irc висит на: calvino.freenode.net "УВЕДОМЛЕНИЕ *: * Поиск вашего имени хоста ..." Он работал до того, как я добавил некоторые функции в свой код.С тех пор я прокомментировал эти функции, но он все еще не работает!Он остается в этом сообщении, не прогрессирует.Я должен заставить его выйти.

Я очень начинающий программист, я начал кодировать только две недели назад.Так что вполне возможно, что у меня где-то очень глупая ошибка.Для справки я использовал этот пост, чтобы написать каркас своего бота.http://ubuntuforums.org/showpost.php?p=9363159&postcount=3 Я не опубликовал остальную часть своего кода, но я поместил его в этот каталог, в случае необходимости!http://pastebin.com/kVF04UFr

    import socket
    import urllib2
    import httplib
    import mechanize

    channel = '#testbot'
    botnick = 'tastybot'
    network = 'irc.freenode.net'
    port = 6667
    irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
    irc.connect ( ( network, port ) )
    print irc.recv ( 4096 )
    irc.send ( 'NICK' + botnick + ':\r\n' )
    irc.send ( 'USER tastybot tastybot tastybot :Python IRC\r\n' )
    irc.send ( 'JOIN' + channel + ':\r\n' )
    irc.send ( 'PRIVMSG' + channel + ':What\'s up?\r\n' )
    running = True

    [various functions]

    while running:
        [rest of code]

Ответы [ 3 ]

1 голос
/ 04 марта 2012

Я предполагаю, что IRC-сервер, к которому вы подключаетесь, требует предоставления идентификатора:

Ident - это старый протокол, который серверы использовали для определения того, какой пользователь в общей системе подключался к ним,В настоящее время он чаще всего используется для отсеивания клонов и флудботов с скомпрометированных машин (на которых обычно не установлен idd [идентификатор идентификатора]).

Источник: http://help.undernet.org/faq.php#19

Самое простое решение этой проблемы - попытаться подключиться к другому IRC-серверу, вы можете попробовать holmes.freenode.net в качестве вашего сервера.У меня не было проблем с использованием моего IRC-бота на этом сервере.

Редактировать: Если вы хотите взглянуть на код, который я использую для подключения к серверу: connection.py

1 голос
/ 04 марта 2012

Не уверен, что это ваша ошибка, но у вас, похоже, есть проблема с вашей строкой:

irc.send ( 'PRIVMSG' + channel + ':What's up?\r\n' )

ваш апостроф, заставляющий программу думать, что она вышла из строки

0 голосов
/ 25 января 2017

Вы забыли пробелы при отправке.Должно быть так:

import socket
import urllib2
import httplib
import mechanize

channel = '#testbot'
botnick = 'tastybot'
botuser = 'tastybot'
network = 'irc.freenode.net'
port = 6667
irc = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
irc.connect ( ( network, port ) )
print irc.recv ( 4096 )
irc.send ( 'NICK ' + botnick + '\r\n' )
irc.send ( 'USER ' + botuser + ' 0 * :Python IRC\r\n' ) # Read RFC next time, please
irc.send ( 'JOIN ' + channel + '\r\n' )
irc.send ( 'PRIVMSG ' + channel + ' :What\'s up?\r\n' )
running = True

[various functions]

while running:
    [rest of code]

Если учетная запись использует пароль, просто отправьте PASS password в качестве ПЕРВОГО сообщения - перед отправкой имени пользователя и псевдонима - сразу после установления соединения.

Также в IRC (какопределяется RFC) максимальное сообщение len составляет 512 байт.

Кстати, вам действительно следует прекратить чтение кадра, когда последние 2 символа в полученных строках равны \r\n.Пример в моем боте (hy-powered):

  (defn read [self]
    (setv b 512)
    (setv on True)
    (setv c "")
    (while (and on (!= b 0))
      (setv x (self.sock.recv 1))
      (+= c (x.decode "UTF-8"))
      (-= b 1)
      (if (= "\r\n" (cut c -2))
        (do
          (if (= "" (cut c -2))
            (continue))
          (setv on False)
          (setv c (cut c 0 -2)))))
    c)
...