def _send_message(self, message): real_message = simplejson.loads(message['data']) badge = real_message.get('badge', None) sound = real_message.get('sound', None) alert = real_message.get('alert', None) custom = real_message.get('custom', {}) if self.rds.sismember( '%s:%s' % (constants.INVALID_TOKENS, self.app_key), real_message['token']): # the token is invalid,do nothing return try: payload = Payload(sound=sound, badge=badge, alert=alert, custom=custom) except PayloadTooLargeError: # 在内存保留100条缩短后消息,避免批量发送时,每条都要缩短的损耗 if not alert: log.error('push meta data too long to trim, discard') payload = None if isinstance(alert, dict): log.error('payload too long to trim, discard') payload = None log.debug('try to trime large alert') payload = SafePayload(sound=sound, badge=badge, alert=alert, custom=custom) l_payload = len(payload.json()) l_alert = len(alert.encode('unicode_escape')) l_allow = 256 - (l_payload - l_alert) - 3 # 允许提示长度 ec_alert = alert.encode('unicode_escape') t_alert = re.sub(r'([^\\])\\(u|$)[0-9a-f]{0,3}$', r'\1', ec_alert[:l_allow]) alert = t_alert.decode('unicode_escape') + u'...' log.debug('payload is : %s' % alert) payload.alert = alert log.debug('how long dest it after trim %d' % len(payload.json())) payload = payload.as_payload() if not payload: return log.debug('will sent a meesage to token %s', real_message['token']) now = datetime.now() if (now - self.last_sent_time).seconds > 300: log.debug('idle for a long time , reconnect now.') self.reconnect() self.apns.gateway_server.send_notification(real_message['token'], payload) self.last_sent_time = datetime.now() self.rds.hincrby("counter", self.app_key)
def _send_message(self, message): real_message = simplejson.loads(message['data']) badge = real_message.get('badge', None) sound = real_message.get('sound', None) alert = real_message.get('alert', None) custom = real_message.get('custom', {}) if self.rds.sismember('%s:%s' % (constants.INVALID_TOKENS, self.app_key), real_message['token']): # the token is invalid,do nothing return self.rds.hincrby("counter", self.app_key) try: payload = Payload(sound=sound, badge=badge, alert=alert, custom=custom) except PayloadTooLargeError: # 在内存保留100条缩短后消息,避免批量发送时,每条都要缩短的损耗 if not alert: log.error('push meta data too long to trim, discard') payload = None if isinstance(alert, dict): log.error('payload too long to trim, discard') payload = None log.debug('try to trime large alert') payload = SafePayload(sound=sound, badge=badge, alert=alert, custom=custom) l_payload = len(payload.json()) l_alert = len(alert.encode('unicode_escape')) l_allow = 256 - (l_payload - l_alert) - 3 # 允许提示长度 ec_alert = alert.encode('unicode_escape') t_alert = re.sub(r'([^\\])\\(u|$)[0-9a-f]{0,3}$', r'\1', ec_alert[:l_allow]) alert = t_alert.decode('unicode_escape') + u'...' log.debug('payload is : %s' % alert) payload.alert = alert log.debug('how long dest it after trim %d' % len(payload.json())) payload = payload.as_payload() if not payload: return log.debug('will sent a meesage to token %s', real_message['token']) now = datetime.now() if (now - self.last_sent_time).seconds > 300: log.debug('idle for a long time , reconnect now.') self.reconnect() self.apns.gateway_server.send_notification(real_message['token'], payload) self.last_sent_time = datetime.now() self.rds.hincrby("counter", self.app_key)
def send_notification(apns_token, message, sender, channel, badge=1, network=None): apns = APNs(cert_file=os.path.join(DIRECTORY, 'public.pem'), key_file=os.path.join(DIRECTORY, 'private.pem')) query = None if sender and message: message = '<%s> %s' % (sender, message) query = sender if channel and message: message = '%s %s' % (channel, message) query = channel sound = None alert = None if message: sound = 'default' alert = '.' user_info = {} if query and network: user_info['n'] = network user_info['q'] = query payload = Payload(alert=alert, sound=sound, badge=badge, custom=user_info) if message: payload_length = len(payload.json()) if (payload_length + len(message) - 1) >= MAX_PAYLOAD_LENGTH: message = message[:(MAX_PAYLOAD_LENGTH - payload_length - 3)] + '...' payload.alert = message apns.gateway_server.send_notification(apns_token, payload) success = True for (token_hex, fail_time) in apns.feedback_server.items(): if apns_token == token_hex: success = False else: pass return success