HuaweiPushService.py 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import json
  2. from AnsjerPush.config import LOGGER
  3. from Service.HuaweiPushService import push_admin
  4. from Service.HuaweiPushService.push_admin import messaging
  5. class HuaweiPushObject:
  6. # 华为推送服务类
  7. def __init__(self):
  8. self.app_id = '101064781'
  9. self.app_secret = '29d5c5367208e35079f14779597b8f6bcc28ee39091546ed577862231fdd0fdd'
  10. self.init_app()
  11. def init_app(self):
  12. """init sdk app"""
  13. push_admin.initialize_app(self.app_id, self.app_secret)
  14. def send_push_notify_message(self, token_val, msg_title, msg_text, image_url=None, uid='', nickname='', n_time='',
  15. event_type='', channel='', app_bundle_id='', appBundleId=''):
  16. """
  17. 发送推送消息
  18. @param token_val: 手机推送token
  19. @param msg_title: 标题
  20. @param msg_text: 内容
  21. @param image_url: 图片链接
  22. @param uid: uid
  23. @param nickname: 设备昵称
  24. @param n_time: 当前时间
  25. @param event_type: 事件类型
  26. @param channel: 通道
  27. @param app_bundle_id: APP包id
  28. @param appBundleId: APP包id
  29. @return:
  30. """
  31. LOGGER.info(
  32. '华为推送参数: token_val:{}, msg_title:{}, msg_text:{}, image_url:{}, uid:{}, event_type:{}, n_time:{}'.format(
  33. token_val, msg_title, msg_text, image_url, uid, event_type, n_time))
  34. self.send_notify_message(msg_title, msg_text, image_url, uid, nickname, event_type, n_time, token_val)
  35. if int(event_type) == 606:
  36. self.send_data_message(uid, event_type, n_time, token_val)
  37. def send_notify_message(self, msg_title, msg_text, image_url, uid, nickname, event_type, n_time, token_val):
  38. """
  39. 发送通知推送
  40. @param msg_title:
  41. @param msg_text:
  42. @param image_url:
  43. @param uid:
  44. @param nickname:
  45. @param event_type:
  46. @param n_time:
  47. @param token_val:
  48. @return: None
  49. """
  50. try:
  51. LOGGER.info('{}进入发送通知推送函数'.format(uid))
  52. msg_title = '设备昵称: {}'.format(msg_title)
  53. notification = messaging.Notification(
  54. title=msg_title,
  55. body=msg_text,
  56. image=image_url
  57. )
  58. # 自定义键值对
  59. data = {'alert': 'Motion', 'msg': '', 'sound': 'sound.aif', 'zpush': '1', 'uid': uid,
  60. 'nickname': nickname, 'event_type': event_type, 'received_at': n_time, 'event_time': n_time
  61. }
  62. data = json.dumps(data)
  63. # 推送通知内容配置
  64. intent = 'intent://com.vivo.pushvideo/detail?#Intent;scheme=vpushscheme;launchFlags=0x10000000;S.uid={};S.event_type={};S.event_time={};end'.format(
  65. uid, event_type, n_time)
  66. android_notification = self.android_notification(msg_title, msg_text, intent)
  67. android_notification_attributes = dir(android_notification)
  68. for attr in android_notification_attributes:
  69. if not attr.startswith('__') and not attr.endswith('__'):
  70. try:
  71. value = getattr(android_notification, attr)
  72. LOGGER.info('android_notification_attributes {}: {}'.format(attr, value))
  73. except Exception as e:
  74. continue
  75. # 安卓配置
  76. android = messaging.AndroidConfig(
  77. data=data,
  78. collapse_key=-1,
  79. urgency=messaging.AndroidConfig.NORMAL_PRIORITY,
  80. ttl='10000s',
  81. bi_tag='the_sample_bi_tag_for_receipt_service',
  82. notification=android_notification,
  83. category='DEVICE_REMINDER'
  84. )
  85. android_attributes = dir(android)
  86. for attr in android_attributes:
  87. if not attr.startswith('__') and not attr.endswith('__'):
  88. try:
  89. value = getattr(android_attributes, attr)
  90. LOGGER.info('android_attributes {}: {}'.format(attr, value))
  91. except Exception as e:
  92. continue
  93. message = messaging.Message(
  94. notification=notification,
  95. android=android,
  96. token=[token_val]
  97. )
  98. message_attributes = dir(message)
  99. for attr in message_attributes:
  100. if not attr.startswith('__') and not attr.endswith('__'):
  101. try:
  102. value = getattr(message_attributes, attr)
  103. LOGGER.info('message_attributes {}: {}'.format(attr, value))
  104. except Exception as e:
  105. continue
  106. try:
  107. import certifi
  108. response = messaging.send_message(message, verify_peer=certifi.where())
  109. LOGGER.info('{}华为通知推送响应: {}'.format(uid, json.dumps(vars(response))))
  110. assert (response.code == '80000000')
  111. except Exception as e:
  112. LOGGER.info('华为通知推送异常: {}'.format(repr(e)))
  113. except Exception as e:
  114. LOGGER.info('华为通知推送异常,errLine:{}, errMsg:{}'.format(e.__traceback__.tb_lineno, repr(e)))
  115. @staticmethod
  116. def send_data_message(uid, event_type, n_time, token_val):
  117. """
  118. 发送透传推送
  119. @param uid:
  120. @param event_type:
  121. @param n_time:
  122. @param token_val:
  123. @return: None
  124. """
  125. LOGGER.info('{}进入发送透传推送函数'.format(uid))
  126. data = {'uid': uid, 'event_type': event_type, 'event_time': n_time}
  127. data = json.dumps(data)
  128. android = messaging.AndroidConfig(
  129. collapse_key=-1,
  130. urgency=messaging.AndroidConfig.HIGH_PRIORITY,
  131. ttl='10000s',
  132. bi_tag='the_sample_bi_tag_for_receipt_service'
  133. )
  134. message = messaging.Message(
  135. data=data,
  136. android=android,
  137. token=[token_val]
  138. )
  139. try:
  140. import certifi
  141. response = messaging.send_message(message, verify_peer=certifi.where())
  142. LOGGER.info('{}华为透传推送响应: {}'.format(uid, json.dumps(vars(response))))
  143. assert (response.code == '80000000')
  144. except Exception as e:
  145. LOGGER.info('华为透传推送异常: {}'.format(repr(e)))
  146. @staticmethod
  147. def android_notification(msg_title, msg_text, intent):
  148. return messaging.AndroidNotification(
  149. icon='/raw/ic_launcher2',
  150. color='#AACCDD',
  151. sound='/raw/shake',
  152. default_sound=True,
  153. click_action=messaging.AndroidClickAction(
  154. action_type=1,
  155. intent=intent
  156. ),
  157. body_loc_key='M.String.body',
  158. body_loc_args=('boy', 'dog'),
  159. title_loc_key='M.String.title',
  160. title_loc_args=['Girl', 'Cat'],
  161. channel_id='1',
  162. notify_summary='',
  163. multi_lang_key={'title_key': {'en': 'value1'}, 'body_key': {'en': 'value2'}},
  164. style=1,
  165. big_title=msg_title,
  166. big_body=msg_text,
  167. auto_clear=86400000,
  168. importance=messaging.AndroidNotification.PRIORITY_HIGH,
  169. light_settings=messaging.AndroidLightSettings(color=messaging.AndroidLightSettingsColor(
  170. alpha=0, red=0, green=1, blue=1), light_on_duration='3.5', light_off_duration='5S'),
  171. badge=messaging.AndroidBadgeNotification(
  172. add_num=1, clazz='Classic'),
  173. visibility=messaging.AndroidNotification.PUBLIC,
  174. foreground_show=False
  175. )