Vinnaren i pepparkakshustävlingen!
2009-10-16, 21:10
  #1
Medlem
Bitmasters avatar
Jag försöker svänga ihop en enkel liten IRC-bot i Python. Servern jag tänker ansluta till stöder endast SSL. Problemet jag har med min kod just nu är att jag aldrig verkar få PING från servern, men ändå timeoutar min bot efter 5 minuter. All data jag får från servern skriver jag ut på skärmen av debug-skäl, och PINGet kommer inte ens upp där. Jag har kollat att servern faktiskt skickar PING genom att "telnetta" med openssl till servern och rad för rad simulera min bot. Vad kan vara fel?

Kod:
import socket

host = 'graphite' # Servern är en dator i det lokala nätverket
port = 6697
nick = 'vonKarma'
ident = nick
realname = 'Bitmaster von Karma'
owner = 'bitmaster'
channel = '#test'
readbuffer = ''

bs = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
bs.connect((host, port))
s = socket.ssl(bs)
s.write('NICK ' + nick + '\n')
s.write('USER ' + ident + ' ' + host + ' bla :' + realname + '\n')
def parsemsg(msg):
	complete=msg[1:].split(':',1)
	info=complete[0].split(' ')
	msgpart=complete[1]
	sender=info[0].split('!')
	if line.find('vonKarma')!=-1:
		s.write('PRIVMSG ' + sender[0] + ' :You highlighted me. I\'m just a bot under construction, never mind me.\n')

while 1:

	line=s.read(500)
	print line
	line=line.rstrip()
	linesplit=line.split()
	if(linesplit[0]=='PING'):
		s.write('PONG '+linesplit[1]+'\n')
		print 'PING? PONG!'
	if line.find('of message of the day')!=-1:
		s.write('JOIN ' + channel + '\n')
	if line.find('PRIVMSG')!=-1:
		print "Parse!"
		parsemsg(line)

Tilläggas bör att resten av koden fungerar helt problemfritt, dvs den privvar folk som highlightar den. Jag är mer eller mindre nybörjare i Python (fulhackade ihop en spiderbot för ngn tid sedan), så det är säkert ett riktigt simpelt och pinsamt fel.
Citera
2009-10-17, 09:01
  #2
Medlem
SSHs avatar
Du läser in upp till 500 bytes, delar vid mellanslag, men använder inte allt som lästs in. Vid nästa varv av loopen skrivs den olästa datan över. Det är inte heller säkert att den nya datan som läses in börjar exakt där du vill d.v.s exakt på en PING.

Jag rekommenderar att du använder twisted för att skriva din IRC-bot. När man skriver i ett högnivåspråk som Python brukar man undvika att bry sig om detaljer på låg nivå.

Ett exempel på en IRC-bot som svarar när man skriver till den. Ping-pongandet är redan implementerat och är inget man behöver bry sig om.

Kod:
from twisted.words.protocols import irc
from twisted
.internet import reactorprotocol

class Bot(irc.IRCClient):
    
nickname 'vonKarma'
    
channel '#test'

    
def signedOn(self):
        
self.join(channel)

    
def privmsg(selfuserchannelmessage):
        
nick user.split('!')[0]
        
self.msg(nick"You highlighted me.")
        
self.msg(nick"I'm just a bot under construction, never mind me.")

factory protocol.ReconnectingClientFactory()
factory.protocol Bot
reactor
.connectTCP('graphite'6697factory)
reactor.run() 
Citera
2009-10-25, 02:33
  #3
Medlem
Bitmasters avatar
Nu har jag följt ditt råd och byggt en IRC-bot baserad på Twisted. Den fungerar underbart. Men. Ping-pongandet hanteras fortfarande inte! Den timeoutar precis som förut...
Citera
2009-10-25, 02:20
  #4
Medlem
SSHs avatar
Är du säker på att det är avasknandet av ping-pongandet som gör att anslutningen bryts?

ping-pongandet finns implementerat. Följande är standardimplementeringen i IRCClient
Kod:
def irc_PING(selfprefixparams):
        
"""
        Called when some has pinged us.
        """
        
self.sendLine("PONG %s" params[-1]) 

Jag har själv provat att köra boten jag skrev och den svarar på PING som den ska. Detta syntes också när jag tittade med wireshark. Prova att titta på trafiken med något paketlyssnande program. När du gör detta vill du troligen tillfälligt avstå från att använda SSL(som jag antar används p.g.a portnumret).
Citera
2009-10-25, 05:16
  #5
Medlem
Bitmasters avatar
Jag använde TrafficLoggingFactory i Twisted, och behövde således inte stänga av SSL för att se trafiken. Det verkar som om jag inte ens mottar ett ping från servern över huvud taget.
Citera
2009-10-27, 23:00
  #6
Medlem
jastors avatar
Även fast den bara har en anstluning ändå köra select så den inte stannar upp förrns den läst från socketen, så man kan köra timers etc. så att den kan fortsätta göra saker även fast ircservern inte skickar något till den (tex delayed autoop/voice, trivia etc.). Om inte annat så blir det ju ett grundläggande stöd för att göra en ircbot som är uppkopplad mot flera nät samtidigt.

Behövs iofs inte om du bara ska göra en passiv bot som bara väntar på instruktioner. Mer en tanke.

http://ilab.cs.byu.edu/python/select/echoserver.html har du ett exempel på hur select används.

http://docs.python.org/library/ssl.html om att köra SSL över sockets.

Jag är ingen expert på python, men jag har inga problem att förstå exemplen eller hur man skulle kombinera bägge.

Glöm bara inte bort att slänga in en liten paus i while loopen om du kör select, annars kommer den att dra en hel del cpu.



Nu vet jag inte hur mycket du kan om IRC protokollet, men jag slänger med rfc1459 för säkerhetsskull:
http://www.ietf.org/rfc/rfc1459.txt
Citera
2010-01-09, 20:57
  #7
Medlem
Rizados avatar
Jag hittar inte irc i twisted.protocols. Den finns inte i trunken heller. http://twistedmatrix.com/trac/browse...sted/protocols
Vart har irc tagit vägen?

EDIT: Äh, jag såg nu att den ligger i twisted.words.protocol
__________________
Senast redigerad av Rizado 2010-01-09 kl. 21:08.
Citera
2010-01-09, 21:03
  #8
Medlem
SSHs avatar
Citat:
Ursprungligen postat av Rizado
Jag hittar inte irc i twisted.protocols. Den finns inte i trunken heller. http://twistedmatrix.com/trac/browse...sted/protocols
Vart har irc tagit vägen?

För mig finns irc i twisted.words.protocols. Samma gäller i trunken
http://twistedmatrix.com/trac/browse...ords/protocols
Citera
2010-01-09, 21:09
  #9
Medlem
Rizados avatar
Citat:
Ursprungligen postat av SSH
För mig finns irc i twisted.words.protocols. Samma gäller i trunken
http://twistedmatrix.com/trac/browse...ords/protocols
Japp, det var jag som tydligen missat att importera lite paket. Den ligger allt där den ska
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback