使用 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应用程序发送到服务器