使用 Python XMPP 的 GCM 通知

Posted

技术标签:

【中文标题】使用 Python XMPP 的 GCM 通知【英文标题】:GCM Notifications with Python XMPP 【发布时间】:2016-05-04 01:58:40 【问题描述】:

Google 提供了一个 python code sample,用于使用可扩展消息传递和状态协议 (XMPP) 发送 GCM 通知。该指南没有具体提及“import xmpp”的来源。然而,这与xmpppy 非常吻合。

不幸的是,这个 xmpppy 项目似乎在多年前就被放弃了。最后一个版本是在 2009 年。难怪与当前版本的 openssl 不兼容

Traceback (most recent call last):
  File "google_ccs.py", line 54, in <module>
    client.connect(server=(SERVER,PORT), secure=1, use_srv=False)
  File "/usr/local/virtualenv-django18/local/lib/python2.7/site-packages/xmpp/client.py", line 200, in connect
    if not CommonClient.connect(self,server,proxy,secure,use_srv) or secure<>None and not secure: return self.connected
  File "/usr/local/virtualenv-django18/local/lib/python2.7/site-packages/xmpp/client.py", line 178, in connect
    transports.TLS().PlugIn(self,now=1)
  File "/usr/local/virtualenv-django18/local/lib/python2.7/site-packages/xmpp/transports.py", line 281, in PlugIn
    if now: return self._startSSL()
  File "/usr/local/virtualenv-django18/local/lib/python2.7/site-packages/xmpp/transports.py", line 316, in _startSSL
    tcpsock._sslIssuer = tcpsock._sslObj.issuer()
AttributeError: '_ssl._SSLSocket' object has no attribute 'issuer'

此特定堆栈跟踪位于 Amazon Linux(2015 年 9 月版)上。打开sl-1.0.1k-14.89.amzn1.x86_64。它也可以在其他发行版上看到。实际上,在其他将 xmpppy 作为依赖项的项目中可以看到几乎相同的堆栈跟踪。怎么解决?

【问题讨论】:

请查看github.com/winster/xmppgcm 【参考方案1】:

第一个解决方案是给xmpp/transports.py打补丁,补丁来自free-bsd,但是在linux上可以工作。

第二种解决方案是切换到没有此问题的fork of xmpppy。您可以按如下方式安装。

source /myvirtualenv/bin/activate/
pip uninstall xmpppy
wget https://github.com/ArchipelProject/xmpppy/archive/master.zip
tar -xvf master
cd xmpppy-master

python setup.py build
python setup.py install

现在 SSL 错误消失了。您会很高兴知道您使用的是 2 年前而不是 7 年前最后一次更新的代码!此解决方案适用于任何将 xmpppy 作为依赖项的项目,并且不仅限于 GCM。

这两种解决方案都是在 Eventlet bug report 中发现的。

更新: 你甚至可以使用 pip 来安装 fork。

pip install https://github.com/ArchipelProject/xmpppy/archive/master.zip

【讨论】:

以上是关于使用 Python XMPP 的 GCM 通知的主要内容,如果未能解决你的问题,请参考以下文章

如何构建对 GCM 云连接服务器 (XMPP) 的通知密钥请求?

如何通过xmpp gcm将ack从android应用程序发送到服务器

配置 Openfire 服务器以支持 GCM 推送通知

通过 GCM 和 xmpp 输入状态/在线状态

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

在不使用 GCM 的情况下在 android 中推送通知