如何在 slimxmpp python 中为 gcm ccs 请求创建 xmpp 节?

Posted

技术标签:

【中文标题】如何在 slimxmpp python 中为 gcm ccs 请求创建 xmpp 节?【英文标题】:How to create xmpp stanza for gcm ccs request in sleekxmpp python? 【发布时间】:2014-08-12 07:51:32 【问题描述】:

我正在使用 slimpp python 与我使用 GCM / CCS 的 android 客户端进行通信。主要问题是数据是json格式,需要在gcm标签内。我怎样才能实现它?

这是我的代码:

#!/usr/bin/python
import sys
import logging
import getpass
from optparse import OptionParser
import sleekxmpp
import json

from sleekxmpp import Iq
from sleekxmpp.xmlstream import ElementBase, register_stanza_plugin
REGISTRATION_ID = "APA91bF61NHoXfH4gHojuejpodfghdfvbnazqsrfsgdvfdodxdufcokojnogfvr4ijUbsTWzc-u9lsE2XkkNyQ"

class AA(ElementBase):
    name = 'gcm'
    namespace = 'google:mobile:data'
    plugin_attrib = 'aa'
    interfaces = set(['to', 'message_id', 'data'])
    sub_interfaces = interfaces

register_stanza_plugin(Iq, AA)
SERVER = 'gcm.googleapis.com'
PORT = 5235
USERNAME = "1013691256357"
PASSWORD = "AIAASDFSefeffefEFEFFeFfefefefEFEFfefefefFEffeFf7qeO1zB0Vt4"

if sys.version_info < (3, 0):
    reload(sys)
    sys.setdefaultencoding('utf8')
else:
    raw_input = input

class SendMsgBot(sleekxmpp.ClientXMPP):
    def __init__(self, jid, password):
        sleekxmpp.ClientXMPP.__init__(self, jid, password)
        self.add_event_handler("message", self.start)
    def start(self, event):
        print event
        self.send_presence()
        self.get_roster()
        self.disconnect(wait=True)

if __name__ == '__main__':
    # Setup logging.
    # logging.basicConfig(level=logging.DEBUG,                        format='%(levelname)-8s %(message)s')
    xmpp = SendMsgBot(USERNAME, PASSWORD)
    xmpp.register_plugin('xep_0030') # Service Discovery
    xmpp.register_plugin('xep_0199') # XMPP Ping

    if xmpp.connect(('gcm.googleapis.com', 5235), use_ssl=True):
      # while True:
      xmpp.process(block=True)
      to_send = 'to': REGISTRATION_ID,
                 'message_id': 'reg_id',
                 'data': 'ma_message': 'message for android',
                          'ma_title': "Reg title"
      xmpp.sendMessage("google", "<message><gcm xmlns='google:mobile:data'>"+json.dumps(to_send)+"</gcm></message>")

      print("Done")
    else:
        print("Unable to connect.")

需要的 xmpp 节是这个。

<message id="">
  <gcm xmlns="google:mobile:data">
  
      "to":"REGISTRATION_ID",  // "to" replaces "registration_ids"
      "message_id":"m-1366082849205" // new required field
      "data":
      
          "hello":"world",
      
      "time_to_live":"600",
      "delay_while_idle": true/false,
      "delivery_receipt_requested": true/false
  
  </gcm>
</message>

【问题讨论】:

你解决了吗?我认为是因为body标签。 不,我在 ubuntu 中使用了其他 xmpp 包。 sudo apt-get install python-xmpp 【参考方案1】:

您可以改用send_raw,并在data 字段中发送完整的GCM 消息节。当我这样做时,我不再看到 400 错误,而是收到一个正确的“BAD_REGISTRATION”。

【讨论】:

以上是关于如何在 slimxmpp python 中为 gcm ccs 请求创建 xmpp 节?的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 slimxmpp 连接 FCM CCS 服务器时出错

python slimxmpp ping错误

如何使用聊天客户端未接收到的 slimXMPP 发送一些数据?

slimxmpp 线程认证

slimxmpp 向所有具有相同用户名的资源发送消息

如何在python中为接口分配IP地址?