2010-06-03 28 views
19

Tôi cần trợ giúp viết bot IRC cơ bản chỉ kết nối với kênh .. có ai có thể giải thích cho tôi điều này không? Tôi đã quản lý để có được nó để kết nối với máy chủ IRC nhưng tôi không thể tham gia một kênh và đăng nhập. Mã tôi có như vậy là:Làm thế nào để tôi lập trình một bot IRC đơn giản trong python?

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

Mọi trợ giúp sẽ được đánh giá cao.

+3

Tại sao lại phát minh bánh xe? Có rất nhiều chương trình IRC được viết bằng Python. – jamessan

+34

@jamessan Để tìm hiểu, tất nhiên :) –

+7

@eric Tôi thích câu trả lời đó: D –

Trả lời

11

Có lẽ sẽ dễ dàng nhất để căn cứ vào việc thực hiện xoắn của giao thức IRC. Hãy xem: http://github.com/brosner/bosnobot để lấy cảm hứng.

+2

http://www.habnabit.org/twistedex.html là một bot IRC cơ bản hướng dẫn sử dụng t.w.p –

45

Để kết nối với một kênh IRC, bạn phải gửi một số lệnh giao thức IRC cụ thể đối với máy chủ IRC trước khi bạn có thể làm điều đó.

Khi bạn kết nối với máy chủ, bạn phải chờ cho đến khi máy chủ gửi tất cả dữ liệu (MOTD và không có điều gì), thì bạn phải gửi lệnh PASS.

PASS <some_secret_password> 

Sau đây là lệnh NICK.

NICK <username> 

Sau đó, bạn phải gửi lệnh USER.

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

Cả hai đều là bắt buộc.

Sau đó, bạn có thể thấy thông báo PING từ máy chủ, bạn phải trả lời máy chủ bằng lệnh PONG mỗi lần máy chủ gửi tin nhắn PING cho bạn. Máy chủ có thể yêu cầu PONG giữa lệnh NICK và USER.

PING :12345678 

Trả lời với cùng văn bản chính xác sau khi "PING" với lệnh PONG:

PONG :12345678 

gì sau khi PING là duy nhất cho mỗi máy chủ tôi tin rằng do đó hãy chắc chắn rằng bạn trả lời với giá trị mà máy chủ gửi bạn.

Bây giờ bạn có thể tham gia vào một kênh với THAM GIA lệnh:

JOIN <#channel> 

Bây giờ bạn có thể gửi tin nhắn cho các kênh truyền hình và người dùng có lệnh PRIVMSG:

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

Quit với

QUIT :<optional_quit_msg> 

Thử nghiệm với Telnet! Bắt đầu với

telnet irc.example.com 6667 

Xem IRC RFC để biết thêm các lệnh và tùy chọn.

Hy vọng điều này sẽ hữu ích!

+2

Cảm ơn, đây là TUYỆT VỜI! Đặc biệt là tip về telnet .. Thậm chí không nghĩ về nó :) Cảm ơn .. Tôi có thể có thêm một vài câu hỏi .. Hãy để tôi thử điều telnet sau đó tôi sẽ lấy lại! – Jake

+0

Đây là phiên của tôi: THÔNG BÁO AUTH: *** kết nối chế biến để irc.mzima.net THÔNG BÁO AUTH: *** Nhìn lên hostname của bạn ... THÔNG BÁO AUTH: *** Kiểm tra ident THÔNG BÁO AUTH: * ** Tìm thấy hostname THÔNG BÁO AUTH của bạn: *** Không phản ứng ident NICK PYIRC \ r \ n USER PYIRC PYIRC PYIRC: Python \ r \ n THAM GIA #pytest \ r \ n : irc.mzima.net 451 * : Bạn chưa đăng ký Có vẻ như đó là đăng ký .. Làm thế nào để tôi regisster? Hoặc bạn có biết một máy chủ IRC mà không yêu cầu đó? tôi bị mất ................ – Jake

+0

Tôi không nghĩ rằng bạn có thể gửi các lệnh đồng thời như vậy. Hãy thử gửi chúng một cách riêng biệt, bởi vì máy chủ có thể gửi cho bạn một cái gì đó ở giữa các lệnh, do đó bạn nhận được thông báo về đăng ký, thực sự đề cập đến đăng ký kết nối. Rõ ràng có một lệnh PASS bạn cũng phải gửi trước NICK/USER, tôi chưa bao giờ phải sử dụng lệnh đó trước đây, vì vậy hãy thử điều đó, tôi đã cập nhật bài đăng của mình. – TheMagician

15

tôi đã sử dụng điều này như mã IRC CHÍNH:

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!) 

Sau đó, bạn có thể bắt đầu thiết lập các lệnh như: !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') 

Lưu ý rằng tất cả các irc.send văn bản phải bắt đầu với PRIVMSG hoặc NOTICE+channel/user và văn bản sẽ bắt đầu bằng :!

+0

Điều này là tuyệt vời, nhưng tôi chỉ có thể nhận được vòng lặp while để kích hoạt nếu irc.recv (2040) trả về một cái gì đó. – earthmeLon

+0

Bạn có thể đặt irc.setblocking (False) sau irc.connect(), nhưng hãy nhớ thêm time.sleep() vào vòng lặp while trừ khi bạn muốn sử dụng bộ xử lý để làm ấm ngôi nhà của bạn. – earthmeLon

+0

Dù sao để nhắn tin cho biệt danh đã sử dụng lệnh? –

2

Đây là một phần mở rộng của MichaelvdNet's Post, mà hỗ trợ một vài điều bổ sung:

  • Sử dụng wrapper SSL cho ổ cắm
  • Sử dụng máy chủ xác thực mật khẩu
  • Sử dụng xác thực mật khẩu NickServ
  • Sử dụng ổ cắm nonblocking, để cho phép các sự kiện khác kích hoạt
  • Thay đổi nhật ký thành tệp văn bản thành kênh

    #!/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 
    
Các vấn đề liên quan