diff options
Diffstat (limited to 'python/3.2')
| -rw-r--r-- | python/3.2/Pubnub.py | 345 | ||||
| -rwxr-xr-x | python/3.2/history-example.py | 12 | ||||
| -rwxr-xr-x | python/3.2/publish-example.py | 14 | ||||
| -rwxr-xr-x | python/3.2/subscribe-example.py | 64 | ||||
| -rwxr-xr-x | python/3.2/unit-test.py | 77 | 
5 files changed, 512 insertions, 0 deletions
diff --git a/python/3.2/Pubnub.py b/python/3.2/Pubnub.py new file mode 100644 index 0000000..79086cf --- /dev/null +++ b/python/3.2/Pubnub.py @@ -0,0 +1,345 @@ +## www.pubnub.com - PubNub Real-time push service in the cloud.  +# coding=utf8 + +## PubNub Real-time Push APIs and Notifications Framework +## Copyright (c) 2010 Stephen Blum +## http://www.pubnub.com/ + +## ----------------------------------- +## PubNub 3.0 Real-time Push Cloud API +## ----------------------------------- + +try: import json +except ImportError: import simplejson as json + +import time +import hashlib +import urllib2 +import uuid + +class Pubnub(): +    def __init__( +        self, +        publish_key, +        subscribe_key, +        secret_key = False, +        ssl_on = False, +        origin = 'pubsub.pubnub.com', +        pres_uuid = None +    ) : +        """ +        #** +        #* Pubnub +        #* +        #* Init the Pubnub Client API +        #* +        #* @param string publish_key required key to send messages. +        #* @param string subscribe_key required key to receive messages. +        #* @param string secret_key optional key to sign messages. +        #* @param boolean ssl required for 2048 bit encrypted messages. +        #* @param string origin PUBNUB Server Origin. +        #* @param string pres_uuid optional identifier for presence (auto-generated if not supplied) +        #** + +        ## Initiat Class +        pubnub = Pubnub( 'PUBLISH-KEY', 'SUBSCRIBE-KEY', 'SECRET-KEY', False ) + +        """ +        self.origin        = origin +        self.limit         = 1800 +        self.publish_key   = publish_key +        self.subscribe_key = subscribe_key +        self.secret_key    = secret_key +        self.ssl           = ssl_on + +        if self.ssl : +            self.origin = 'https://' + self.origin +        else : +            self.origin = 'http://'  + self.origin +         +        self.uuid = pres_uuid or str(uuid.uuid4()) +         +        if not isinstance(self.uuid, basestring): +            raise AttributeError("pres_uuid must be a string") + +    def publish( self, args ) : +        """ +        #** +        #* Publish +        #* +        #* Send a message to a channel. +        #* +        #* @param array args with channel and message. +        #* @return array success information. +        #** + +        ## Publish Example +        info = pubnub.publish({ +            'channel' : 'hello_world', +            'message' : { +                'some_text' : 'Hello my World' +            } +        }) +        print(info) + +        """ +        ## Fail if bad input. +        if not (args['channel'] and args['message']) : +            return [ 0, 'Missing Channel or Message' ] + +        ## Capture User Input +        channel = str(args['channel']) +        message = json.dumps(args['message'], separators=(',',':')) + +        ## Sign Message +        if self.secret_key : +            signature = hashlib.md5('/'.join([ +                self.publish_key, +                self.subscribe_key, +                self.secret_key, +                channel, +                message +            ])).hexdigest() +        else : +            signature = '0' + +        ## Send Message +        return self._request([ +            'publish', +            self.publish_key, +            self.subscribe_key, +            signature, +            channel, +            '0', +            message +        ]) + + +    def subscribe( self, args ) : +        """ +        #** +        #* Subscribe +        #* +        #* This is BLOCKING. +        #* Listen for a message on a channel. +        #* +        #* @param array args with channel and callback. +        #* @return false on fail, array on success. +        #** + +        ## Subscribe Example +        def receive(message) : +            print(message) +            return True + +        pubnub.subscribe({ +            'channel'  : 'hello_world', +            'callback' : receive  +        }) + +        """ + +        ## Fail if missing channel +        if not 'channel' in args : +            raise Exception('Missing Channel.') +            return False + +        ## Fail if missing callback +        if not 'callback' in args : +            raise Exception('Missing Callback.') +            return False + +        ## Capture User Input +        channel   = str(args['channel']) +        callback  = args['callback'] +        subscribe_key = args.get('subscribe_key') or self.subscribe_key + +        ## Begin Subscribe +        while True : + +            timetoken = 'timetoken' in args and args['timetoken'] or 0 +            try : +                ## Wait for Message +                response = self._request(self._encode([ +                    'subscribe', +                    subscribe_key, +                    channel, +                    '0', +                    str(timetoken) +                ])+['?uuid='+self.uuid], encode=False) + +                messages          = response[0] +                args['timetoken'] = response[1] + +                ## If it was a timeout +                if not len(messages) : +                    continue + +                ## Run user Callback and Reconnect if user permits. +                for message in messages : +                    if not callback(message) : +                        return + +            except Exception: +                time.sleep(1) + +        return True +     +    def presence( self, args ) : +        """ +        #** +        #* presence +        #* +        #* This is BLOCKING. +        #* Listen for presence events on a channel. +        #* +        #* @param array args with channel and callback. +        #* @return false on fail, array on success. +        #** + +        ## Presence Example +        def pres_event(message) : +            print(message) +            return True + +        pubnub.presence({ +            'channel'  : 'hello_world', +            'callback' : receive  +        }) +        """ + +        ## Fail if missing channel +        if not 'channel' in args : +            raise Exception('Missing Channel.') +            return False + +        ## Fail if missing callback +        if not 'callback' in args : +            raise Exception('Missing Callback.') +            return False + +        ## Capture User Input +        channel   = str(args['channel']) +        callback  = args['callback'] +        subscribe_key = args.get('subscribe_key') or self.subscribe_key +         +        return self.subscribe({'channel': channel+'-pnpres', 'subscribe_key':subscribe_key, 'callback': callback}) +     +     +    def here_now( self, args ) : +        """ +        #** +        #* Here Now +        #* +        #* Load current occupancy from a channel. +        #* +        #* @param array args with 'channel'. +        #* @return mixed false on fail, array on success. +        #* + +        ## Presence Example +        here_now = pubnub.here_now({ +            'channel' : 'hello_world', +        }) +        print(here_now['occupancy']) +        print(here_now['uuids']) + +        """ +        channel = str(args['channel']) +         +        ## Fail if bad input. +        if not channel : +            raise Exception('Missing Channel') +            return False +         +        ## Get Presence Here Now +        return self._request([ +            'v2','presence', +            'sub_key', self.subscribe_key, +            'channel', channel +        ]); +         +         +    def history( self, args ) : +        """ +        #** +        #* History +        #* +        #* Load history from a channel. +        #* +        #* @param array args with 'channel' and 'limit'. +        #* @return mixed false on fail, array on success. +        #* + +        ## History Example +        history = pubnub.history({ +            'channel' : 'hello_world', +            'limit'   : 1 +        }) +        print(history) + +        """ +        ## Capture User Input +        limit   = args.has_key('limit') and int(args['limit']) or 10 +        channel = str(args['channel']) + +        ## Fail if bad input. +        if not channel : +            raise Exception('Missing Channel') +            return False + +        ## Get History +        return self._request([ +            'history', +            self.subscribe_key, +            channel, +            '0', +            str(limit) +        ]); + + +    def time(self) : +        """ +        #** +        #* Time +        #* +        #* Timestamp from PubNub Cloud. +        #* +        #* @return int timestamp. +        #* + +        ## PubNub Server Time Example +        timestamp = pubnub.time() +        print(timestamp) + +        """ +        return self._request([ +            'time', +            '0' +        ])[0] + + +    def _encode( self, request ) : +        return [ +            "".join([ ' ~`!@#$%^&*()+=[]\\{}|;\':",./<>?'.find(ch) > -1 and +                hex(ord(ch)).replace( '0x', '%' ).upper() or +                ch for ch in list(bit) +            ]) for bit in request] + + +    def _request( self, request, origin = None, encode = True ) : +        ## Build URL +        url = (origin or self.origin) + '/' + "/".join( +            encode and self._encode(request) or request +        ) + +        ## Send Request Expecting JSONP Response +        try: +            try: usock = urllib2.urlopen( url, None, 200 ) +            except TypeError: usock = urllib2.urlopen( url, None ) +            response = usock.read() +            usock.close() +            return json.loads( response ) +        except: +            return None + diff --git a/python/3.2/history-example.py b/python/3.2/history-example.py new file mode 100755 index 0000000..cedf69e --- /dev/null +++ b/python/3.2/history-example.py @@ -0,0 +1,12 @@ +from Pubnub import Pubnub + +## Initiat Class +pubnub = Pubnub( 'demo', 'demo', None, False ) + +## History Example +history = pubnub.history({ +    'channel' : 'hello_world', +    'limit'   : 1 +}) +print(history) + diff --git a/python/3.2/publish-example.py b/python/3.2/publish-example.py new file mode 100755 index 0000000..725df0b --- /dev/null +++ b/python/3.2/publish-example.py @@ -0,0 +1,14 @@ +from Pubnub import Pubnub + +## Initiate Class +pubnub = Pubnub( 'demo', 'demo', None, False ) + +## Publish Example +info = pubnub.publish({ +    'channel' : 'hello_world', +    'message' : { +        'some_text' : 'Hello my World' +    } +}) +print(info) + diff --git a/python/3.2/subscribe-example.py b/python/3.2/subscribe-example.py new file mode 100755 index 0000000..e458e2b --- /dev/null +++ b/python/3.2/subscribe-example.py @@ -0,0 +1,64 @@ +import sys +import threading +import time +import random +import string +from Pubnub import Pubnub + +## Initiate Class +pubnub = Pubnub( 'demo', 'demo', None, False ) + +print("My UUID is: "+pubnub.uuid) + +channel = ''.join(random.choice(string.ascii_letters + string.digits) for x in range(20)) + +## Subscribe Example +def receive(message) : +    print(message) +    return False + +def pres_event(message): +    print(message) +    return False + +def subscribe(): +    print("Listening for messages on '%s' channel..." % channel) +    pubnub.subscribe({ +        'channel'  : channel, +        'callback' : receive  +    }) + +def presence(): +    print("Listening for presence events on '%s' channel..." % channel) +    pubnub.presence({ +        'channel'  : channel, +        'callback' : pres_event  +    }) + +def publish(): +    print("Publishing a test message on '%s' channel..." % channel) +    pubnub.publish({ +        'channel'  : channel, +        'message'  : { 'text':'foo bar' } +    }) + +pres_thread = threading.Thread(target=presence) +pres_thread.daemon=True +pres_thread.start() + +sub_thread = threading.Thread(target=subscribe) +sub_thread.daemon=True +sub_thread.start() + +time.sleep(3) + +publish() + + +print("waiting for subscribes and presence") +pres_thread.join() + +print pubnub.here_now({'channel':channel}) + +sub_thread.join() + diff --git a/python/3.2/unit-test.py b/python/3.2/unit-test.py new file mode 100755 index 0000000..88391a0 --- /dev/null +++ b/python/3.2/unit-test.py @@ -0,0 +1,77 @@ +## www.pubnub.com - PubNub Real-time push service in the cloud.  +# coding=utf8 + +## PubNub Real-time Push APIs and Notifications Framework +## Copyright (c) 2010 Stephen Blum +## http://www.pubnub.com/ + +## ----------------------------------- +## PubNub 3.0 Real-time Push Cloud API +## ----------------------------------- + +from Pubnub import Pubnub +import sys + +publish_key   = len(sys.argv) > 1 and sys.argv[1] or 'demo' +subscribe_key = len(sys.argv) > 2 and sys.argv[2] or 'demo' +secret_key    = len(sys.argv) > 3 and sys.argv[3] or None +ssl_on        = len(sys.argv) > 4 and bool(sys.argv[4]) or False + + +## ----------------------------------------------------------------------- +## Initiat Class +## ----------------------------------------------------------------------- + +pubnub = Pubnub( publish_key, subscribe_key, secret_key, ssl_on ) +crazy  = ' ~`!@#$%^&*(顶顅Ȓ)+=[]\\{}|;\':",./<>?abcd' + +## --------------------------------------------------------------------------- +## Unit Test Function +## --------------------------------------------------------------------------- +def test( trial, name ) : +    if trial : +        print( 'PASS: ' + name ) +    else : +        print( 'FAIL: ' + name ) + +## ----------------------------------------------------------------------- +## Publish Example +## ----------------------------------------------------------------------- +pubish_success = pubnub.publish({ +    'channel' : crazy, +    'message' : crazy +}) +test( pubish_success[0] == 1, 'Publish First Message Success' ) + +## ----------------------------------------------------------------------- +## History Example +## ----------------------------------------------------------------------- +history = pubnub.history({ +    'channel' : crazy, +    'limit'   : 1 +}) +test( +    history[0].encode('utf-8') == crazy, +    'History Message: ' + history[0] +) +test( len(history) == 1, 'History Message Count' ) + +## ----------------------------------------------------------------------- +## PubNub Server Time Example +## ----------------------------------------------------------------------- +timestamp = pubnub.time() +test( timestamp > 0, 'PubNub Server Time: ' + str(timestamp) ) + +## ----------------------------------------------------------------------- +## Subscribe Example +## ----------------------------------------------------------------------- +def receive(message) : +    print(message) +    return True + +pubnub.subscribe({ +    'channel'  : crazy, +    'callback' : receive  +}) + +  | 
