2010-06-03 57 views
19

我需要幫助寫一個基本的IRC機器人只是連接到一個頻道..是否有人能夠解釋我呢?我設法讓它連接到IRC服務器,但我無法加入頻道並登錄。我到目前爲止的代碼是:如何在python中編寫簡單的IRC bot?

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

任何幫助將不勝感激。

+3

爲什麼要重新發明輪子?已經有很多用Python編寫的IRC機器人。 – jamessan 2010-06-03 18:13:32

+34

@jamessan當然要學習:) – 2010-06-03 19:53:33

+7

@eric我喜歡這個迴應:D – 2013-12-11 13:26:21

回答

11

它可能是最容易的基礎上扭曲的實施IRC協議。看看:http://github.com/brosner/bosnobot獲取靈感。

+2

http://www.habnabit.org/twistedex.html是一個教程基本的IRC機器人使用t.w.p – 2010-06-03 18:59:44

45

要連接到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 

回覆完全相同的文字「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

希望這會有所幫助!

+2

謝謝,這是偉大的!尤其是關於telnet的提示..沒有想到它:)謝謝..我可能還有幾個問題。讓我試試telnet的東西,然後我會回來! – Jake 2010-06-03 21:20:33

+0

這是我的會議: 注意AUTH:***處理連接irc.mzima.net 注意AUTH:***看你的主機名... 注意AUTH:***檢查訂貨號 注意AUTH:* **找到你的主機名 注意AUTH:***沒有身份確認 NICK PYIRC \ r \ n USER PYIRC PYIRC PYIRC:Python的\ r \ n JOIN #pytest \ r \ n :irc.mzima.net 451 * :您還沒有註冊 它似乎是註冊..我如何註冊?或者你知道一個不需要的IRC服務器嗎? 我迷路了................ – Jake 2010-06-03 22:35:26

+0

我不認爲你可以像這樣同時發送命令。嘗試單獨發送它們,因爲服務器可能會在命令之間向您發送一些內容,因此您會收到註冊通知,這實際上是指連接註冊。顯然,你必須在NICK/USER之前發送一個PASS 命令,我以前從來沒有必須使用這個命令,所以試試看,我更新了我的帖子。 – TheMagician 2010-06-04 04:50:19

15

我用這個作爲主要的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文本必須與PRIVMSGNOTICE啓動+channel/user和文本應該以:開頭!

+0

這很好,但我只能得到while循環來觸發,如果irc.recv(2040)返回的東西。 – earthmeLon 2014-05-12 17:46:02

+0

您可以在irc.connect()之後設置irc.setblocking(False),但一定要在while循環中添加time.sleep(),除非您想使用處理器來加熱家中。 – earthmeLon 2014-05-12 18:07:44

+0

無論如何消息使用命令的暱稱? – 2015-05-24 03:03:56

2

這是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