web-dev-qa-db-ja.com

単純なIRCボットをPythonでプログラムするにはどうすればよいですか?

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

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

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

22
Jake

IRCプロトコルのツイストの実装に基づくのがおそらく最も簡単でしょう。以下を見てください: http://github.com/brosner/bosnobot インスピレーション。

12
Alex Gaynor

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 を参照してください。

お役に立てれば!

50
TheMagician

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

17
MichaelvdNet

これは MichaelvdNet's 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
    
2
earthmeLon

これでソケットが開きますが、自分が誰であるかをIRCdに知らせる必要もあります。私は昔、Perlで似たようなことをしてきましたが、IRC RFCsが非常に役立つことがわかりました。

メインRFC: http://irchelp.org/irchelp/rfc/rfc.html

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

0
Daenyth