import sys, os
import httplib, urllib
import random, binascii
from urlparse import urlparse
from punjab.httpb import HttpbParse
from twisted.words.xish import domish
from twisted.words.protocols.jabber import jid
TLS_XMLNS = 'urn:ietf:params:xml:ns:xmpp-tls'
SASL_XMLNS = 'urn:ietf:params:xml:ns:xmpp-sasl'
BIND_XMLNS = 'urn:ietf:params:xml:ns:xmpp-bind'
SESSION_XMLNS = 'urn:ietf:params:xml:ns:xmpp-session'
class BOSHClient:
def __init__(self, jabberid, password, bosh_service):
self.rid = random.randint(0, 10000000)
self.jabberid = jid.internJID(jabberid)
self.password = password
self.authid = None
self.sid = None
self.logged_in = False
self.headers = {"Content-type": "text/xml",
"Accept": "text/xml"}
self.bosh_service = urlparse(bosh_service)
def buildBody(self, child=None):
"""Build a BOSH body.
"""
body = domish.Element(("http://jabber.org/protocol/httpbind", "body"))
body['content'] = 'text/xml; charset=utf-8'
self.rid = self.rid + 1
body['rid'] = str(self.rid)
body['sid'] = str(self.sid)
body['xml:lang'] = 'en'
if child is not None:
body.addChild(child)
return body
def sendBody(self, body):
"""Send the body.
"""
parser = HttpbParse(True)
# start new session
conn = httplib.HTTPConnection(self.bosh_service.netloc)
conn.request("POST", self.bosh_service.path,
body.toXml(), self.headers)
response = conn.getresponse()
data = ''
if response.status == 200:
data = response.read()
conn.close()
return parser.parse(data)
def startSessionAndAuth(self, hold='1', wait='70'):
# Create a session
# create body
body = domish.Element(("http://jabber.org/protocol/httpbind", "body"))
body['content'] = 'text/xml; charset=utf-8'
body['hold'] = hold
body['rid'] = str(self.rid)
body['to'] = self.jabberid.host
body['wait'] = wait
body['window'] = '5'
body['xml:lang'] = 'en'
retb, elems = self.sendBody(body)
if type(retb) != str and retb.hasAttribute('authid') and \
retb.hasAttribute('sid'):
self.authid = retb['authid']
self.sid = retb['sid']
# go ahead and auth
auth = domish.Element((SASL_XMLNS, 'auth'))
auth['mechanism'] = 'PLAIN'
# TODO: add authzid
if auth['mechanism'] == 'PLAIN':
auth_str = ""
auth_str += "\000"
auth_str += self.jabberid.user.encode('utf-8')
auth_str += "\000"
try:
auth_str += self.password.encode('utf-8').strip()
except UnicodeDecodeError:
auth_str += self.password.decode('latin1') \
.encode('utf-8').strip()
auth.addContent(binascii.b2a_base64(auth_str))
retb, elems = self.sendBody(self.buildBody(auth))
if len(elems) == 0:
# poll for data
retb, elems = self.sendBody(self.buildBody())
if len(elems) > 0:
if elems[0].name == 'success':
retb, elems = self.sendBody(self.buildBody())
if elems[0].firstChildElement().name == 'bind':
iq = domish.Element(('jabber:client', 'iq'))
iq['type'] = 'set'
iq.addUniqueId()
iq.addElement('bind')
iq.bind['xmlns'] = BIND_XMLNS
if self.jabberid.resource:
iq.bind.addElement('resource')
iq.bind.resource.addContent(
self.jabberid.resource)
retb, elems = self.sendBody(self.buildBody(iq))
if type(retb) != str and retb.name == 'body':
# send session
iq = domish.Element(('jabber:client', 'iq'))
iq['type'] = 'set'
iq.addUniqueId()
iq.addElement('session')
iq.session['xmlns'] = SESSION_XMLNS
retb, elems = self.sendBody(self.buildBody(iq))
# did not bind, TODO - add a retry?
if type(retb) != str and retb.name == 'body':
self.logged_in = True
# bump up the rid, punjab already
# received self.rid
self.rid += 1
if __name__ == '__main__':
USERNAME = sys.argv[1]
PASSWORD = sys.argv[2]
SERVICE = sys.argv[3]
c = BOSHClient(USERNAME, PASSWORD, SERVICE)
c.startSessionAndAuth()
print c.logged_in
没有合适的资源?快使用搜索试试~ 我知道了~
XMPP高级编程——使用JavaScript和JQuery 附带的源码
共68个文件
js:28个
html:13个
css:12个
5星 · 超过95%的资源 需积分: 9 158 下载量 129 浏览量
2012-07-17
10:43:53
上传
评论
收藏 180KB ZIP 举报
温馨提示
本资源是《XMPP高级编程——使用JavaScript和JQuery》一书附带的源码,十分详细,搭载在服务器上可直接运行。如果要用自己搭建的Openfire之类的XMPP服务器,修改也十分简单,是学习Web环境下的XMPP协议开发的好资料。
资源推荐
资源详情
资源评论
收起资源包目录
9780470540718_Professional XMPP_Code Download.zip (68个子文件)
9780470540718_Professional XMPP_Code Download
ch12
attach
media
swfobject.js 10KB
updateplayer.swf 1KB
jquery-1.3.2.min.js 56KB
flXHR.js 12KB
flXHR.swf 10KB
strophe.js 115KB
attacher.js 701B
checkplayer.js 9KB
attacher.css 110B
strophe.flxhr.js 1021B
flXHR.vbs 1KB
flensed.js 4KB
boshclient.py 5KB
templates
attacher
index.html 880B
urls.py 225B
__init__.py 0B
attacher
__init__.py 0B
views.py 475B
models.py 57B
tests.py 514B
manage.py 546B
settings.py 3KB
ch03
hello.css 131B
hello.js 2KB
hello.html 985B
ch04
peek.js 6KB
peek.css 1KB
peek.html 1KB
ch05
arthur.html 1KB
arthur.js 2KB
arthur.css 254B
ch09
sketchcast.js 12KB
sketchcast.css 637B
sketchcast.html 2KB
ch11
toetem.css 634B
toetem.js 13KB
board.js 3KB
referee.html 1KB
referee.css 131B
referee.js 20KB
toetem.html 2KB
scripts
swfobject.js 10KB
updateplayer.swf 1KB
flXHR.js 12KB
flXHR.swf 10KB
strophe.js 115KB
checkplayer.js 9KB
strophe.flxhr.js 1021B
flXHR.vbs 1KB
flensed.js 4KB
ch08
groupie.js 12KB
groupie.html 2KB
groupie.css 951B
index.html 2KB
ch14
rosterwatch.js 2KB
rosterwatch.css 481B
rosterwatch.html 1KB
strophe.roster.js 6KB
ch07
dig.html 1KB
dig.js 5KB
dig.css 626B
ch10
optrans.js 6KB
netpad.js 11KB
netpad.css 415B
netpad.html 1KB
ch06
gab.html 2KB
gab.css 1KB
gab.js 14KB
共 68 条
- 1
lovewater
- 粉丝: 133
- 资源: 91
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
- 3
前往页