如何在sleekxmpp中为GCM CCS请求创建XMPP节?

1 投票
1 回答
698 浏览
提问于 2025-04-18 16:57

我正在使用 sleekmpp 这个 Python 库来和我的安卓客户端进行通信,使用的是 GCM / CCS。主要的问题是数据是以 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>

1 个回答

0

你可以使用 send_raw 这个方法,直接把完整的 GCM 消息内容放在 data 字段里。当我这样做的时候,就不再出现 400 错误了,而是收到了一个 "BAD_REGISTRATION" 的错误,这个是正确的。

撰写回答