Простой бот XMPP на питоне - PullRequest
2 голосов
/ 10 мая 2011

У меня есть простой код бота XMPP от Python и http://xmpppy.sourceforge.net/

#!/usr/bin/python
# -*- coding: utf-8 -*-

import xmpp
import urllib2
import ConfigParser

config = ConfigParser.ConfigParser()
config.read('ipbot.conf')

##########################
user= (config.get('account', 'login'))
password=(config.get('account', 'password'))
presence=(config.get('presence','presence'))
##########################

jid=xmpp.protocol.JID(user)
client=xmpp.Client(jid.getDomain())
client.connect()
client.auth(jid.getNode(),password)

################Parse IP##################
strURL='http://api.wipmania.com/'
f = urllib2.urlopen(urllib2.Request(strURL))
response = f.read()
ipget= response.split("<br>")
f.close()
#############################################

def status(xstatus):
    status=xmpp.Presence(status=xstatus,show=presence,priority='1')
    client.send(msging)

def message(conn,mess):

  global client

  if ( mess.getBody() == "ip" ):
    client.send(xmpp.protocol.Message(mess.getFrom(),ipget[1]+" => "+ipget[0]))#Send IP

client.RegisterHandler('message',message)

client.sendInitPresence()

while True:
    client.Process(1)

Скажите, пожалуйста, как перевести этот код на использование http://wokkel.ik.nu/ и twistedmatrix.com/ Большое спасибо.

1 Ответ

5 голосов
/ 30 октября 2011

Следующий код должен сделать это.Несколько замечаний:

  • Wokkel использует так называемые подпротокольные обработчики для поддержки определенных подпротоколов, обычно разделенных по концептуальным признакам, по пространству имен или по XEP.так называемый диспетчер потоков, который устанавливает соединения и заботится об аутентификации на сервере.Он работает с подключенными обработчиками подпротоколов, чтобы обрабатывать трафик с потоком XML, которым он управляет.Он автоматически восстанавливает соединение, если соединение потеряно.
  • В этом примере определяется один новый обработчик для обработки входящих сообщений.
  • В отличие от исходного кода, здесь запрос на получение IP-адреса выполняется для каждоговходящее сообщение с ip в теле.
  • В исходном коде status никогда не вызывалось.Теперь я использую субпротокольный обработчик PresenceProtocol для отправки информации о присутствии каждый раз, когда устанавливается соединение и выполняется аутентификация.

Примером является так называемое Twisted Application, которое должно запускаться с использованием twistd, как указано в строке документации.Это демонизирует процесс и журналы перейдут на twisted.log.Если вы укажете -n (до -y), он не отсоединится и не войдет в консоль.

#!/usr/bin/python

"""
XMPP example client that replies with its IP address upon request.

Usage:

    twistd -y ipbot.tac
"""

import ConfigParser

from twisted.application import service
from twisted.python import log
from twisted.web.client import getPage
from twisted.words.protocols.jabber.jid import JID
from twisted.words.protocols.jabber.xmlstream import toResponse

from wokkel.client import XMPPClient
from wokkel.xmppim import PresenceProtocol, MessageProtocol

class IPHandler(MessageProtocol):
    """
    Message handler that sends presence and returns its IP upon request.

    @ivar presenceHandler: Presence subprotocol handler.
    @type presenceHandler: L{PresenceProtocol}

    @ivar show: Presence show value to send upon connecting.
    @type show: C{unicode} or C{NoneType}
    """

    def __init__(self, presenceHandler, show=None):
        self.presenceHandler = presenceHandler
        self.show = show


    def connectionInitialized(self):
        """
        Connection established and authenticated.

        Use the given presence handler to send presence.
        """
        MessageProtocol.connectionInitialized(self)
        self.presenceHandler.available(show=self.show, priority=1)


    def onMessage(self, message):
        """
        A message has been received.

        If the body of the incoming message equals C{"ip"}, retrieve our
        IP address and format the response message in the callback.
        """
        def onPage(page):
            address, location = page.split(u"<br>")
            body = u"%s => %s" % (location, address)
            response = toResponse(message, stanzaType=message['type'])
            response.addElement("body", content=body)
            self.send(response)

        if unicode(message.body) != u"ip":
            return

        d = getPage("http://api.wipmania.com")
        d.addCallback(onPage)
        d.addErrback(log.err)



# Read the configuration file
config = ConfigParser.ConfigParser()
config.read('ipbot.conf')

user =  config.get('account', 'login')
password = config.get('account', 'password')
presence = config.get('presence','presence')

# Set up a Twisted application.
application = service.Application('XMPP client')

# Set up an XMPP Client.
jid = JID(user)
client = XMPPClient(jid, password)
client.logTraffic = True
client.setServiceParent(application)

# Add a presence handler.
presenceHandler = PresenceProtocol()
presenceHandler.setHandlerParent(client)

# Add our custom handler
ipHandler = IPHandler(presenceHandler, presence)
ipHandler.setHandlerParent(client)
...