2016-09-03 7 views
0

sleekxmpp와 ejabberd use로 muc scprit를 만들고 싶습니다. 어떻게해야합니까?sleekxmpp with ejabberd muc

내가 당겨지고 보관 ejabberd 패널에서 sleekxmpp http://sleekxmpp.com/getting_started/echobot.html 하지만, 연결된 사용자 수를 먹는 이해하기 위해이 튜토리얼을 시도

코드 0 이상 :

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


import sys 
import logging 
import getpass 
from optparse import OptionParser 

import sleekxmpp 

# Python versions before 3.0 do not use UTF-8 encoding 
# by default. To ensure that Unicode is handled properly 
# throughout SleekXMPP, we will set the default encoding 
# ourselves to UTF-8. 
if sys.version_info < (3, 0): 
    reload(sys) 
    sys.setdefaultencoding('utf8') 
else: 
    raw_input = input 


class EchoBot(sleekxmpp.ClientXMPP): 

    """ 
    A simple SleekXMPP bot that will echo messages it 
    receives, along with a short thank you message. 
    """ 

    def __init__(self, jid, password): 
     sleekxmpp.ClientXMPP.__init__(self, jid, password) 

     # The session_start event will be triggered when 
     # the bot establishes its connection with the server 
     # and the XML streams are ready for use. We want to 
     # listen for this event so that we we can initialize 
     # our roster. 
     self.add_event_handler("session_start", self.start) 

     # The message event is triggered whenever a message 
     # stanza is received. Be aware that that includes 
     # MUC messages and error messages. 
     self.add_event_handler("message", self.message) 

    def start(self, event): 
     """ 
     Process the session_start event. 

     Typical actions for the session_start event are 
     requesting the roster and broadcasting an initial 
     presence stanza. 

     Arguments: 
      event -- An empty dictionary. The session_start 
        event does not provide any additional 
        data. 
     """ 
     self.send_presence() 
     self.get_roster() 

    def message(self, msg): 
     """ 
     Process incoming message stanzas. Be aware that this also 
     includes MUC messages and error messages. It is usually 
     a good idea to check the messages's type before processing 
     or sending replies. 

     Arguments: 
      msg -- The received message stanza. See the documentation 
        for stanza objects and the Message stanza to see 
        how it may be used. 
     """ 
     if msg['type'] in ('chat', 'normal'): 
      msg.reply("Thanks for sending\n%(body)s" % msg).send() 


if __name__ == '__main__': 
    # Setup the command line arguments. 
    optp = OptionParser() 

    # Output verbosity options. 
    optp.add_option('-q', '--quiet', help='set logging to ERROR', 
        action='store_const', dest='loglevel', 
        const=logging.ERROR, default=logging.INFO) 
    optp.add_option('-d', '--debug', help='set logging to DEBUG', 
        action='store_const', dest='loglevel', 
        const=logging.DEBUG, default=logging.INFO) 
    optp.add_option('-v', '--verbose', help='set logging to COMM', 
        action='store_const', dest='loglevel', 
        const=5, default=logging.INFO) 

    # JID and password options. 
    optp.add_option("-j", "--jid", dest="jid", 
        help="JID to use") 
    optp.add_option("-p", "--password", dest="password", 
        help="password to use") 

    opts, args = optp.parse_args() 

    # Setup logging. 
    logging.basicConfig(level=opts.loglevel, 
         format='%(levelname)-8s %(message)s') 

    if opts.jid is None: 
     opts.jid = raw_input("Username: ") 
    if opts.password is None: 
     opts.password = getpass.getpass("Password: ") 

    # Setup the EchoBot and register plugins. Note that while plugins may 
    # have interdependencies, the order in which you register them does 
    # not matter. 
    xmpp = EchoBot(opts.jid, opts.password) 
    xmpp.register_plugin('xep_0030') # Service Discovery 
    xmpp.register_plugin('xep_0004') # Data Forms 
    xmpp.register_plugin('xep_0060') # PubSub 
    xmpp.register_plugin('xep_0199') # XMPP Ping 

    # If you are working with an OpenFire server, you may need 
    # to adjust the SSL version used: 
    # xmpp.ssl_version = ssl.PROTOCOL_SSLv3 

    # If you want to verify the SSL certificates offered by a server: 
    # xmpp.ca_certs = "path/to/ca/cert" 

    # Connect to the XMPP server and start processing XMPP stanzas. 
    if xmpp.connect(): 
     # If you do not have the dnspython library installed, you will need 
     # to manually specify the name of the server if it does not match 
     # the one in the JID. For example, to use Google Talk you would 
     # need to use: 
     # 
     # if xmpp.connect(('talk.google.com', 5222)): 
     #  ... 
     xmpp.process(block=True) 
     print("Done") 
    else: 
     print("Unable to connect.") 

콘솔 출력 :

DEBUG Loaded Plugin: RFC 6120: Stream Feature: STARTTLS 
DEBUG Loaded Plugin: RFC 6120: Stream Feature: Resource Binding 
DEBUG Loaded Plugin: RFC 3920: Stream Feature: Start Session 
DEBUG Loaded Plugin: RFC 6121: Stream Feature: Roster Versioning 
DEBUG Loaded Plugin: RFC 6121: Stream Feature: Subscription Pre-Approval 
DEBUG Loaded Plugin: RFC 6120: Stream Feature: SASL 
DEBUG Loaded Plugin: XEP-0030: Service Discovery 
DEBUG Loaded Plugin: XEP-0004: Data Forms 
DEBUG Loaded Plugin: XEP-0082: XMPP Date and Time Profiles 
DEBUG Loaded Plugin: XEP-0131: Stanza Headers and Internet Metadata 
DEBUG Loaded Plugin: XEP-0060: Publish-Subscribe 
DEBUG Loaded Plugin: XEP-0199: XMPP Ping 
DEBUG Connecting to 192.168.1.103:5222 
DEBUG Event triggered: connected 
DEBUG  ==== TRANSITION disconnected -> connected 
DEBUG Starting HANDLER THREAD 
DEBUG Loading event runner 
DEBUG SEND (IMMED): <stream:stream to='192.168.1.103' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' xml:lang='en' version='1.0'> 
DEBUG RECV: <stream:stream from="localhost" id="3423333123714766535" xml:lang="en"> 
WARNING Legacy XMPP 0.9 protocol detected. 
DEBUG Event triggered: legacy_protocol 
DEBUG RECV: <stream:error xmlns="http://etherx.jabber.org/streams"><host-unknown xmlns="urn:ietf:params:xml:ns:xmpp-streams" /></stream:error> 
DEBUG Event triggered: stream_error 
DEBUG End of stream recieved 
DEBUG reconnecting... 
DEBUG Event triggered: session_end 
DEBUG SEND (IMMED): </stream:stream> 
INFO  Waiting for </stream:stream> from server 
DEBUG Event triggered: socket_error 
DEBUG Event triggered: disconnected 
DEBUG  ==== TRANSITION connected -> disconnected 
DEBUG connecting... 
DEBUG Waiting 1.98786049338 seconds before connecting. 
+0

질문의 본문에 코드를 입력해야합니다. 튜토리얼 코드의 – Laurel

+0

에 –

답변

1

여기에 문제가 있습니다 :

DEBUG SEND (IMMED): <stream:stream to='192.168.1.103' xmlns:stream='http://etherx.jabber.org/streams' xmlns='jabber:client' xml:lang='en' version='1.0'> 
DEBUG RECV: <stream:stream from="localhost" id="3423333123714766535" xml:lang="en"> 
WARNING Legacy XMPP 0.9 protocol detected. 
DEBUG Event triggered: legacy_protocol 
DEBUG RECV: <stream:error xmlns="http://etherx.jabber.org/streams"><host-unknown xmlns="urn:ietf:params:xml:ns:xmpp-streams" /></stream:error> 
DEBUG Event triggered: stream_error 
DEBUG End of stream recieved 

클라이언트가 192.168.1.103으로 스트림을 열었지만 응답이 localhost에서 나온 것으로 표시되면 host-unknown 오류가 발생합니다. (나는 당신이 [email protected]으로 JID를 입력했다고 생각합니다.)

ejabberd가 호스트 이름 localhost을 사용하도록 구성되었습니다. 구성 파일에서 해당 파일을 192.168.1.103으로 변경하면 해당 "호스트 이름"을 사용하여 연결할 수 있습니다.

다른 방법으로, [email protected]로 JID를 입력하고 코드에서 주석 Google 토크에 대해 말씀을 수행하여, 다른 호스트를 사용하도록 강제로 연결할 수 :

if xmpp.connect(('192.168.1.103', 5222)): 

이 현재 작업 것 ejabberd 구성.

+1

이 추가되었습니다. :) 나는 ejabebrd.yml conf 파일과 hosts 파일을 바꾼다. 호스트 : - "localhost"를 - "xmpp.example.com" 관리자 : 사용자 : - "관리": "xmpp.example.com" - "관리": "로컬 호스트" –