PushService.py 28 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629
  1. # -*- coding: utf-8 -*-
  2. """
  3. @Time : 2022/5/19 11:43
  4. @Auth : Locky
  5. @File :PushService.py
  6. @IDE :PyCharm
  7. """
  8. import hashlib
  9. import json
  10. import logging
  11. import os
  12. import time
  13. import apns2
  14. import firebase_admin
  15. import jpush
  16. import requests
  17. from firebase_admin import messaging
  18. from pyfcm import FCMNotification
  19. from AnsjerPush.config import APP_BUNDLE_DICT, APNS_MODE, BASE_DIR, APNS_CONFIG, FCM_CONFIG, JPUSH_CONFIG, XMPUSH_CONFIG \
  20. , VIVOPUSH_CONFIG, OPPOPUSH_CONFIG, MEIZUPUSH_CONFIG, CONFIG_INFO, HONORPUSH_CONFIG
  21. from Model.models import UidPushModel
  22. from Object.RedisObject import RedisObject
  23. from Object.S3Email import S3Email
  24. from Object.enums.EventTypeEnum import EventTypeEnumObj
  25. from Service.CommonService import CommonService
  26. from Service.VivoPushService.push_admin.APIMessage import PushMessage
  27. from Service.VivoPushService.push_admin.APISender import APISender
  28. from AnsjerPush.config import LOGGER
  29. class PushObject:
  30. # 推送对象
  31. @staticmethod
  32. def get_msg_title(nickname):
  33. """
  34. 获取推送消息标题
  35. @param nickname: 设备名
  36. @return: msg_title
  37. """
  38. return nickname
  39. @staticmethod
  40. def get_gateway_msg_text(n_time, tz, lang, alarm):
  41. """
  42. 获取网关推送消息内容
  43. @param n_time: 当前时间
  44. @param tz: 时区
  45. @param lang: 语言
  46. @param alarm: 警报
  47. @return: msg_text
  48. """
  49. n_date = CommonService.get_now_time_str(n_time=n_time, tz=tz, lang=lang)
  50. if lang == 'cn':
  51. msg_text = '{} 日期:{}'.format(alarm, n_date)
  52. else:
  53. msg_text = '{} date:{}'.format(alarm, n_date)
  54. return msg_text
  55. @staticmethod
  56. def get_ai_msg_text(channel, n_time, lang, tz, label):
  57. """
  58. 获取AI推送内容
  59. @param channel: 通道
  60. @param n_time: 当前时间
  61. @param lang: 语言
  62. @param tz: 时区
  63. @param label: 识别到的标签
  64. @return: ai_msg_text
  65. """
  66. n_date = CommonService.get_now_time_str(n_time=n_time, tz=tz, lang=lang)
  67. if lang == 'cn':
  68. msg = '摄像头AI识别到了{}'.format(label)
  69. ai_msg_text = '{msg} 通道:{channel} 日期:{date}'.format(msg=msg, channel=channel, date=n_date)
  70. else:
  71. msg = 'Camera AI recognizes {}'.format(label)
  72. ai_msg_text = '{msg} channel:{channel} date:{date}'.format(msg=msg, channel=channel, date=n_date)
  73. return ai_msg_text
  74. @staticmethod
  75. def get_low_power_msg_text(channel, n_time, lang, tz, electricity, is_sys=0):
  76. """
  77. 获取低电量推送内容
  78. @param channel: 通道
  79. @param n_time: 当前时间
  80. @param lang: 语言
  81. @param tz: 时区
  82. @param electricity: 电量
  83. @param is_sys: 是否为系统消息
  84. @return: low_power_msg_text
  85. """
  86. n_date = CommonService.get_now_time_str(n_time=n_time, tz=tz, lang=lang)
  87. if lang == 'cn':
  88. alarm = '剩余电量 ' + electricity
  89. if is_sys:
  90. low_power_msg_text = '{} 通道:{}'.format(alarm, channel)
  91. else:
  92. low_power_msg_text = '{} 通道:{} 日期:{}'.format(alarm, channel, n_date)
  93. else:
  94. alarm = 'Battery remaining ' + electricity
  95. if is_sys:
  96. low_power_msg_text = '{} channel:{}'.format(alarm, channel)
  97. else:
  98. low_power_msg_text = '{} channel:{} date:{}'.format(alarm, channel, n_date)
  99. return low_power_msg_text
  100. @staticmethod
  101. def ios_apns_push(nickname, app_bundle_id, token_val, n_time, event_type, msg_title, msg_text,
  102. uid='', channel='1', launch_image=None):
  103. """
  104. ios apns 推送
  105. @param nickname: 设备昵称
  106. @param app_bundle_id: app包id
  107. @param token_val: 推送token
  108. @param n_time: 当前时间
  109. @param event_type: 事件类型
  110. @param msg_title: 推送标题
  111. @param msg_text: 推送内容
  112. @param uid: uid
  113. @param channel: 通道
  114. @param launch_image: 推送图片链接
  115. @return: bool
  116. """
  117. pem_path = os.path.join(BASE_DIR, APNS_CONFIG[app_bundle_id]['pem_path'])
  118. LOGGER.info('IOS推送: app_bundle_id:{}, pem_path:{}'.format(app_bundle_id, pem_path))
  119. try:
  120. cli = apns2.APNSClient(mode=APNS_MODE, client_cert=pem_path)
  121. alert = apns2.PayloadAlert(title=msg_title, body=msg_text, launch_image=launch_image)
  122. push_data = {'alert': msg_text, 'msg': '', 'sound': '', 'zpush': '1', 'uid': uid, 'channel': channel,
  123. 'received_at': n_time, 'event_time': n_time, 'event_type': event_type, 'nickname': nickname,
  124. 'image_url': launch_image
  125. }
  126. sound = 'call_phone.mp3' if event_type in EventTypeEnumObj.DATA_PUSH_EVENT_TYPE_LIST.value else 'default'
  127. payload = apns2.Payload(alert=alert, custom=push_data, sound=sound, category='myCategory',
  128. mutable_content=True)
  129. n = apns2.Notification(payload=payload, priority=apns2.PRIORITY_LOW)
  130. res = cli.push(n=n, device_token=token_val, topic=app_bundle_id)
  131. LOGGER.info('IOS推送响应状态码{},token:{},uid:{},params:{}'
  132. .format(res.status_code, token_val, uid, json.dumps(push_data)))
  133. assert res.status_code == 200 or res.status_code == 410
  134. return True
  135. except Exception as e:
  136. LOGGER.info('IOS推送异常: {}, 证书路径: {}'.format(repr(e), pem_path))
  137. return False
  138. @staticmethod
  139. def android_fcm_push(nickname, app_bundle_id, token_val, n_time, event_type, msg_title, msg_text,
  140. uid='', channel='1', image=''):
  141. """
  142. android fcm 推送
  143. @param nickname: 设备昵称
  144. @param app_bundle_id: app包id
  145. @param token_val: 推送token
  146. @param n_time: 当前时间
  147. @param event_type: 事件类型
  148. @param msg_title: 推送标题
  149. @param msg_text: 推送内容
  150. @param uid: uid
  151. @param channel: 通道
  152. @param image: 推送图片链接
  153. @return: bool
  154. """
  155. try:
  156. serverKey = FCM_CONFIG[app_bundle_id]
  157. push_service = FCMNotification(api_key=serverKey)
  158. push_data = {'alert': msg_text, 'msg': '', 'sound': 'sound.aif', 'zpush': '1', 'image': image,
  159. 'received_at': n_time, 'event_time': n_time, 'event_type': event_type, 'nickname': nickname,
  160. 'uid': uid, 'channel': channel
  161. }
  162. if event_type in EventTypeEnumObj.DATA_PUSH_EVENT_TYPE_LIST.value:
  163. push_data['priority'] = 'high'
  164. push_data['content_available'] = True
  165. push_data['direct_boot_ok'] = True
  166. result = push_service.notify_single_device(registration_id=token_val, message_title=msg_title,
  167. message_body=msg_text, data_message=push_data,
  168. click_action='android.intent.action.VIEW',
  169. extra_kwargs={'default_sound': True,
  170. 'default_vibrate_timings': True,
  171. 'default_light_settings': True,
  172. },
  173. )
  174. LOGGER.info('fcm推送结果:{}'.format(result))
  175. return True
  176. except Exception as e:
  177. LOGGER.info('fcm推送异常:{}'.format(repr(e)))
  178. return False
  179. @staticmethod
  180. def android_fcm_push_v1(nickname, app_bundle_id, token_val, n_time, event_type, msg_title, msg_text,
  181. uid='', channel='1', image=''):
  182. """
  183. android fcm 推送
  184. @param nickname: 设备昵称
  185. @param app_bundle_id: app包id
  186. @param token_val: 推送token
  187. @param n_time: 当前时间
  188. @param event_type: 事件类型
  189. @param msg_title: 推送标题
  190. @param msg_text: 推送内容
  191. @param uid: uid
  192. @param channel: 通道
  193. @param image: 推送图片链接
  194. @return: bool
  195. """
  196. try:
  197. event_type = str(event_type)
  198. n_time = str(n_time)
  199. push_data = {'alert': msg_text, 'msg': '', 'sound': 'sound.aif', 'zpush': '1',
  200. 'received_at': n_time, 'event_time': n_time, 'event_type': event_type, 'nickname': nickname,
  201. 'uid': uid, 'channel': channel
  202. }
  203. if event_type in EventTypeEnumObj.DATA_PUSH_EVENT_TYPE_LIST.value:
  204. push_data['priority'] = 'high'
  205. push_data['content_available'] = True
  206. push_data['direct_boot_ok'] = True
  207. message = messaging.Message(
  208. notification=messaging.Notification(
  209. title=msg_title,
  210. body=msg_text,
  211. image=image
  212. ),
  213. data=push_data,
  214. token=token_val,
  215. )
  216. # Send a message to the device corresponding to the provided
  217. # registration token.
  218. result = messaging.send(message)
  219. LOGGER.info('fcm推送结果:{}'.format(result))
  220. return True
  221. except Exception as e:
  222. LOGGER.info('fcm推送异常:{}'.format(repr(e)))
  223. return False
  224. @staticmethod
  225. def android_jpush(nickname, app_bundle_id, token_val, n_time, event_type, msg_title, msg_text, channel=1):
  226. """
  227. android 极光 推送
  228. @param nickname: 设备昵称
  229. @param app_bundle_id: app包id
  230. @param token_val: 推送token
  231. @param n_time: 当前时间
  232. @param event_type: 事件类型
  233. @param msg_title: 推送标题
  234. @param msg_text: 推送内容
  235. @param channel: 设备通道
  236. @return: bool
  237. """
  238. try:
  239. app_key = JPUSH_CONFIG[app_bundle_id]['Key']
  240. master_secret = JPUSH_CONFIG[app_bundle_id]['Secret']
  241. # 换成各自的app_key和master_secret
  242. _jpush = jpush.JPush(app_key, master_secret)
  243. push = _jpush.create_push()
  244. push.audience = jpush.registration_id(token_val)
  245. if event_type in EventTypeEnumObj.DATA_PUSH_EVENT_TYPE_LIST.value:
  246. channel_id = '111934'
  247. else:
  248. channel_id = '1'
  249. push_data = {'alert': msg_text, 'msg': '', 'sound': 'sound.aif', 'zpush': '1', 'uid': nickname,
  250. 'received_at': n_time, 'event_time': n_time, 'event_type': event_type, 'nickname': nickname,
  251. 'channel': channel
  252. }
  253. android = jpush.android(title=msg_title, big_text=msg_text, alert=msg_text, extras=push_data,
  254. priority=1, style=1, alert_type=7, channel_id=channel_id
  255. )
  256. push.notification = jpush.notification(android=android)
  257. push.platform = jpush.all_
  258. res = push.send()
  259. assert res.status_code == 200
  260. return True
  261. except Exception as e:
  262. LOGGER.info('极光推送异常:{}'.format(repr(e)))
  263. return False
  264. @staticmethod
  265. def android_xmpush(channel_id, nickname, app_bundle_id, token_val, n_time, event_type, msg_title, msg_text,
  266. uid='', channel='1', image=''):
  267. """
  268. android 小米 推送
  269. @param channel_id: 通知通道
  270. @param nickname: 设备昵称
  271. @param app_bundle_id: app包id
  272. @param token_val: 推送token
  273. @param n_time: 当前时间
  274. @param event_type: 事件类型
  275. @param msg_title: 推送标题
  276. @param msg_text: 推送内容
  277. @param uid: uid
  278. @param channel: 通道
  279. @param image: 推送图片链接
  280. @return: bool
  281. """
  282. try:
  283. url = 'https://api.xmpush.xiaomi.com/v3/message/regid'
  284. app_secret = XMPUSH_CONFIG[app_bundle_id]
  285. data = {
  286. 'title': msg_title,
  287. 'description': msg_text,
  288. 'payload': 'payload',
  289. 'restricted_package_name': app_bundle_id,
  290. 'registration_id': token_val,
  291. 'extra.channel_id': channel_id,
  292. 'extra.alert': msg_text,
  293. 'extra.msg': '',
  294. 'extra.sound': 'sound.aif',
  295. 'extra.zpush': '1',
  296. 'extra.received_at': n_time,
  297. 'extra.event_time': n_time,
  298. 'extra.event_type': event_type,
  299. 'extra.nickname': nickname,
  300. 'extra.uid': uid,
  301. 'extra.channel': channel,
  302. }
  303. # if image:
  304. # data['extra.notification_style_type'] = 2
  305. # data['extra.notification_bigPic_uri'] = image
  306. headers = {
  307. 'Authorization': 'key={}'.format(app_secret)
  308. }
  309. response = requests.post(url, data=data, headers=headers)
  310. LOGGER.info("小米推送返回值:{}".format(response.json()))
  311. assert response.status_code == 200
  312. return True
  313. except Exception as e:
  314. LOGGER.info("小米推送异常:{}".format(repr(e)))
  315. return False
  316. @staticmethod
  317. def android_vivopush(token_val, n_time, event_type, msg_title, msg_text, app_bundle_id='', uid='', channel='1',
  318. image='', nickname='', appBundleId='', jg_token_val=''):
  319. """
  320. vivo 推送(不支持图片)
  321. @param app_bundle_id: app包名
  322. @param appBundleId: app包名
  323. @param token_val: 推送token
  324. @param jg_token_val: 极光推送token
  325. @param event_type: 事件类型
  326. @param msg_title: 推送标题
  327. @param msg_text: 推送内容
  328. @param n_time: 当前时间
  329. @param nickname: 设备昵称
  330. @param uid: uid
  331. @param image: 推送图片链接
  332. @param channel: 通道
  333. @return: bool
  334. """
  335. try:
  336. app_bundle_id = app_bundle_id if app_bundle_id != '' else appBundleId
  337. # 获取redis里面的authToken
  338. if msg_title == '':
  339. msg_title = APP_BUNDLE_DICT[app_bundle_id]
  340. app_id = VIVOPUSH_CONFIG[app_bundle_id]['ID']
  341. app_key = VIVOPUSH_CONFIG[app_bundle_id]['Key']
  342. app_secret = VIVOPUSH_CONFIG[app_bundle_id]['Secret']
  343. sender = APISender(app_secret)
  344. rec = sender.get_token(app_id, app_key)
  345. # 鉴权接口调用获得authToken
  346. sender_send = APISender(app_secret)
  347. sender_send.set_token(rec['authToken'])
  348. push_data = {'alert': msg_text, 'msg': '', 'sound': 'sound.aif', 'zpush': '1', 'image': image,
  349. 'received_at': n_time, 'event_time': n_time, 'event_type': event_type, 'nickname': nickname,
  350. 'uid': uid, 'channel': channel
  351. }
  352. # 获取唯一标识符
  353. uid_push_qs = UidPushModel.objects.filter(token_val=token_val).values('m_code')
  354. m_code = uid_push_qs[0]['m_code'] if uid_push_qs[0]['m_code'] else ''
  355. # 推送 push_mode: 推送模式 (0:正式推送;1:测试推送,默认为0)
  356. # 推送 event_type: 消息类型 (0:运营类消息,1:系统类消息。默认为 0)
  357. # 推送 skip_type: 跳转类型(1:打开 APP 首页 2:打开链接 3:自定义 4:打开 app 内指定页面)
  358. activity = 'vpushscheme://com.vivo.pushvideo/detail'
  359. message = PushMessage() \
  360. .reg_id(token_val) \
  361. .title(msg_title) \
  362. .content(msg_text) \
  363. .push_mode(0) \
  364. .notify_type(3) \
  365. .skip_type(4) \
  366. .skip_content(activity) \
  367. .request_id(m_code) \
  368. .classification(1) \
  369. .client_custom_map(**push_data) \
  370. .message_dict()
  371. rec = sender_send.send(message)
  372. LOGGER.info('vivo推送结果:{}, 设备uid:{}'.format(rec, uid))
  373. if rec['result'] == 0 and event_type in EventTypeEnumObj.DATA_PUSH_EVENT_TYPE_LIST.value:
  374. PushObject.jpush_transparent_transmission(msg_title, msg_text, app_bundle_id, jg_token_val, push_data)
  375. return True
  376. except Exception as e:
  377. LOGGER.error('vivo推送异常,uid:{},error_line:{},error_msg:{}'.
  378. format(uid, e.__traceback__.tb_lineno, repr(e)))
  379. return False
  380. @staticmethod
  381. def android_oppopush(channel_id, nickname, app_bundle_id, token_val, n_time, event_type, msg_title, msg_text,
  382. uid='', channel='1', image='', jg_token_val=''):
  383. """
  384. android oppo 推送
  385. @param channel_id: 通知通道id
  386. @param nickname: 设备昵称
  387. @param app_bundle_id: app包id
  388. @param token_val: 推送token
  389. @param jg_token_val: 推送token
  390. @param n_time: 当前时间
  391. @param event_type: 事件类型
  392. @param msg_title: 推送标题
  393. @param msg_text: 推送内容
  394. @param uid: uid
  395. @param channel: 通道
  396. @param image: 推送图片链接
  397. @return: bool
  398. """
  399. try:
  400. """
  401. android 国内oppo APP消息提醒推送
  402. """
  403. app_key = OPPOPUSH_CONFIG[app_bundle_id]['Key']
  404. master_secret = OPPOPUSH_CONFIG[app_bundle_id]['Secret']
  405. url = 'https://api.push.oppomobile.com/'
  406. now_time = str(round(time.time() * 1000))
  407. # 1、实例化一个sha256对象
  408. sha256 = hashlib.sha256()
  409. # 2、调用update方法进行加密
  410. sha256.update((app_key + now_time + master_secret).encode('utf-8'))
  411. # 3、调用hexdigest方法,获取加密结果
  412. sign = sha256.hexdigest()
  413. # 获取auth_token
  414. get_token_url = url + 'server/v1/auth'
  415. post_data = {
  416. 'app_key': app_key,
  417. 'sign': sign,
  418. 'timestamp': now_time
  419. }
  420. headers = {'Content-Type': 'application/x-www-form-urlencoded'}
  421. response = requests.post(get_token_url, data=post_data, headers=headers)
  422. result = response.json()
  423. # 发送推送
  424. push_url = url + 'server/v1/message/notification/unicast'
  425. extra_data = {'alert': msg_text, 'msg': '', 'sound': 'sound.aif', 'zpush': '1',
  426. 'received_at': n_time, 'event_time': n_time, 'event_type': event_type, 'nickname': nickname,
  427. 'uid': uid, 'channel': channel
  428. }
  429. message = {
  430. "target_type": 2,
  431. "target_value": token_val,
  432. "notification": {
  433. "title": msg_title,
  434. "content": msg_text,
  435. 'channel_id': channel_id,
  436. 'action_parameters': extra_data,
  437. 'click_action_type': 1,
  438. 'click_action_activity': 'com.ansjer.zccloud_a.AJ_MainView.AJ_Home.AJMainActivity'
  439. }
  440. }
  441. push_data = {
  442. 'auth_token': result['data']['auth_token'],
  443. 'message': json.dumps(message)
  444. }
  445. response = requests.post(push_url, data=push_data, headers=headers)
  446. LOGGER.info("oppo推送返回值:{}".format(response.json()))
  447. if response.status_code == 200 and event_type in EventTypeEnumObj.DATA_PUSH_EVENT_TYPE_LIST.value:
  448. PushObject.jpush_transparent_transmission(msg_title, msg_text, app_bundle_id, jg_token_val, extra_data)
  449. return True
  450. except Exception as e:
  451. LOGGER.info("oppo推送异常:{}".format(repr(e)))
  452. return False
  453. @staticmethod
  454. def android_meizupush(token_val, n_time, event_type, msg_title, msg_text, uid='', channel='1',
  455. app_bundle_id='', appBundleId='', nickname='', image=''):
  456. """
  457. android 魅族推送(不支持图片)
  458. @param app_bundle_id: app包名
  459. @param appBundleId: app包名
  460. @param token_val: 推送token
  461. @param event_type: 消息类型 (0:运营类消息,1:系统类消息。默认为 0)
  462. @param msg_title: 推送标题
  463. @param msg_text: 推送内容
  464. @param n_time: 当前时间
  465. @param nickname: 设备昵称
  466. @param uid: uid
  467. @param image: 推送图片链接
  468. @param channel: 通道
  469. @return: bool
  470. """
  471. try:
  472. # 获取包和AppSecret
  473. app_bundle_id = app_bundle_id if app_bundle_id != '' else appBundleId
  474. appId = MEIZUPUSH_CONFIG[app_bundle_id]['ID']
  475. appSecret = MEIZUPUSH_CONFIG[app_bundle_id]['AppSecret']
  476. url = 'https://server-api-push.meizu.com/garcia/api/server/push/varnished/pushByPushId'
  477. extra_data = {'alert': msg_text, 'msg': '', 'sound': 'sound.aif', 'zpush': '1',
  478. 'received_at': n_time, 'event_time': n_time, 'event_type': event_type, 'nickname': nickname,
  479. 'uid': uid, 'channel': channel
  480. }
  481. # 转换为json格式
  482. extra_data = json.dumps(extra_data)
  483. if msg_title == '':
  484. msg_title = APP_BUNDLE_DICT[app_bundle_id]
  485. # 拼接发送内容
  486. activity = "com.ansjer.zccloud_a.AJ_MainView.AJ_Home.AJMainActivity" # 应用页面地址
  487. # clickType点击动作, 0打开应用, 1打开应用页面, 2打开url页面, 3应用客户端自定义
  488. messageJson = '{"clickTypeInfo": {"activity": "%s",' \
  489. '"clickType": 1, "parameters": %s },"extra": {},' % (activity, extra_data)
  490. noticeBarInfo = ('"noticeBarInfo": {"title": "%s", "content": "%s"},' % (msg_title, msg_text))
  491. noticeExpandInfo = '"noticeExpandInfo": {"noticeExpandType": 0}, "pushTimeInfo": {"validTime": 24}}'
  492. messageJson += noticeBarInfo
  493. messageJson += noticeExpandInfo
  494. data_meizu = {
  495. 'appId': appId,
  496. 'pushIds': token_val,
  497. 'messageJson': messageJson
  498. }
  499. # 魅族MD5加密,生成密钥
  500. sign = CommonService.getMD5Sign(data=data_meizu, key=appSecret)
  501. data = {
  502. 'appId': appId,
  503. 'messageJson': messageJson,
  504. 'sign': sign,
  505. 'pushIds': token_val,
  506. }
  507. # 进行推送
  508. response = requests.post(url, data=data)
  509. LOGGER.info("魅族推送结果:{}".format(response.json()))
  510. return True
  511. except Exception as e:
  512. LOGGER.info("魅族推送异常:{}".format(repr(e)))
  513. return False
  514. @staticmethod
  515. def android_honorpush(token_val, n_time, event_type, msg_title, msg_text,
  516. uid='', channel='1', image='', app_bundle_id='', appBundleId='', channel_id='', nickname=''):
  517. """
  518. android honor 推送
  519. @param channel_id: 通知通道id
  520. @param nickname: 设备昵称
  521. @param app_bundle_id: app包id
  522. @param appBundleId: app包id
  523. @param token_val: 推送token
  524. @param n_time: 当前时间
  525. @param event_type: 事件类型
  526. @param msg_title: 推送标题
  527. @param msg_text: 推送内容
  528. @param uid: uid
  529. @param channel: 通道
  530. @param image: 推送图片链接
  531. @return: bool
  532. """
  533. app_bundle_id = appBundleId if appBundleId else app_bundle_id
  534. try:
  535. client_id = HONORPUSH_CONFIG[app_bundle_id]['client_id']
  536. client_secret = HONORPUSH_CONFIG[app_bundle_id]['client_secret']
  537. app_id = HONORPUSH_CONFIG[app_bundle_id]['app_id']
  538. get_access_token_url = 'https://iam.developer.hihonor.com/auth/token'
  539. post_data = {
  540. 'grant_type': 'client_credentials',
  541. 'client_id': client_id,
  542. 'client_secret': client_secret
  543. }
  544. headers = {'Content-Type': 'application/x-www-form-urlencoded'}
  545. access_token_response = requests.post(get_access_token_url, data=post_data, headers=headers)
  546. access_result = access_token_response.json()
  547. authorization_token = 'Bearer ' + access_result['access_token']
  548. # 发送推送
  549. push_url = 'https://push-api.cloud.hihonor.com/api/v1/{}/sendMessage'.format(app_id)
  550. headers = {'Content-Type': 'application/json', 'Authorization': authorization_token,
  551. 'timestamp': str(int(time.time()) * 1000)}
  552. extra_data = {'alert': msg_text, 'msg': '', 'sound': 'sound.aif', 'zpush': '1',
  553. 'received_at': n_time, 'event_time': n_time, 'event_type': str(event_type),
  554. 'nickname': nickname,
  555. 'uid': uid, 'channel': channel, 'title': msg_title, 'body': msg_text
  556. }
  557. # 通知推送
  558. push_data = {
  559. "android": {
  560. "notification": {
  561. "body": msg_text,
  562. "title": msg_title,
  563. "importance": "NORMAL",
  564. "clickAction": {
  565. "type": 3,
  566. }
  567. },
  568. "targetUserType": 0,
  569. "data": json.dumps(extra_data)
  570. },
  571. "token": [token_val]
  572. }
  573. response = requests.post(push_url, json=push_data, headers=headers)
  574. LOGGER.info("uid:{},时间:{},荣耀推送通知返回值:{}".format(uid, n_time, response.json()))
  575. # 一键通话透传推送
  576. if int(event_type) in EventTypeEnumObj.DATA_PUSH_EVENT_TYPE_LIST.value:
  577. push_data = {
  578. "data": json.dumps(extra_data),
  579. "token": [token_val]
  580. }
  581. response = requests.post(push_url, json=push_data, headers=headers)
  582. LOGGER.info("uid:{},时间:{},荣耀透传推送返回值:{}".format(uid, n_time, response.json()))
  583. return True
  584. except Exception as e:
  585. LOGGER.info("荣耀推送异常:error_line:{},error_msg:{}".format(e.__traceback__.tb_lineno, repr(e)))
  586. return False
  587. @staticmethod
  588. def jpush_transparent_transmission(msg_title, msg_text, app_bundle_id, token_val, extra_data):
  589. """
  590. android 极光透传
  591. @param msg_title: 推送标题
  592. @param msg_text: 推送内容
  593. @param token_val: 推送token
  594. @param app_bundle_id: app包id
  595. @param extra_data: 额外数据
  596. @return: None
  597. """
  598. try:
  599. app_key = JPUSH_CONFIG[app_bundle_id]['Key']
  600. master_secret = JPUSH_CONFIG[app_bundle_id]['Secret']
  601. # 换成各自的app_key和master_secret
  602. _jpush = jpush.JPush(app_key, master_secret)
  603. push = _jpush.create_push()
  604. push.audience = jpush.registration_id(token_val)
  605. push.message = jpush.message(msg_content=msg_text, title=msg_title, extras=extra_data)
  606. push.platform = jpush.all_
  607. res = push.send()
  608. LOGGER.info('极光透传,结果:{},参数:{}'.format(res, extra_data))
  609. except Exception as e:
  610. LOGGER.info('jpush_transparent_transmission极光透传异常:errLine:{}, errMsg:{}, 参数:{}'.format(
  611. e.__traceback__.tb_lineno, repr(e), extra_data))