3
import socket

irc = 'irc.hack3r.com'
port = 6667
channel = '#chat'
sck = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sck.connect((irc, port))
sck.send('NICK supaBOT\r\n')
sck.send('USER supaBOT supaBOT supaBOT :supaBOT Script\r\n')
sck.send('JOIN #chat' + '\r\n')
data = ''
while True:
     data = sck.recv(4096)
     if data.find('PING') != -1:
        sck.send('PONG ' + data.split() [1] + '\r\n')
        print data

print sck.recv(4096)

サーバーに接続すると、チャネルに参加できません。次のエラーが発生します。

「451JOIN:まだ登録していません」

4

4 に答える 4

11

マイク・グラハムは間違っています。問題は、JOIN コマンドの送信が早すぎることです。サーバーが NICK および USER コマンドを登録するのに時間がかかるため、「ニックが登録されていません」というエラーが表示されます。この返信を参照してください: Python IRC ボットは参加しません

また、裸のソケットでボットを作成することで、IRC プロトコルの学習と発見を継続することをお勧めします。コードが RFC 1459 に完全に準拠しているわけではありません。標準に 100% 準拠しているサーバー、クライアント、またはボットはほとんどありません。でも効くなら効く!

Daenyth の言うこととは異なり、裸のソケット IRC ボットで素晴らしい結果を得るのはそれほど難しくありません。RFC を少し読んで実験してみてください。

于 2012-04-01T16:23:32.723 に答える
2

あなたは登録されていないようです。それはそのチャンネルに参加するための要件です。参加する前に、ニックネームを登録してから特定する必要があります。

また、裸のソケットでircボットを作成しようとするのは良い考えではありません。このコードはRFC1459を有用なレベルまで実装しておらず、プログラムのロジックをネットワークに統合しています。ネットワークライブラリ(Twistedのようtwisted.wordsにIRCプロトコルの優れた実装があります)を使用するか、1つと同等のコードを作成することを検討してください。(ヒント、前者の方が簡単で迅速で、バグが発生しにくくなります。)

于 2010-02-19T20:08:07.347 に答える
0

Pythonツイストircクライアント

インストール

sudo yum install python-twisted-words

また

sudo apt-get install python-twisted-words

APIドキュメント

http://twistedmatrix.com/documents/8.2.0/api/twisted.words.protocols.irc.IRCClient.html

#!/usr/bin/env python2.7

from twisted.internet import reactor, protocol
from twisted.words.protocols import irc

class IRCLogger(irc.IRCClient):
    logfile = file('/tmp/freenode.txt', 'a+')

    nick = 'davey_jones_logger'

    def signedOn(self):
        self.join('#scala')

    def privmsg(self, user, channel, message):
        print "Got msg %s " % message
        self.logfile.write(" %s said %s \n" % ( user.split('!')[0], message ))
        self.logfile.flush()

def main():
    f = protocol.ReconnectingClientFactory()
    f.protocol = IRCLogger
    reactor.connectTCP('irc.freenode.net', 6667, f)
    reactor.run()

if __name__ == '__main__':
    main()
于 2013-01-06T18:21:55.947 に答える
0

参加しようとしている特定のチャンネルでは、そのサーバーのニックサーブに登録する必要があります。通常の IRC クライアントを使用してサーバーに接続し、自分でチャネルを作成して、ボットに参加するように指示してみてください。

于 2010-02-19T20:49:43.287 に答える