首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解析Google的CCS xmpp响应的SleekXmpp定制节

解析Google的CCS xmpp响应的SleekXmpp定制节
EN

Stack Overflow用户
提问于 2015-05-25 17:13:25
回答 1查看 437关注 0票数 0

我正在尝试用python编写一个简单的XMPP推送通知第三方服务器,我使用的是SleekXMPP。

当我的应用程序发送上行消息时,我会收到如下消息

代码语言:javascript
运行
复制
<message id="3" type="error" to="123456789@gcm.googleapis.com/ABC">
  <gcm xmlns="google:mobile:data">
     { Json Arrays }
  </gcm>
  <error code="400" type="modify">
    <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
    <text xmlns="urn:ietf:params:xml:ns:xmpp-stanzas">
      InvalidJson: JSON_PARSING_ERROR : Missing Required Field: message_id\n
    </text>
  </error>
</message>

但是,阅读SleekXMPP的文档对理解我应该使用什么来获取此标记<gcm xmlns="google:mobile:data">的内容并将其更改为json以便进一步使用它没有多大帮助。

我所理解的是,我必须实现我的自定义节模板,但在我编写的内容中,它总是返回空:

代码语言:javascript
运行
复制
class GCMMessage(ElementBase):
    name = 'gcm'
    namespace = 'google:mobile:data'
    plugin_attrib = 'gcm'
    interfaces = {'to', 'message_id',
                  'data', 'time_to_live',
                  'delay_if_idle',
                  'delivery_receipt_requested'
                  }
    sub_interfaces = interfaces

结果是:

代码语言:javascript
运行
复制
GCMMessage(xml=msg.find('{google:mobile:data}gcm')).keys() 

返回

代码语言:javascript
运行
复制
['to', 'time_to_live', 'delay_if_idle', 'delivery_receipt_requested', 'data', 'message_id', u'lang']

而这些键的所有值都是"“。

代码语言:javascript
运行
复制
GCMMesage(xml=msg).get('to) = None

我甚至尝试使用以下命令来获取子元素:

代码语言:javascript
运行
复制
GCMMessage(xml=msg.xml.getchildren()[0])

但是话又说回来,keys()返回我的推送通知密钥,而get返回None。

**我应该如何使用定义我的自定义节,以及如何使用它们?没有命名空间,如何获取error stanza?**

任何帮助都是非常感谢的。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2015-06-05 19:39:17

如果您只想从gcm元素获取

  1. 对象,则不需要继承Message

子类

代码语言:javascript
运行
复制
json_data = msg.find('{google:mobile:data}gcm').text    

将返回所需的JSON,您可以直接使用它:

代码语言:javascript
运行
复制
import json 
jsonobject = json.loads(json_data)

  1. 在您的GCMMessage中,您已经定义了接口,但忘记了实现如何获取值。您至少需要为每个所需字段添加getXXX,如:

代码语言:javascript
运行
复制
# don't forget to read jsonobject in class initialization
def getData(self):  
    return jsonobject["data"]

然后它就会像预期的那样工作:

代码语言:javascript
运行
复制
GCMMessage(xml=msg.xml)["data"] # will return value from json data field
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30434841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档