22

チャンネルに接続するだけの基本的な IRC ボットを作成するのに助けが必要です。これについて説明できる人はいますか? IRC サーバーに接続することはできましたが、チャンネルに参加してログオンすることができません。これまでのコードは次のとおりです。

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

どんな助けでも大歓迎です。

4

5 に答える 5

53

IRC チャネルに接続するには、特定の IRC プロトコル固有のコマンドを IRC サーバーに送信してからでないと実行できません。

サーバーに接続するときは、サーバーがすべてのデータ (MOTD など) を送信するまで待機する必要があります。その後、PASS コマンドを送信する必要があります。

PASS <some_secret_password>

次は NICK コマンドです。

NICK <username>

次に、USER コマンドを送信する必要があります。

USER <username> <hostname> <servername> :<realname>

どちらも必須です。

次に、サーバーからの PING メッセージが表示される可能性があります。サーバーが PING メッセージを送信するたびに、PONG コマンドでサーバーに応答する必要があります。サーバーは、NICK コマンドと USER コマンドの間でも PONG を要求する場合があります。

PING :12345678

PONG コマンドを使用して、「PING」の後にまったく同じテキストを返信します。

PONG :12345678

PINGはすべてのサーバーに固有のものであると私は信じているので、サーバーから送信された値を返信してください。

JOIN コマンドでチャンネルに参加できるようになりました:

JOIN <#channel>

PRIVMSG コマンドを使用して、チャネルとユーザーにメッセージを送信できるようになりました。

PRIVMSG <#channel>|<nick> :<message>

でやめる

QUIT :<optional_quit_msg>

Telnet を試してみましょう。皮切りに

telnet irc.example.com 6667

その他のコマンドとオプションについては、 IRC RFCを参照してください。

お役に立てれば!

于 2010-06-03T20:17:06.467 に答える
18

私はこれをメイン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で始まる必要があり、テキストは:!で始まる必要があることに注意してください。

于 2012-08-31T16:16:53.527 に答える
13

twisted の IRC プロトコルの実装に基づいて作成するのがおそらく最も簡単でしょう。インスピレーションについては、http : //github.com/brosner/bosnobotをご覧ください。

于 2010-06-03T17:40:13.843 に答える
2

これは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
    
于 2014-05-12T18:12:45.977 に答える
0

これでソケットが開きますが、IRCd に自分が誰であるかを伝える必要もあります。私は何年も前に perl で似たようなことをしたことがあり、IRC RFC が非常に役立つことがわかりました。

主な RFC: http://irchelp.org/irchelp/rfc/rfc.html

その他の RFC: http://irchelp.org/irchelp/rfc/index.html

于 2010-06-03T17:41:44.807 に答える