PushService.py 29 KB

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