简体   繁体   English

python上的简单XMPP机器人

[英]Simple XMPP bot on python

I have the simple code of XMPP bot by python and http://xmpppy.sourceforge.net/ 我有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)

Please, tell me, how to translate this code to use http://wokkel.ik.nu/ and twistedmatrix.com/ Thanks a lot. 请告诉我,如何翻译此代码以使用http://wokkel.ik.nu/和twistedmatrix.com/非常感谢。

The following code should do it. 下面的代码应该做到这一点。 A few notes: 一些注意事项:

  • Wokkel uses so-called subprotocol handlers to cover support for specific subprotocols, usually split up by conceptual feature, by namespace or per XEP. Wokkel使用所谓的子协议处理程序来覆盖对特定子协议的支持,这些子协议通常按概念特征,按名称空间或按XEP拆分。
  • XMPPClient is a so-called stream manager that establishes connections, and takes care of authentication with the server. XMPPClient是所谓的流管理器,它建立连接并负责与服务器的身份验证。 It works with the hooked-up subprotocol handlers to process traffic with the XML stream it manages. 它与连接的子协议处理程序一起使用,以处理其管理的XML流的流量。 It automatically reconnects if the connection has been lost. 如果连接丢失,它将自动重新连接。
  • This example defines one new handler to process incoming messages. 本示例定义了一个新的处理程序来处理传入的消息。
  • Unlike the original code, here the request to retrieve the IP address is done for each incoming message with ip in the body. 与原始代码不同,在这里,对于正文中带有ip每个传入消息,都完成了检索IP地址的请求。
  • In the original code, status was never called. 在原始代码中,从未调用status I now the use PresenceProtocol subprotocol handler to send out the presence each time a connection has been established and authentication has taken place. 现在,我使用PresenceProtocol协议处理程序在每次建立连接并进行身份验证时发出状态信息。

The example is a so-called Twisted Application, to be started using twistd , as mentioned in the docstring. 的例子是一个所谓的扭曲的应用,使用将要开始twistd如在文档字符串所提到的,。 This will daemonize the process and logs go to twisted.log . 这将守护进程,并且日志进入twisted.log If you specify -n (before -y ), it will not detach and log to the console instead. 如果指定-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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM