[Twisted-Python] twisted irc client + packet capturing

Edmund Wong ewong at pw-wspx.org
Fri Nov 8 01:50:37 MST 2013


Hi,

I've created a script that would log on to an irc server, while
capturing packets.

I came across the following link:

http://dound.com/2009/09/integrating-twisted-with-a-pcap-based-python-packet-sniffer/

But I'm using pycap (http://pycap.sourceforge.net/), but I'm having
some difficulties with getting it to work.

Here's the code:

# Copyright (c) Twisted Matrix Laboratories.
# See LICENSE for details.

# twisted imports
from twisted.words.protocols import irc
from twisted.internet import reactor, protocol
from twisted.python import log
from twisted.internet.defer import Deferred

# system imports
import time, sys

import pycap.capture

def run_pcap(f):
     p = pycap.capture.capture('eth0')
     p.filter('src host ! 192.168.1.100 and dst host ! 192.168.1.100 and 
dst port 25')
     packet = None
     print "Listening...\n"
     while 1:
        if packet:
           print "Received packet."
           reactor.callFromThread(f, packet)
        else:
           print "no packet\n"
        packet = p.next()

class LogBot(irc.IRCClient):
     """A logging IRC bot."""

     nickname = "testbot"

     def packetShow(self, packet):
         """ booga """
         msg = "Port 25 hit | From:[%s] To:[%s]" % (packet[1].source, 
packet[1].destination)
         self.msg(self.channel, msg)

     def connectionMade(self):
         irc.IRCClient.connectionMade(self)
         print "Setting up callInThread\n"
         reactor.callInThread(run_pcap, self.packetShow)
         print "Finished setting up callInThread\n"

     def connectionLost(self, reason):
         irc.IRCClient.connectionLost(self, reason)

     # callbacks for events

     def signedOn(self):
         """Called when bot has succesfully signed on to server."""
         print "Signing on to %s.\n" % self.factory.channel
         # self.join(self.factory.channel)
         self.sendLine("JOIN %s" % (self.factory.channel,))

     def joined(self, channel):
         """This will get called when the bot joins the channel."""
         print "Joining channel %s." % channel

     def privmsg(self, user, channel, msg):
         """This will get called when the bot receives a message."""
         user = user.split('!', 1)[0]

         # Check to see if they're sending me a private message
         if channel == self.nickname:
             msg = "It isn't nice to whisper!  Play nice with the group."
             self.msg(user, msg)
             return

         # Otherwise check to see if it is a message directed at me
         if msg.startswith(self.nickname + ":"):
             msg = "%s: I am a log bot" % user
             self.msg(channel, msg)

     def action(self, user, channel, msg):
         """This will get called when the bot sees someone do an action."""
         user = user.split('!', 1)[0]

     # irc callbacks

     def irc_NICK(self, prefix, params):
         """Called when an IRC user changes their nickname."""
         old_nick = prefix.split('!')[0]
         new_nick = params[0]


     # For fun, override the method that determines how a nickname is 
changed on
     # collisions. The default method appends an underscore.
     def alterCollidedNick(self, nickname):
         """
         Generate an altered version of a nickname that caused a 
collision in an
         effort to create an unused related name for subsequent 
registration.
         """
         return nickname + '^'

class LogBotFactory(protocol.ClientFactory):
     """A factory for LogBots.

     A new protocol instance will be created each time we connect to the 
server.
     """

     def __init__(self, channel):
         self.channel = channel

     def buildProtocol(self, addr):
         p = LogBot()
         p.factory = self
         return p

     def clientConnectionLost(self, connector, reason):
         """If we get disconnected, reconnect to server."""
         connector.connect()

     def clientConnectionFailed(self, connector, reason):
         print "connection failed:", reason
         reactor.stop()


if __name__ == '__main__':
     # create factory protocol and application
     f = LogBotFactory("#testx")

     # connect factory to this host and port
     reactor.connectTCP("192.168.1.170", 6667, f)

     # run bot
     reactor.run()

I was told that perhaps I could use twisted.pair,
but I have no idea how to use the module.  The
documentation is lacking and I've only just started
programming in Twisted.

Any help appreciated.

Edmund




More information about the Twisted-Python mailing list