【问题标题】:Simple XMPP bot on pythonpython上的简单XMPP机器人
【发布时间】:2011-08-22 10:50:03
【问题描述】:

我有python和http://xmpppy.sourceforge.net/的XMPP bot的简单代码

#!/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/ 非常感谢。

【问题讨论】:

  • 你试过了吗?你有没有卡在某个地方?是不是有什么特定的东西阻碍了你?

标签: python xmpp twisted bots


【解决方案1】:

下面的代码应该可以做到。几点说明:

  • Wokkel 使用所谓的子协议处理程序来支持特定的 子协议,通常按概念特征、命名空间或每个 XEP。
  • XMPPClient 是所谓的流管理器,建立连接, 并负责与服务器的身份验证。它与 连接子协议处理程序以使用 XML 流处理流量 管理。如果连接丢失,它会自动重新连接。
  • 此示例定义了一个新的处理程序来处理传入的消息。
  • 与原代码不同,这里获取IP地址的请求是 为正文中带有ip 的每条传入消息完成。
  • 在原始代码中,从未调用过status。我现在使用 PresenceProtocol 子协议处理程序每​​次都发送存在 已建立连接并进行了身份验证。

该示例是一个所谓的 Twisted 应用程序,使用 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-19
    • 2012-11-06
    • 2017-11-17
    • 1970-01-01
    • 2013-01-08
    • 2011-05-19
    • 2014-10-05
    相关资源
    最近更新 更多