Get rid of third party library for APNS sending #170
This commit is contained in:
parent
a3b7e8f82a
commit
af771f1355
1 changed files with 57 additions and 16 deletions
|
|
@ -1,6 +1,5 @@
|
||||||
from threading import Thread
|
|
||||||
from daemonize import Daemonize
|
from daemonize import Daemonize
|
||||||
from apns import APNs, Payload
|
#from apns import APNs, Payload
|
||||||
import redis
|
import redis
|
||||||
import time
|
import time
|
||||||
import signal
|
import signal
|
||||||
|
|
@ -9,6 +8,10 @@ import os
|
||||||
import logging
|
import logging
|
||||||
import socket
|
import socket
|
||||||
|
|
||||||
|
import ssl
|
||||||
|
import struct
|
||||||
|
import binascii
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def sigint_handler(signal, frame):
|
def sigint_handler(signal, frame):
|
||||||
|
|
@ -18,13 +21,14 @@ def sigint_handler(signal, frame):
|
||||||
def redisLoop(apns, logger):
|
def redisLoop(apns, logger):
|
||||||
r = redis.StrictRedis(host='localhost', port=6379, db=0)
|
r = redis.StrictRedis(host='localhost', port=6379, db=0)
|
||||||
while 1:
|
while 1:
|
||||||
|
#logger.info("Checking queue for messages to send...")
|
||||||
time.sleep(0)
|
time.sleep(0)
|
||||||
data = r.brpop("apns_push", 10)
|
data = r.brpop("apns_push", 10)
|
||||||
if data:
|
if data:
|
||||||
info = data[1].split('|')
|
info = data[1].split('|')
|
||||||
logger.info("Token: " + info[0] + " message: " + info[1])
|
logger.info("Token: " + info[0] + " message: " + info[1])
|
||||||
try:
|
try:
|
||||||
send_notif(apns, info[0], info[1])
|
apns.sendNotification(info[0], info[1])
|
||||||
except TypeError:
|
except TypeError:
|
||||||
logger.info("Invalid token: " + info[0])
|
logger.info("Invalid token: " + info[0])
|
||||||
|
|
||||||
|
|
@ -32,14 +36,6 @@ def redisLoop(apns, logger):
|
||||||
def sigint_handler(signal, frame):
|
def sigint_handler(signal, frame):
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
|
|
||||||
def send_notif(apns, token_hex, message):
|
|
||||||
#token_hex = '602E96BF9BC15D7913871D4D90FEBD7E265500C9D22DCEC5A4AFA3FC36EBE4DC'
|
|
||||||
payload = Payload(alert=message, sound="default", badge=1)
|
|
||||||
try:
|
|
||||||
apns.gateway_server.send_notification(token_hex, payload)
|
|
||||||
except socket.error:
|
|
||||||
apns = setup_apns()
|
|
||||||
|
|
||||||
def get_logger():
|
def get_logger():
|
||||||
logger = logging.getLogger("apns_logger")
|
logger = logging.getLogger("apns_logger")
|
||||||
logger.setLevel(logging.INFO)
|
logger.setLevel(logging.INFO)
|
||||||
|
|
@ -52,17 +48,62 @@ def get_logger():
|
||||||
logger.addHandler(fh)
|
logger.addHandler(fh)
|
||||||
return logger
|
return logger
|
||||||
|
|
||||||
def setup_apns():
|
class APNSClient():
|
||||||
cert_file = "/root/ios_push_test/ios_prod.pem"
|
def __init__(self, host, port, cert_file, logger):
|
||||||
apns = APNs(use_sandbox=True, cert_file=cert_file)
|
self.host = host
|
||||||
return apns
|
self.port = port
|
||||||
|
self.cert_file = cert_file
|
||||||
|
self.logger = logger
|
||||||
|
self.is_connected = False
|
||||||
|
|
||||||
|
def setupConnection(self):
|
||||||
|
# socket
|
||||||
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
wsock = ssl.wrap_socket(sock, ssl_version=ssl.PROTOCOL_TLSv1, certfile=self.cert_file)
|
||||||
|
wsock.connect((self.host, self.port))
|
||||||
|
|
||||||
|
self.is_connected = True
|
||||||
|
self.conn = wsock
|
||||||
|
|
||||||
|
return wsock
|
||||||
|
|
||||||
|
def connect(self):
|
||||||
|
if not self.is_connected:
|
||||||
|
self.setupConnection()
|
||||||
|
|
||||||
|
def sendNotification(self, token, message):
|
||||||
|
# connect
|
||||||
|
self.connect()
|
||||||
|
|
||||||
|
# apns packet
|
||||||
|
payload = '{"aps": {"alert" : "%s", "sound": "bingbong.aiff"}}' % message
|
||||||
|
bin_token = binascii.unhexlify(token)
|
||||||
|
fmt = "!cH32sH%ds" % len(payload)
|
||||||
|
cmd = '\x00'
|
||||||
|
packet = struct.pack(fmt, cmd, len(bin_token), bin_token, len(payload), payload)
|
||||||
|
|
||||||
|
# send packet
|
||||||
|
self.conn.send(packet)
|
||||||
|
|
||||||
|
# TODO: figure out how to make this connection persistent
|
||||||
|
self.conn.close()
|
||||||
|
self.is_connected = False
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
logger = get_logger()
|
logger = get_logger()
|
||||||
logger.info("Starting apns_sender")
|
logger.info("Starting apns_sender")
|
||||||
|
|
||||||
#apns = APNs(use_sandbox=False, cert_file=cert_file)
|
#apns = APNs(use_sandbox=False, cert_file=cert_file)
|
||||||
apns = setup_apns()
|
#apns = setup_apns()
|
||||||
|
|
||||||
|
# TODO: load from config file
|
||||||
|
cert_file = "/root/ios_push_test/ios_prod.pem"
|
||||||
|
host = 'gateway.push.apple.com'
|
||||||
|
port = 2195
|
||||||
|
apns = APNSClient(host, port, cert_file, logger)
|
||||||
|
|
||||||
logger.info("Starting redis loop")
|
logger.info("Starting redis loop")
|
||||||
redisLoop(apns, logger)
|
redisLoop(apns, logger)
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue