[python] मैं पायथन में एक साधारण आईआरसी बॉट कैसे प्रोग्राम करूं?


1 Answers

एक आईआरसी चैनल से कनेक्ट करने के लिए, आपको आईआरसी प्रोटोकॉल विशिष्ट आदेशों को आईआरसी सर्वर पर भेजने से पहले भेजना होगा।

जब आप सर्वर से कनेक्ट होते हैं तो आपको तब तक इंतजार करना होगा जब तक कि सर्वर ने सभी डेटा (एमओटीडी और व्हाट्नॉट) नहीं भेजा है, तो आपको पास कमांड भेजना होगा।

PASS <some_secret_password>

निम्क कमांड क्या है।

NICK <username>

फिर आपको USER कमांड भेजना होगा।

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

दोनों अनिवार्य हैं।

फिर आपको सर्वर से PING संदेश देखने की संभावना है, जब भी सर्वर आपको PING संदेश भेजता है तो आपको PONG कमांड के साथ सर्वर को जवाब देना होगा। सर्वर भी निक और यूजर कमांड के बीच पोंग के लिए पूछ सकता है।

PING :12345678

पोंग कमांड के साथ "पिंग" के बाद सटीक उसी पाठ के साथ उत्तर दें:

PONG :12345678

मुझे लगता है कि प्रत्येक सर्वर के लिए PING अद्वितीय है, इसलिए सुनिश्चित करें कि सर्वर द्वारा भेजे गए मान के साथ आप उत्तर दें।

अब आप जॉइन कमांड के साथ एक चैनल में शामिल हो सकते हैं:

JOIN <#channel>

अब आप PRIVMSG कमांड वाले चैनलों और उपयोगकर्ताओं को संदेश भेज सकते हैं:

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

के साथ छोड़ो

QUIT :<optional_quit_msg>

टेलनेट के साथ प्रयोग! के साथ शुरू

telnet irc.example.com 6667

अधिक आदेश और विकल्पों के लिए आईआरसी आरएफसी देखें।

उम्मीद है की यह मदद करेगा!

Question

मुझे एक बुनियादी आईआरसी बॉट लिखने में मदद की ज़रूरत है जो सिर्फ एक चैनल से जुड़ती है .. क्या कोई मुझे यह समझाने में सक्षम है? मैंने इसे आईआरसी सर्वर से कनेक्ट करने में कामयाब रहा है लेकिन मैं एक चैनल में शामिल होने और लॉग ऑन करने में असमर्थ हूं। मेरे पास अब तक का कोड है:

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

किसी भी तरह की सहायता का स्वागत किया जाएगा।




यह माइकलवॉडनेट पोस्ट का एक विस्तार है, जो कुछ अतिरिक्त चीजों का समर्थन करता है:

  • सॉकेट के लिए एसएसएल रैपर का उपयोग करता है
  • सर्वर पासवर्ड प्रमाणीकरण का उपयोग करता है
  • 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
    



Related