LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 978|回复: 2

使用XMPPPY模块与Jabber服务器通信。

[复制链接]
发表于 2005-9-15 13:39:08 | 显示全部楼层 |阅读模式
转自肥肥世家论坛

Jabber服务器采用开发的XMPP协议,Google Talk也是采用XMPP协议的IM系统。在Python中有一个xmpppy模块支持该协议。也就是说,我们可以通过该模块与Jabber服务器通信,是不是很Cool。下面是一个简单的示例,可使大家对该模块有一个大概的了解。

#导入xmpppy模块
>>> import xmpp
#建立Client实例,debian是我的jabber服务器名,jabber服务器的安装可参考我的Debian学习笔记。
>>> c=xmpp.Client('debian',debug=[])
#连接
>>> c.connect()
'tcp'
#验证
>>> c.auth('yangjing','12345')
'old_auth'
#登入
>>> c.sendInitPresence()
#向ringkee@debian
>>> c.send(xmpp.protocol.Message('ringkee@debian ','test message from yangjing'))
'20'
#下面测试信息接收功能,如果没有信息,则pending_data()为空
>>>c.TCPsocket.pending_data()
[]
#如果有信息,则pending_data()不为空
>>> c.TCPsocket.pending_data()
[<socket._socketobject object at 0xb795beb4>]
#接收信息
>>> c.TCPsocket.receive()
"<message type='chat' to='yangjing@debian/xmpppy' from='ringkee@debian/Gaim'><x xmlns='jabber:x:event'><composing/></x><body>message from ringkee@debian</body><html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>message from <a HREF='mailto:ringkee@debian'>ringkee@debian</a></body></html></message>"
#登出
>>> c.disconnect()


现在我正在学习XMPPPY模块和XMPP协议,看可不可以在Zope中集成IM功能。
发表于 2005-9-15 14:37:45 | 显示全部楼层

  1. from socket import *
  2. import sys
  3. import os
  4. def prompt():
  5.         print """
  6.               only users with blank password can use it,because i
  7.               have not added the password validation yet.
  8.               chinese message seems invalid.
  9.              
  10.         """
  11. def TransferMsg(msg):
  12.         try:
  13.                 if msg[0] == '[' and msg[-1] == ']':
  14.                         temp_msg = msg[1:-1]
  15.                         pos = temp_msg.find('*')
  16.                         if pos >= 0:
  17.                                 stimes = temp_msg[pos + 1:]
  18.                                 ntimes = int(stimes)
  19.                                 return temp_msg[0 : pos] * ntimes
  20.         except:
  21.                 return msg
  22.                
  23. def SendMsg(msg,recv_buf=2048):
  24.         s.send(msg+'\r\n')
  25.         print 'SEND:',msg
  26.         #print 'RECV:',s.recv(recv_buf)
  27.        

  28. def ShowRecvMsg():
  29.         s.setblocking(0)
  30.         try:
  31.                 while(1):
  32.                         recv_msg = s.recv(1024)
  33.                         if recv_msg.strip() <> '':
  34.                                 print 'RECV:',         recv_msg
  35.         except:
  36.                 pass
  37.         s.setblocking(1)
  38.        

  39. def InitJabber(server,resource,user):
  40.         SendMsg('<stream:stream to="'+server+'" xmlns="jabber:client" xmlns:stream="http://etherx.jabber.org/streams">')
  41.         SendMsg('<iq type="get" id="JCOM_0"><query xmlns="jabber:iq:auth"><username>'+user+'</username></query></iq>')
  42.         SendMsg('<iq type="set" id="JCOM_1"><query xmlns="jabber:iq:auth"><username>'+user+'</username><digest/><resource>'+resource+'</resource></query></iq>')

  43. def JbSendTo(to_user,msg):
  44.         SendMsg('<message id="JCOM_4" to="'+to_user+'" type="unsavechat"><body>'+msg+'</body></message>')       
  45. if (__name__ == '__main__'):
  46.         try:
  47.                 if sys.platform == 'win32':
  48.                         os.system('cls')
  49.                 else:
  50.                         os.system('clear')
  51.                 prompt() # give some infomations.       
  52.                 svr_name = raw_input(r'enter server name(e.g. oraserver):')
  53.                 #svr_ip = raw_input(r'enter server ip(e.g. 192.0.0.2):')
  54.                 while(1):
  55.                         try:
  56.                                 svr_ports = raw_input(r'enter server port(5222):')
  57.                                 if svr_ports == '':
  58.                                         svr_ports = '5222'
  59.                                 svr_porti = int(svr_ports)
  60.                                 break
  61.                         except:
  62.                                 print 'please enter a valid number.'

  63.                 #print svr_porti
  64.                 res = raw_input(r'enter resource name(e.g. EIM_Work):')
  65.                 usr_name = raw_input(r'enter user name(you logon name):')
  66.                 s = socket()
  67.                 s.connect((svr_name,svr_porti))
  68.                 print 'connected...\r\n'
  69.         except Exception,e:
  70.                 print 'connect error :' ,e
  71.         else:
  72.                 try:
  73.                         InitJabber(svr_name,res,usr_name)       
  74.                         ShowRecvMsg()
  75.                         print 'init jabber finished...'
  76.                         print 'ready...'
  77.                        
  78.                         while(1):
  79.                                 sendto = raw_input(r'recv user(e.g. fjg@nsoa blank to exit):')
  80.                                 if sendto == '':
  81.                                         break
  82.                                 while(1):
  83.                                         sendmsg = raw_input(r'msg to send:')
  84.                                         sendmsg = TransferMsg(sendmsg)
  85.                                         if sendmsg == '':
  86.                                                 break;
  87.                                
  88.                                                        
  89.                                         JbSendTo(sendto,sendmsg)                       
  90.                                         print 'msg: '+ sendmsg + ' sended...'
  91.                                         ShowRecvMsg()                       
  92.                
  93.                
  94.                 except Exception,e:
  95.                         print 'error :',e
  96.                 s.close()
  97.        

复制代码


偶直接用TCP和我们公司的服务器连接.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-9-19 09:42:45 | 显示全部楼层
今天测试了用XMPPPY和Google Talk的连接,连接成功。下面把过程描述一下。
1、给XMPPPY模块的client.py源码打补丁,去掉SASL验证。这个是XMPPPY的一个Bug:
- def auth(self,user,password,resource=''):
+ def auth(self,user,password,resource='',sasl=0):

- auth.SASL().PlugIn(self)
- if self.SASL.startsasl=='not-supported':
+ if sasl: auth.SASL().PlugIn(self)
+ if not sasl or self.SASL.startsasl=='not-supported':

2、连接
>>> import xmpp
>>> c=xmpp.Client('gmail.com',debug=[])
>>> c.connect(server=('talk.google.com',5223))
'tls'
>>> c.auth('ringkee','123456','xmpppy')
'old_auth'
>>> c.sendInitPresence()
#向jims.yang发出加为好友的认证请求
>>>c.Roster.Subscribe('jims.yang@gmail.com')
>>> c.send(xmpp.protocol.Message('jims.yang@gmail.com','test message from ringkee@gmail'))
'5'
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表