使用Python XMPP的GCM通知

时间:2016-05-04 01:58:40

标签: android python google-cloud-messaging xmpp

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月发布)。的OpenSSL 1.0.1k-14.89.amzn1.x86_64。它也可以在其他发行版上看到。实际上,在将xmpppy作为依赖项的其他项目中可以看到几乎相同的堆栈跟踪。怎么解决这个问题?

1 个答案:

答案 0 :(得分:2)

第一个解决方案是修补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