Python: не будет подключаться к серверу - PullRequest
0 голосов
/ 24 января 2011

Я не могу подключиться к серверу, который будет распечатан

«Соединение с портом ...», тогда будет просто «Тайм-аут сокетов».

Моя программа должна быть завтра, и было бы неплохо, чтобы это действительно сработало.

РЕДАКТИРОВАННЫЙ КОД: Теперь он будет использовать только подключение к порту .... больше ничего не напечатано.

import socket, string, time, random, re, urllib2, cookielib, smtplib, os

class Pibot: #main class
        def __init__(self):  #basic information to allow for the rest of the program to work.
            self.server= 'irc.evilzone.org'
            self.port = 6667
            self.botname= 'pibot'
            self.chan= 'test'
            self.owner = 'Josh.H'
            self.nick = "bawt"
            self.irc = None
            self.data = ''

    def iConnect(self): #trys to connect to the server and allows the user to see if it failed to connect.
            print ("Connecting to ports...")
            print self.data
            time.sleep(3)
            try:
                    self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                    self.irc.connect((self.server, self.port))

            except (socket.error, socket.herror, socket.gaierror):
                    print "Failed to connect to Ports"



    def iStart(self):
            #Not guaranteed to send all your data, iisn't checking the return values
            #however this function iStart is used to send the NICK of the bot and the USER to the server through particle data
            #it then auto joins the channel
            #in future development I'd like to get accuainted with Twisted or IRCutils as they allow it to be quiet powerful and less buggy

            self.irc.send('NICK %s\r\n' % self.nick)
            self.irc.send("USER %s %s bla :%s\r\n" % ("Ohlook", 'itsnotmy', 'Realname'))
            time.sleep(4)
            self.irc.send("JOIN #%s\r\n" % self.chan)
            self.data = self.irc.recv( 4096 ) 

    def MainLoop(self,iParse = 0): #MainLoop is used to make the commands executable ie !google !say etc;
            try:
                while True:
                    # This method sends a ping to the server and if it pings it will send a pong back
                    #in other clients they keep receiving till they have a complete line however mine does not as of right now
                    #The PING command is used to test the presence of an active client or
                    #server at the other end of the connection.  Servers send a PING
                    #message at regular intervals if no other activity detected coming
                    #from a connection.  If a connection fails to respond to a PING
                    #message within a set amount of time, that connection is closed. A
                    #PING message MAY be sent even if the connection is active.
                    #PONG message is a reply to PING message.  If parameter <server2> is
                    #given, this message will be forwarded to given target.  The <server>
                    #parameter is the name of the entity who has responded to PING message
                    #and generated this message.

                    self.data = self.irc.recv( 4096 )
                    if self.data.find ( 'PING' ) != -1:
                        self.irc.send(( "PONG %s \r\n" ) % (self.recv.split() [ 1 ])) #Possible overflow problem

                    if self.data.find( "!google" ) != -1:
                        #googles the search term and displays the first 5 results
                        #format = !google: <Search Term>
                        #One thing that I noticed is that it will print on a seperate line without the header
                        #In the next Update I would have fixed this.
                        fin = data.split(':')
                        if not fin:
                                irc.send("PRIVMSG #%s :syntax'^google :search term\r\n'" % chan)

                        else:
                            #In the next version to avoid overflow I will create another if statement and edit the search code
                            #However I am using what xgoogle has reccomended.
                                fin = fin[3].strip() 
                                gs = GoogleSearch(fin)
                                gs.results_per_page = 5
                                results = gs.get_results()
                                for result in results:
                                    irc.send("PRIVMSG #%s :%s\r\n" % (chan, result.url.encode("utf8")))

                    ###############################################################################################################################
                    #   No excpetion checking here, these functions can and will fail in time and in later versions will need to be edited.          
                    #   If hellboundhackers changes this code may break
                    #   This function takes a quote from the header of hellboundhackers
                    #   it first looks at the header of the USer agent then the header of the website (HBH) and reads it then prints
                    #   the quote when QUOTEM is recognized in the irc closes the connection to the wbesite and deletes the cookie
                    ###############################################################################################################################

                    if "QUOTEM" in self.data:
                        #Pulls a quote from HBH
                        cj = cookielib.CookieJar()
                        opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
                        opener.addheaders.append(('User-agent', 'Mozilla/4.0'))
                        opener.addheaders.append( ('Referer', 'http://www.hellboundhackers.org/index.php') )
                        resp = opener.open('http://www.hellboundhackers.org/index.php')
                        r = resp.read()
                        resp.close()
                        del cj, opener
                        da = re.findall("Enter; width:70%;'>(.*)",r)
                        self.irc.send("PRIVMSG #%s :%s\r\n" % (chan, da[0])) # Note Possible overflow

                    if "!whoareyou" in self.data:
                        #bot info allows users on IRC to see which commands are currently working
                        self.irc.send("PRIVMSG #%s :I am %s, I was created By:%s \r\n" % (self.chan, self.nick,self.owner))
                        self.irc.send("PRIVMSG #%s :I was written in Python 27, and edited with IDLE\r\n" % self.chan)
                        self.irc.send("PRIVMSG #%s :The Classes used are socket, string, time, re, urllib2, cookielib\r\n" % self.chan)
                        self.irc.send("PRIVMSG #%s :As well as some functions from various other sources(supybot,twisted,xgoogle)\r\n" % self.chan)
                        self.irc.send("PRIVMSG #%s :type ^commands for a list of things I can do\r\n" % self.chan)
            except (socket.error, socket.timeout):
                    print "Sockets timed out."

bot = Pibot()
bot.iConnect()
bot.MainLoop()

Примечание: ошибок нет. Высоко ценится. Кроме того, я только учусь, так что не плачь меня. (

EDIT2: я исправил большинство проблем и теперь получаю сообщение об ошибке:

Traceback (most recent call last):
  File "L:\txtbot.py", line 119, in <module>
    bot.MainLoop()
  File "L:\txtbot.py", line 64, in MainLoop
    self.irc.send(( "PONG %s \r\n" ) % (self.recv.split() [ 1 ])) #Possible overflow problem
AttributeError: Pibot instance has no attribute 'recv'

Ответы [ 3 ]

1 голос
/ 24 января 2011

Кажется, вы никогда не передаете информацию о соединении в сокет:

                self.irc = socket.socket()

Я думаю, что это должно быть примерно так:

                self.irc = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
                self.irc.connect((self.server, self.port))
0 голосов
/ 24 января 2011

Вы нигде не звоните iStart. Если я правильно запомнил свой IRC, вам нужно отправить свой ник, прежде чем он отправит вам какие-либо данные.

0 голосов
/ 24 января 2011

В iConnect вы просто создаете сокет, а не подключаете его к серверу.Вам необходимо использовать socket.create_connection .Кроме того, объединение socket.error и socket.timeout не очень хорошая идея, так как это может ввести в заблуждение при отладке.Кроме того, вы должны напечатать ошибку, а не просто общее сообщение.Это поможет вам понять, что не так.

...