2 # -*- coding: utf-8 -*-
7 from optparse
import OptionParser
10 from slixmpp
.xmlstream
import ET
, tostring
13 # Python versions before 3.0 do not use UTF-8 encoding
14 # by default. To ensure that Unicode is handled properly
15 # throughout Slixmpp, we will set the default encoding
17 if sys
.version_info
< (3, 0):
18 from slixmpp
.util
.misc_ops
import setdefaultencoding
19 setdefaultencoding('utf8')
24 class PubsubClient(slixmpp
.ClientXMPP
):
26 def __init__(self
, jid
, password
, server
,
27 node
=None, action
='list', data
=''):
28 super(PubsubClient
, self
).__init
__(jid
, password
)
30 self
.register_plugin('xep_0030')
31 self
.register_plugin('xep_0059')
32 self
.register_plugin('xep_0060')
34 self
.actions
= ['nodes', 'create', 'delete',
35 'publish', 'get', 'retract',
36 'purge', 'subscribe', 'unsubscribe']
41 self
.pubsub_server
= server
43 self
.add_event_handler('session_start', self
.start
, threaded
=True)
45 def start(self
, event
):
50 getattr(self
, self
.action
)()
52 logging
.error('Could not execute: %s' % self
.action
)
57 result
= self
['xep_0060'].get_nodes(self
.pubsub_server
, self
.node
)
58 for item
in result
['disco_items']['items']:
59 print(' - %s' % str(item
))
61 logging
.error('Could not retrieve node list.')
65 self
['xep_0060'].create_node(self
.pubsub_server
, self
.node
)
67 logging
.error('Could not create node: %s' % self
.node
)
71 self
['xep_0060'].delete_node(self
.pubsub_server
, self
.node
)
72 print('Deleted node: %s' % self
.node
)
74 logging
.error('Could not delete node: %s' % self
.node
)
77 payload
= ET
.fromstring("<test xmlns='test'>%s</test>" % self
.data
)
79 result
= self
['xep_0060'].publish(self
.pubsub_server
, self
.node
, payload
=payload
)
80 id = result
['pubsub']['publish']['item']['id']
81 print('Published at item id: %s' % id)
83 logging
.error('Could not publish to: %s' % self
.node
)
87 result
= self
['xep_0060'].get_item(self
.pubsub_server
, self
.node
, self
.data
)
88 for item
in result
['pubsub']['items']['substanzas']:
89 print('Retrieved item %s: %s' % (item
['id'], tostring(item
['payload'])))
91 logging
.error('Could not retrieve item %s from node %s' % (self
.data
, self
.node
))
95 result
= self
['xep_0060'].retract(self
.pubsub_server
, self
.node
, self
.data
)
96 print('Retracted item %s from node %s' % (self
.data
, self
.node
))
98 logging
.error('Could not retract item %s from node %s' % (self
.data
, self
.node
))
102 result
= self
['xep_0060'].purge(self
.pubsub_server
, self
.node
)
103 print('Purged all items from node %s' % self
.node
)
105 logging
.error('Could not purge items from node %s' % self
.node
)
109 result
= self
['xep_0060'].subscribe(self
.pubsub_server
, self
.node
)
110 print('Subscribed %s to node %s' % (self
.boundjid
.bare
, self
.node
))
112 logging
.error('Could not subscribe %s to node %s' % (self
.boundjid
.bare
, self
.node
))
114 def unsubscribe(self
):
116 result
= self
['xep_0060'].unsubscribe(self
.pubsub_server
, self
.node
)
117 print('Unsubscribed %s from node %s' % (self
.boundjid
.bare
, self
.node
))
119 logging
.error('Could not unsubscribe %s from node %s' % (self
.boundjid
.bare
, self
.node
))
124 if __name__
== '__main__':
125 # Setup the command line arguments.
126 optp
= OptionParser()
127 optp
.version
= '%%prog 0.1'
128 optp
.usage
= "Usage: %%prog [options] <jid> " + \
129 'nodes|create|delete|purge|subscribe|unsubscribe|publish|retract|get' + \
132 optp
.add_option('-q','--quiet', help='set logging to ERROR',
133 action
='store_const',
136 default
=logging
.ERROR
)
137 optp
.add_option('-d','--debug', help='set logging to DEBUG',
138 action
='store_const',
141 default
=logging
.ERROR
)
142 optp
.add_option('-v','--verbose', help='set logging to COMM',
143 action
='store_const',
146 default
=logging
.ERROR
)
148 # JID and password options.
149 optp
.add_option("-j", "--jid", dest
="jid",
151 optp
.add_option("-p", "--password", dest
="password",
152 help="password to use")
153 opts
,args
= optp
.parse_args()
156 logging
.basicConfig(level
=opts
.loglevel
,
157 format
='%(levelname)-8s %(message)s')
164 opts
.jid
= raw_input("Username: ")
165 if opts
.password
is None:
166 opts
.password
= getpass
.getpass("Password: ")
169 args
= (args
[0], args
[1], '', '', '')
171 args
= (args
[0], args
[1], args
[2], '', '')
173 args
= (args
[0], args
[1], args
[2], args
[3], '')
176 # Setup the Pubsub client
177 xmpp
= PubsubClient(opts
.jid
, opts
.password
,
183 # If you are working with an OpenFire server, you may need
184 # to adjust the SSL version used:
185 # xmpp.ssl_version = ssl.PROTOCOL_SSLv3
187 # If you want to verify the SSL certificates offered by a server:
188 # xmpp.ca_certs = "path/to/ca/cert"
190 # Connect to the XMPP server and start processing XMPP stanzas.
192 # If you do not have the dnspython library installed, you will need
193 # to manually specify the name of the server if it does not match
194 # the one in the JID. For example, to use Google Talk you would
197 # if xmpp.connect(('talk.google.com', 5222)):
199 xmpp
.process(block
=True)
201 print("Unable to connect.")