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




sockets irc connect bots (5)

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

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

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


Answers

मैंने इसे मुख्य आईआरसी कोड के रूप में इस्तेमाल किया:

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 साथ शुरू होना चाहिए और टेक्स्ट को : साथ शुरू होना चाहिए:!


यह आईआरसी प्रोटोकॉल के मोड़ के कार्यान्वयन पर इसे आधार देने के लिए शायद सबसे आसान होगा। एक नज़र डालें: प्रेरणा के लिए http://github.com/brosner/bosnobot


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

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

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

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

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


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

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

यह तय करने के लिए कि क्या @staticmethod या @classmethod का उपयोग करना है, आपको अपनी विधि के अंदर देखना होगा। यदि आपकी विधि आपकी कक्षा में अन्य चर / विधियों तक पहुंचती है तो @classmethod का उपयोग करें । दूसरी ओर, यदि आपकी विधि कक्षा के किसी अन्य भाग को छूती नहीं है तो @staticmethod का उपयोग करें।

class Apple:

    _counter = 0

    @staticmethod
    def about_apple():
        print('Apple is good for you.')

        # note you can still access other member of the class
        # but you have to use the class instance 
        # which is not very nice, because you have repeat yourself
        # 
        # For example:
        # @staticmethod
        #    print('Number of apples have been juiced: %s' % Apple._counter)
        #
        # @classmethod
        #    print('Number of apples have been juiced: %s' % cls._counter)
        #
        #    @classmethod is especially useful when you move your function to other class,
        #       you don't have to rename the class reference 

    @classmethod
    def make_apple_juice(cls, number_of_apples):
        print('Make juice:')
        for i in range(number_of_apples):
            cls._juice_this(i)

    @classmethod
    def _juice_this(cls, apple):
        print('Juicing %d...' % apple)
        cls._counter += 1




python sockets irc connect bots