import os, sys import struct, binascii, ssl, datetime import threading import simplejson as json from socket import socket from OpenSSL import SSL class PushSender(threading.Thread): def __init__(self, sandbox, token, message, badge, sound): super(PushSender, self).__init__() self.token = token self.sandbox = sandbox self.message = message self.badge = badge self.sound = sound self.ctx = SSL.Context(SSL.SSLv3_METHOD) if sandbox: self.apnHost = "gateway.sandbox.push.apple.com" self.ctx.use_certificate_file(os.path.join(PROJECT_ROOT, "devcert.pem")) self.ctx.use_privatekey_file(os.path.join(PROJECT_ROOT, "devkey.pem")) else: self.apnHost = "gateway.push.apple.com" self.ctx.use_certificate_file(os.path.join(PROJECT_ROOT, "prodcert.pem")) self.ctx.use_privatekey_file(os.path.join(PROJECT_ROOT, "prodcert.pem")) def run(self): payload = {} aps = {} if (self.message): aps["alert"] = str(self.message) if (self.badge): aps["badge"] = self.badge if (self.sound): aps["sound"] = str(self.sound) payload["aps"] = aps token = binascii.unhexlify(self.token) payloadstr = json.dumps(payload, separators=(',',':')) payloadLen = len(payloadstr) fmt = "!cH32sH%ds" % payloadLen command = '\x00' msg = struct.pack(fmt, command, 32, token, payloadLen, payloadstr) sock = socket() s = SSL.Connection(self.ctx, sock) s.connect((self.apnHost, 2195)) s.send(msg) s.shutdown() s.close()