-
-
Save vietkute02/9680901 to your computer and use it in GitHub Desktop.
#!/usr/bin/python | |
import sys, json, xmpp, random, string | |
SERVER = 'gcm.googleapis.com' | |
PORT = 5235 | |
USERNAME = "Your GCM Sender Id" | |
PASSWORD = "API Key" | |
REGISTRATION_ID = "Registration Id of the target device" | |
unacked_messages_quota = 1000 | |
send_queue = [] | |
# Return a random alphanumerical id | |
def random_id(): | |
rid = '' | |
for x in range(8): rid += random.choice(string.ascii_letters + string.digits) | |
return rid | |
def message_callback(session, message): | |
global unacked_messages_quota | |
gcm = message.getTags('gcm') | |
if gcm: | |
gcm_json = gcm[0].getData() | |
msg = json.loads(gcm_json) | |
if not msg.has_key('message_type'): | |
# Acknowledge the incoming message immediately. | |
send({'to': msg['from'], | |
'message_type': 'ack', | |
'message_id': msg['message_id']}) | |
# Queue a response back to the server. | |
if msg.has_key('from'): | |
# Send a dummy echo response back to the app that sent the upstream message. | |
send_queue.append({'to': msg['from'], | |
'message_id': random_id(), | |
'data': {'pong': 1}}) | |
elif msg['message_type'] == 'ack' or msg['message_type'] == 'nack': | |
unacked_messages_quota += 1 | |
def send(json_dict): | |
template = ("<message><gcm xmlns='google:mobile:data'>{1}</gcm></message>") | |
client.send(xmpp.protocol.Message( | |
node=template.format(client.Bind.bound[0], json.dumps(json_dict)))) | |
def flush_queued_messages(): | |
global unacked_messages_quota | |
while len(send_queue) and unacked_messages_quota > 0: | |
send(send_queue.pop(0)) | |
unacked_messages_quota -= 1 | |
client = xmpp.Client('gcm.googleapis.com', debug=['socket']) | |
client.connect(server=(SERVER,PORT), secure=1, use_srv=False) | |
auth = client.auth(USERNAME, PASSWORD) | |
if not auth: | |
print 'Authentication failed!' | |
sys.exit(1) | |
client.RegisterHandler('message', message_callback) | |
send_queue.append({'to': REGISTRATION_ID, | |
'message_id': 'reg_id', | |
'data': {'message_destination': 'RegId', | |
'message_id': random_id()}}) | |
while True: | |
client.Process(1) | |
flush_queued_messages() |
Getting error after setting the projectId and API key
(ENV) D:\Workspace\python\xmpppy>python run.py
Invalid debugflag given: socket
DEBUG:
DEBUG: Debug created for D:\Workspace\python\xmpppy\ENV\lib\site-packages\xmpp\client.py
DEBUG: flags defined: socket
DEBUG: socket start Plugging <xmpp.transports.TCPsocket instance at 0x000000000263DF48> into <xmpp.client.Client instance at 0x000000000263DDC8>
DEBUG: socket error Failed to connect to remote host ('gcm.googleapis.com', 5235): A connection attempt failed because the connected party did not properly respond after a pe
riod of time, or established connection failed because connected host has failed to respond (10060)
Traceback (most recent call last):
File "D:\Workspace\python\xmpppy\ENV\lib\site-packages\xmpp\transports.py", line 133, in connect
self._sock.connect((server[0], int(server[1])))
File "d:\program files\python27\Lib\socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
error: [Errno 10060] A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected hos
t has failed to respond
DEBUG: socket stop Plugging <xmpp.transports.TCPsocket instance at 0x000000000263DF48> out of <xmpp.client.Client instance at 0x000000000263DDC8>.
Traceback (most recent call last):
File "run.py", line 52, in
auth = client.auth(USERNAME, PASSWORD)
File "D:\Workspace\python\xmpppy\ENV\lib\site-packages\xmpp\client.py", line 214, in auth
while not self.Dispatcher.Stream._document_attrs and self.Process(1): pass
AttributeError: Client instance has no attribute 'Dispatcher'
How send a message to user segments, for example com.androidapplication.name?