Python GCM无效JSON缺少有效负载

Python GCM无效JSON缺少有效负载,python,xmpp,google-cloud-messaging,Python,Xmpp,Google Cloud Messaging,我正在尝试使用Python sleekXMPP通过Google云消息传递发送消息。我试着在实验室里跟踪样品。然而,当我调用send_命令时,我得到了一个“InvalidJson:MissingPayload”错误响应(400)。我错过了什么?下面是我使用的代码 def random_id(): return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(8)) class Gcm

我正在尝试使用Python sleekXMPP通过Google云消息传递发送消息。我试着在实验室里跟踪样品。然而,当我调用
send_命令时,我得到了一个“InvalidJson:MissingPayload”错误响应(400)。我错过了什么?下面是我使用的代码

def random_id():
    return ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(8))

class GcmNotifier(sleekxmpp.ClientXMPP):

    def __init__(self, jid, password):
        super(GcmNotifier, self).__init__(jid, password)
        self.add_event_handler('message', self.on_message_received)

    def send_gcm_message(self, message):
        body = '<gcm xmlns:"google:mobile:data">%s</gcm>' % json.dumps(message)
        print(body)
        self.send_message(mto='', mbody=body)

    def on_message_received(self, message):
        print(message)

    def send_command(self, recipient):
        self.send_gcm_message({ 
            'to': recipient,
            'message_id': random_id(),
            'data':
            {
                'hello': 'world'
            }
        })

xmpp = GcmNotifier(GCM_SENDER_ID + '@gcm.googleapis.com', GCM_API_KEY)
if xmpp.connect((GCM_SERVER, GCM_PORT), use_ssl=True):
    xmpp.process(block=False)
def random_id():
返回“”。范围(8)内的u的联接(random.choice(string.ascii_大写+string.digits))
GcmNotifier类(sleekxmpp.ClientXMPP):
定义初始化(self、jid、密码):
超级(GcmNotifier,self)。\uuuuu初始化(jid,密码)
self.add\u事件\u处理程序('message',self.on\u message\u received)
def发送消息(自我,消息):
正文=“%s”%json.dumps(消息)
印刷品(正文)
self.send_消息(mto='',mbody=body)
def on_消息_已接收(自我,消息):
打印(信息)
def send_命令(自身、收件人):
self.send_gcm_消息({
“收件人”:收件人,
“消息\u id”:随机\u id(),
“数据”:
{
“你好”:“世界”
}
})
xmpp=GcmNotifier(GCM_发送者_ID+'@GCM.googleapis.com',GCM_API_KEY)
如果xmpp.connect((GCM_服务器,GCM_端口),请使用\u ssl=True):
xmpp.process(block=False)
这是我收到的错误:


gcm xmlns:“google:mobile:data”{“to”:“reded”,“data”:{“hello”:“world”},“message_id”:“ZGDZ9QTD”}/gcmInvalidJson:MissingPayload
您收到的关于
缺少有效负载的错误是因为您没有将任何参数作为键和值格式传递以识别为有效负载

首先,您必须定义一个函数,在该函数中传递有效负载,然后在GCm服务器响应后将其转换回纯文本

以下是一个例子:

def plaintext_request(self, registration_id, data=None, collapse_key=None,
                          delay_while_idle=False, time_to_live=None, retries=5, dry_run=False):
if not registration_id:
        raise GCMMissingRegistrationException("Missing registration_id")

    payload = self.construct_payload(
        registration_id, data, collapse_key,
        delay_while_idle, time_to_live, False, dry_run
    )
如果您的代码中需要在一段时间后ping服务器,那么可以使用指数退避机制


有关详细的代码实现,请阅读以下内容。

结果表明,SleekXMPP自动将我的消息包含在
标记中,这不是GCM服务器所期望的消息格式。我最终通过定义自己的诗节解决了这个问题,如下所示:

 class Gcm(ElementBase):
    namespace = 'google:mobile:data'
    name = 'gcm'
    plugin_attrib = 'gcm'
    interfaces = set('gcm')
    sub_interfaces = interfaces

class GcmMessage(ElementBase):
    namespace = ''
    name = 'message'
    interfaces = set('gcm')
    sub_interfaces = interfaces
    subitem = (Gcm,)

register_stanza_plugin(GcmMessage, Gcm)
def send_gcm_message(self, message):
    msg = GcmMessage()
    msg['gcm'].xml.text = xml.sax.saxutils.escape(json.dumps(message, ensure_ascii=False))
    self.send(msg)
然后通过如下方式发送消息:

 class Gcm(ElementBase):
    namespace = 'google:mobile:data'
    name = 'gcm'
    plugin_attrib = 'gcm'
    interfaces = set('gcm')
    sub_interfaces = interfaces

class GcmMessage(ElementBase):
    namespace = ''
    name = 'message'
    interfaces = set('gcm')
    sub_interfaces = interfaces
    subitem = (Gcm,)

register_stanza_plugin(GcmMessage, Gcm)
def send_gcm_message(self, message):
    msg = GcmMessage()
    msg['gcm'].xml.text = xml.sax.saxutils.escape(json.dumps(message, ensure_ascii=False))
    self.send(msg)

这不算有效负载:
{'to':收件人,'message_id':random_id(),'data':{'hello':'world'}
还是我的格式有问题?