python - 小米推送使用

1. 小米文档及SDK下载

1.文档介绍
https://dev.mi.com/console/doc/detail?pId=863
sdk说明:
2.开发者需要登录开发者网站(申请AppID, AppKey, AppSecret)。
3.访问开发者网站下载SDK。
地址:http://admin.xmpush.xiaomi.com/zh_CN/mipush/downpage
4. 创建应用
http://admin.xmpush.xiaomi.com/zh_CN/app/nav

2.业务场景

小程序端在访问app端分享的商品后,app接收消息,某用户访问了某商品

3. 推送demo在实际项目中应用

3.1 判断设备表消息,调对应的(ios,android)方法

from django.conf import settings as project_settings
# 引入sdk
# -----------------------------
from xmpush.base.APIConstants import *
from xmpush import APISender
from xmpush.base.APIMessage import *
#------------------------------

from common.core.http.response import JSONResponse
from push.models import PushDevice
from account.models import OAuthUser
from push import settings
import copy

class PushService(object):
    @staticmethod
    def push_to_user(user_id, message):
        u"""
        推送消息给指定的用户的设备
        :param user_id: app端用户id
        :param message: 要推送给app端的消息
        :return:
        """

        record = PushDevice.objects.filter(user_id=user_id, app_name=settings.AppNameEnum.QQC).order_by('-modify_time').first()
        if not record:
            error = copy.deepcopy(qqc.ERROR["NOT_EXIST_ERR"])
            error["msg"] = u"用户设备信息不存在"
            return JSONResponse(error=error)

        os_type = record.os_type
        # 别名推送
        alias_id = u'QQC_%s' % user_id
        ret = None
        # 如果设备是ios
        if os_type == settings.DeviceOSEnum.iOS:
            ret = push_to_ios_user(alias_id, message)
        
        # 如果是Android
        elif os_type == settings.DeviceOSEnum.Android:
            ret = push_to_android_user(alias_id, message)

        return ret

3.2 不同系统对应的推送demo

# android 系统
def push_to_android_user(alias_id, msg):
    """
    :param alias_id:
    :type alias_id str
    :param msg:
    :type msg AppPushMessage
    :return:
    """

    # android 不支持测试环境
    Constants.use_official()

    message = PushMessage() \
        # 创建应用时的包名
        .restricted_package_name("") \
        .title(msg[0]).description(msg[1]) \
        .pass_through(0).payload('')
        
    # 通过extra中数据,app端扩展额外的判断
    message.extra(msg[2])
    
    # android key and secret
    sender = APISender("")

    recv = sender.send_to_alias(message.message_dict(), alias_id)
    return recv


# ios系统
def push_to_ios_user(alias_id, msg):
    """
    :param alias_id:
    :type alias_id str
    :param msg:
    :type msg AppPushMessage
    :return:
    """
    
    #  环境判断
    if project_settings.QQC_PUSH_MODE == 'production':
        Constants.use_official()
    else:
        Constants.use_sandbox()
    message = PushMessage() \
        .description(msg[1]) \
        
        # 创建应用时的bundle_id
        .restricted_package_name("") \
        .badge(1)
        
    # 通过extra中数据,app端扩展额外的判断
    message.extra(msg[2])
    
    # ios key and secret
    sender = APISender("")
    return sender.send_to_alias(message.message_dict_ios(), alias_id)
 
demo地址(里面有详细说明):   
https://dev.mi.com/console/doc/detail?pId=1788

3.3 拼接要推送的消息

# 访问商品时推送的消息
def goods_visit_message(user_id,name):
    """
    :param user_id: 用户id
    :param name: 商品名
    :return: title, description
    """
    user = OAuthUser.objects.filter(user_id=user_id).first()
    user_name = user.nickname
    title = u'您有一条新消息~'
    description = u'【%s】刚刚浏览了您的商品【%s】~' % (user_name, name)
    
    # 自己可定义type的用途
    type = {"type": 2}
    return title, description, type

3.4 在项目的其他接口中调用推送方法

PushService.push_to_user(app_user_id, goods_visit_message(wx_user_id,goods_name))

打印对象返回:
{'info': u'Received push messages for 1 ALIAS',
 'code': 0, 
 'description': u'\u6210\u529f', 
 'trace_id': u'Xdm03290562213241158in', 
 'result': u'ok', 
 'data': {'id': u'adm03290562213241161sM'}}
 
 如上格式,消息已推送到小米服务器,app端设置后即可接收

  • 更多推送姿势,有待在更多的业务场景中解锁!!!
posted @ 2019-07-22 23:19  朝朝哥  阅读(913)  评论(0编辑  收藏  举报