OpenJS
OpenJS是腾讯微博开放平台提供的Javascript库,开发者使用该库可以轻松完成腾讯微博用户授权,访问API接口,调用官方组件等功能,支持多种应用部署环境及无缝迁移。
如果你需要实现网站与腾讯微博连接,或者开发微博应用,只需要在页面上引入OpenJS,就可以轻松实现这些功能。相比传统的接入方式,如OAuth1.0,Openid&Openkey等,它具有以下优势:
- 无需后台程序支持,用户的浏览器直接与微博API服务器交互,速度快,开发者也无需维护和部署后台程序。
- 支持多种部署环境,如腾讯域内,微博应用频道,和第三方网站等。
开始使用
在页面中引用OpenJS的方式分同步引用和异步引用两种。若用同步引用的方式,为优化网站性能,建议将OpenJS放置在页面底部加载[链]。若用异步引用的方式,开发者须进行异步编程。开发者可根据自己的项目情况,自由选择。
- 同步引用
<script src="//mat1.gtimg.com/app/openjs/openjs.js"></script>
<script>
// 同步引用,无需回调函数
// 你的代码
</script>
- 异步引用
<script>
// 异步引用需定义回调函数 onOpenjsLoad
window['onOpenjsLoad'] = function () {
alert("openJS加载成功");
}
(function(d, s, id) {
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) {return;}
js = d.createElement(s); js.id = id;
js.src = "//mat1.gtimg.com/app/openjs/openjs.js";
fjs.parentNode.insertBefore(js, fjs);
}(document, 'script', 'openjs'));
</script>
环境变量
OpenJS默认的运行环境参数配置基于大多数人的需要,一般情况下不需要做任何设置。在某些特殊情况下,开发者可以通过设置环境变量,改变OpenJS的默认行为。环境变量以Fragment URL[链]的形式传递,不区分大小写。
<script src="//mat1.gtimg.com/app/openjs/openjs.js#debug=yes"></script>
debug
Boolean默认值:false(不开启调试模式)
开启Debug模式有助于跟踪调试,建议在开发过程中开启。
logLevel
Number默认值:0(输出全部日志)
值越大意味着输出Log输出的信息越少越重要,默认输出尽可能详细的Log。
crossDomainMethod
String默认值:'auto'(自动检测)
该参数可指定跨域解决方案。默认情况下OpenJS自动检测当前浏览器,并适配一种最优的方案,假如开发者十分确定要采用的跨域方案(如:iPhone应用)可以指定该参数。
html5 使用postmessage跨域
flash 通过flash代理跨域(要求Flash Player 9以上)
cookieDomain
String默认值:''
OpenJS需使用Cookie保存用户的授权信息,此参数控制该Cookie[链]的domain域。
cookiePath
String默认值:'/'
与cookieDomain一样,此参数控制Cookie[链]的path域。如果你不想把腾讯微博用户授权信息保存在根路径下,请设置此环境变量进行控制。
autoboot
Boolean默认值:true(尽早加载跨域方案)
为真时先于init方法加载跨域方案,为假时等init执行时再加载跨域方案。
若为腾讯域内应用
[链],因为不再需要跨域,
crossDomainMethod 自动失效。
腾讯微博API调用
T.init(inInitOpts)
初始化。
<script>
T.init({
appkey:800000006
});
</script>
inInitOpts必选Map
appkey
必选String默认值:无
开放平台appkey,据协议和平台的差异性有时又叫appid或client id。
callbackurl
String默认值:当前页面网址
用户授权成功后的回跳页面地址,如不设置则为当前页面网址。回跳页面地址必须与appkey匹配[链],否则无法完成授权。建议开发者在服务器上部署一个带有提示性文字的html文件,并把callbackurl指向这个文件,以带来更好的用户体验。
autoclose
Boolean默认值:true(自动关闭授权窗口)
默认自动关闭授权窗口,授权页面一旦回跳到开发者指定的callbackurl就立刻关闭授权窗口。为假则没有此操作,开发者需要自行关闭窗口 (调用浏览器的window.close接口)。
samewindow
Boolean默认值:false(弹新窗口授权)
默认为弹新窗口授权,否则在同一窗口完成授权(类似OAuth1.0的体验),此方法用来解决某些浏览器安装了第三方弹窗屏蔽插件,造成无法授权的问题。
注意,在此情况下开发者必须自己处理授权返回的token,如果您不想编写代码,也可以使用我们提供的通用方案[链]。
在一般情况下,开发者无须担心弹出的授权窗口被浏览器屏蔽,因为授权行为一般是由用户主动点击触发,浏览器不会进行屏蔽。
<script>
// 注意:
// 采用弹窗授权模式的应用可以不用这样构造callbackurl
// 以下代码只针对samewindow为true的情况,并且采用通用方案时
// 使用
// path_to_callbackurl 是指您部署的通用方案网址
// return_to 后的参数 your_app_url 是指用户成功授权后页面要
// 跳转到的网址,一般应该是应用的入口
// appkey 后的参数 your_appkey 是固定字段,指开发者的appkey
T.init({
appkey: 800000006,
samewindow: true,
callbackurl:["path_to_callbackurl?"
,'return_to=','your_app_url'
,'&appkey=',your_appkey].join("")
})
</script>
synclogin
Boolean默认值:false
默认为不使用QQ登录态授权。若该项为真,当T.login被调用时,首先尝试使用QQ登录态授权当前应用,如失败则弹新窗口授权)。
pingback
Boolean默认值:true(发送报告)
向服务器发送技术报告,帮助我们更好的完善OpenJS。
若为腾讯域内应用
[链],
T.init 参数表变化如下:
inInitOpts必选Map
appkey
必选String默认值:无
开放平台appkey,据协议和平台的差异性有时又叫appid或client id。
showappinfo
Boolean默认值:true(显示应用信息)
若为真当用户首次使用你的应用时,将显示应用信息及授权按钮。为假则忽略授权步骤,直接获取用户的授权。
callbackurl
String默认值:当前页面网址
用户授权成功后的回跳页面地址,如不设置则为当前页面网址。回跳页面地址必须与appkey匹配[链],否则无法完成授权。
autoclose
Boolean默认值:true(自动关闭授权窗口)
默认自动关闭授权窗口,否则需开发者自行关闭回跳页面窗口。
samewindow
Boolean默认值:false(弹新窗口授权)
默认为弹新窗口授权,否则在同一窗口授权,在此情况下开发者须自己处理授权返回的token,或使用我们提供的通用方案[链]。开发者无须担心弹出的授权窗口被浏览器屏蔽,因为授权行为一般是由用户主动点击触发,浏览器不会进行屏蔽。
synclogin
Boolean默认值:false
默认为不使用QQ登录态授权。若该项为真,当T.login被调用时,首先尝试使用QQ登录态授权当前应用,如失败则弹新窗口授权)。
pingback
Boolean默认值:true(发送报告)
向服务器发送技术报告,帮助我们更好的完善OpenJS。
§
T.login(inSuccessHandler,inFailHandler)
用腾讯微博帐号登录授权应用,并根据授权结果回调相应函数。
<script>
T.login(function (loginStatus) {
alert(loginStatus.nick);
},function (loginError) {
alert(loginError.message);
});
</script>
inSuccessHandler(inLoginStatus)
Function默认值:无
用户登录授权成功后要执行的函数。
inLoginStatus
Map回调数据
包含用户登录信息。
access_token 授权后获得的OAuth2.0 Accesstoken
name 微博用户名
nick 微博昵称
inFailHandler(inLoginError)
Function默认值:无
用户登录授权失败后要执行的函数。
inLoginError
Map回调数据
包含的用户登录失败信息。
message 失败原因描述
§
T.logout(inHandler)
登出用户,清除用户授权信息。
inHandler
Function默认值:无
用户登出后要执行的函数。
§
T.loginStatus()
获取用户登录信息,如用户已登录返回包含access_token的Map对象,如未登录返回undefined。
§
T.api(inName, inParamMap, inDataType, inType, inOverride)
调用腾讯微博API[链],返回Defer对象[链]。
<script>
T.api("/user/info")
.success(function (response){
alert(response.nick);
})
.error(function (code, message) {
alert(message);
});
</script>
也支持如下书写方式,连续调用多个独立的API,也可参考
T.task方法。
<script>
T.api("/user/info")
.success(function (response){
alert(response.nick);
})
.error(function (code, message) {
alert(message);
})
.api("/statuses/home_timeline")
.success(function (response) {
alert(response);
})
.error(function (code, message) {
});
</script>
inName
必选String默认值:无
要调用的API名称,如"/t/add"。(暂不支持"/t/add_pic")
inParamMap
Map默认值:无
该API对应的参数列表,如{content:"test",clientip:"123.123.123.123"},参数表中可忽略format字段,该字段由inDataType指定。
inDataType
String默认值:"json"
返回的数据格式,"json"或"xml"。
inType
String默认值:"get"
请求方法,"get"或"post",建议调用写接口统一用"post"。
inOverride
Map默认值:无
覆盖当前使用的appkey和accessToken,此选项使T.api接口可以独立使用。
appkey 使用此appkey发出api请求
accesstoken 使用此accesstoken发出api请求。
§
T.tokenReady(inHandler)
注册回调函数,inHandler在用户登录态确定后执行。
<script>
T.tokenReady(function () {
if (T.loginStatus()) {
alert("已登录");
} else {
alert("未登录");
}
});
</script>
inHandler
Function默认值:无
用户登录态确定后要执行的函数。
§
T.documentReady(inHandler)
注册回调函数,inHandler在DOM树可用后执行。
<script>
T.documentReady(function () {
var div = document.createElement("div");
div.innerHTML = "DOM ready";
document.body.appendChild(div);
});
</script>
inHandler
Function默认值:无
DOM树可用后要执行的函数。
§
T.ready(inHandler)
注册回调函数,inHandler在tokenReady和documentReady后执行。
<script>
T.ready(function () {
var stat = T.loginStatus(),
bar = document.createElement('div'),
str;
if (stat) {
str = '欢迎' + stat.nick;
} else {
str = '未登录';
}
bar.innerHTML = str;
document.body.appendChild(bar);
});
</script>
§
T.bind(inEventName, inHandler)
绑定事件inEventName,此事件发生时执行inHandler。
<script>
T.bind("ready",function () {
alert("ready");
});
</script>
inEventName
必选String默认值:无
事件名称,可为OpenJS的事件(下表),也可自定义。
UserLoginFailed
用户拒绝授权后触发,参考T.login。 ready
token准备完毕并且DOM树可用后触发,参考T.ready。 inHandler(inEventData*)
必选Function默认值:无
事件发生时要执行的函数
§
T.unbind(inEventName, inHandler)
解除事件绑定inEventName,返回布尔值,表示解除绑定是否成功。
inEventName
必选String默认值:无
事件名称,可为OpenJS的事件,也可自定义。
inHandler
必选Function默认值:无
要解除绑定的函数。
§
T.trigger(inEventName, inEventData*)
手动触发事件inEventName,返回数组,包含回调函数执行后的系列返回值。
<script>
T.bind("myEvent",function (myEventData) {
alert(myEventData);
});
T.trigger("myEvent","myData");
</script>
inEventName
必选String默认值:无
自定义的事件名称,如无特殊需要,不建议手动触发OpenJS的事件。
inEventData
Mixed默认值:无
事件数据,参考T.bind
§
T.once(inEventName, inHandler)
与T.bind一样,区别在于inHanlder执行后自动解除绑定。
<script>
T.once("myEvent",function (myEventData) {
alert(myEventData);
});
T.trigger("myEvent","myEventData1");
T.trigger("myEvent","myEventData2");
</script>
§
T.ajax(inAjaxConfig)
AJAX请求,返回Defer对象[链]。
<script>
T.ajax({
url: "ajaxsample.json"
}).success(function (response) {
alert(response);
}).error(function (code, message) {
alert(message);
});
</script>
inAjaxConfig
必选Map默认值:无
AJAX请求配置。
type
String默认值:"get"
请求类型,get或post。
dataType
String默认值:"json"(数据转换为JSON对象)
返回结果的数据格式,json或xml或text。
cache
Boolean默认值:false(不允许缓存)
GET类型的HTTP请求会被浏览器缓存。
async
String默认值:"async"(异步请求)
请求编程类型async或sync,异步或同步。
§
T.jsonp(inJsonpConfig)
JSONP[链]请求,返回Defer对象。[链]。
<script>
T.jsonp({
url: "jsonpurl"
}).success(function (response) {
alert(response);
}).error(function (code, message) {
alert(message);
});
</script>
inJsonpConfig
必选Map默认值:无
jsonp请求配置。
data
String|Map默认值:无
附加在url的请求串。
dataType
String默认值:"json"(数据转换为JSON对象)
返回结果的数据格式,json或xml或text。
cache
Boolean默认值:false(不允许缓存)
GET类型的HTTP请求会被浏览器缓存。
charset
String默认值:"utf-8"
所请求文件编码
§
T.script(inScriptConfig)
异步引入其它script,返回Defer对象[链]。
<script>
T.script({
url: "http://code.jquery.com/jquery-1.7.2.min.js"
}).success(function () {
alert($);
}).error(function (code, message) {
alert(message);
});
</script>
inScriptConfig
必选Map默认值:无
script请求配置。
data
String|Map默认值:无
附加在url的请求串。
cache
Boolean默认值:true(允许缓存)
GET类型的HTTP请求会被浏览器缓存。
charset
String默认值:"utf-8"
所请求文件编码
§
T.task(inDeferred*)
创建任务组,同时完成多项异步任务,这些任务中如果有任一项失败,整个task失败,返回Defer对象[链]。
<script>
T.task(
T.api("/statuses/home_timeline"),
T.api("/statuses/public_timeline")
)
.success(function (homeData, publicData) {
alert([homeData[0], publicData[0]]);
})
.error(function (code, message) {
alert(message);
});
</script>
inDeferred
必选Object默认值:无
返回Defer对象的一个或多个异步请求。
§
T.find(selector, context, result)
OpenJS集成了jQuery的选择器引擎Sizzle,以帮助开发者进行高效率开发。返回数组,包含匹配到的DOM元素。
<script>
T.documentReady(function () {
alert(T.find("ul > li"));
});
</script>
selector
必选String默认值:无
选择指令。更多选择DOM元素的技巧,请参考Sizzle文档。
context
DOMElement默认值:document
选择指令的上下文环境。
§
T.localStorage
跨浏览器的数据本地存储对象,开发者可以使用此技术提升用户体验。
<script>
T.localStorage.set("mykey", "mydata");
alert(T.localStorage.get("mykey"));
</script>
set(key, value, expires)
Function保存数据到本地(请勿保存敏感数据)。
key 键名
value 键值
expires 可选,保存期限(以天为单位),默认7天。
get(key, defaultValue)
Function从本地获取数据。
key 键名
defaultValue 可选,默认的返回值
key 键名
§
T.browser
提供丰富的浏览器信息。
<script>
if (T.browser.msie && T.browser.version == 6) {
// 浏览器为IE6
// do something
}
</script>
version
String|Number浏览器的版本信息。若浏览器类型为IE,该值为数字型,为准确的IE版本号。否则为字符串,是从UserAgent[链]字段中提取出的具有参考价值版本号。
engine
String包含检测到的浏览器内核信息。
if(T.browser.engine == 'webkit') {
// do something
}
// 等同于
if(T.browser.webkit) {
// do something
}
webkit webkit内核的浏览器,如Chrome,Safari等
opera opera内核,opera浏览器
msie IE系列浏览器
mozilla 如Firefox,Netscape等
unknown 其它内核的浏览器
name
平台名称,如"pc","iPhone","iPad"等
//判断是否为iPhone
if (T.browser.platform.name == 'iPhone') {
//do something
}
等同于
if (T.browser.platform.iPhone) {
//do something
}
pc 为true时代表浏览器在PC平台(台式机,笔记本)上运行
mobile 为true时代表浏览器在移动平台(手机,平板)上运行
cookie 为true时代表支持Cookie
flash
为true时代表支持Flash。
进一步的,可以通过flash.version获得flash player版本号。通过flash[property]检查flash player的中的某个特性是否被支持。以下代码检测浏览器是否支持flash以及是否支持externalInterface[链]。
if(T.browser.feature.flash) {
// 浏览器支持flash
if(T.browser.feature.flash.externalinterface) {
//flash player支持externalInterface
}
}
userdata
为true时代表支持UserData[链] postmessage 为true时代表支持postMessage
canvas 为true时代表支持Canvas
webgl 为true时代表支持WebGL
geolocation 为true时代表支持geolocation
websqldatabase 为true时代表支持websqldatabase
indexeddb 为true时代表支持indexedDB
websocket 为true时代表支持WebSocket
localstorage 为true时代表支持localStorage
sessionstorage 为true时代表支持sessionStorage
webworker 为true时代表支持WebWorker
applicationcache 为true时代表支持applicationCache
os
Map操作系统侦测。
if(T.browser.os.name == 'windows') {
// do something
}
// 等同于
if(T.browser.os.windows) {
// do something
}
name 操作系统名称,可能的值为"windows","mac","linux","unix","unknown"
viewport
Map浏览器可见区域大小。注意,该值是实时变化的。
width 浏览器窗口可见区域的宽
height 浏览器窗口可见区域的高
rendererMode
Map浏览器进入的渲染模式侦测。
standard 为true时代表浏览器当前的渲染模式为标准
quirks 为true时代表浏览器当前的渲染模式为怪异模式(兼容模式)
§
T.template(inTemplateName)
小型js模板引擎[链],返回模板对象,使用此对象可以方便的构造html。
<script>
// 显示一个简单二维表格并隔行换色
var table = T.template("mytable");
table.add('<% for(var i=0,l=data.length; i<l; i++) { %>')
.add('<% var name= data[i][0],score=data[i][1],highlight= i%2==0; %>')
.add('<tr style="background:<%=highlight ? \"red\" : \"green\" %>;">')
.add('<td><%=name%></td><td><%=score%></td>')
.add('</tr>')
.add('<% } %>')
.wrapTag('tbody','table')
.data('data',[["张三",90],["李四",85],["王五",80],["柳六",100]]);
T.documentReady(function () {
document.body.innerHTML = table.render();
});
</script>
inTemplateName
String默认值:"unknown"
模板名。
模板对象的方法
add(inTplStr)
Function添加模板字符串。
inTplStr 模板字符串
data(inTplData,inOverWrite)
Function添加模板数据。data方法支持多种写法,以下调用方法效果相同。
<script>
var tp = T.template("mytemplate");
tp.add('<ol>')
.add('<li><%=x%></li>')
.add('<li><%=y%></li>')
.add('</ol>');
var result1 = tp.data({"x":1,"y":2}).render();
tp.reset(false,true);
var result2 = tp.data(["x",1,"y",2]).render();
tp.reset(false,true);
var result3 = tp.data("x",1).data('y',2).render();
tp.reset(false,true);
// 采用这种写法必须明确指定inOverWrite
var result4 = tp.data("x",1,'y',2,true).render();
tp.reset(false,true);
alert(result1 && result1 == result2 && result2 == result3 && result3 == result4);
</script>
inTplData 模板数据
inOverWrite 是否覆盖之前的模板数据
wrapTag(inHtmlTag*)
Function快捷方法,把模板字符串头部与尾部附加html标签。
inHtmlTag html标签,如tbody,table,div,iframe等
renderWith(inTplData,inOverWrite)
Function指定模板数据,并输出模板渲染结果,参数及用法与data方法完全一致。
inTplData 模板数据
inOverWrite 是否覆盖之前的模板数据
render()
Function输出模板渲染结果,类型为字符串。
reset(inResetTpl,inResetData)
Function重置模板字符串或重置模板数据。
inResetTpl 是否清空模板字符串
inResetData 是否清空模板数据
静态方法
renderTemplate(inTplStr, inTplData)
Function使用模板数据inTplData渲染模板inTplStr,返回渲染后的模板字符串。
inTplStr 模板
inTplData 模板数据
§
T.component(inComponentName)
创建网站连接的腾讯微博组件,返回网站连接组件对象。
<script>
T.component("微评论").appkey('801126062').renderInto("body");
</script>
inComponentName
String默认值:无
组件名称,目前仅支持"微评论"。
网站连接组件对象的公有方法
dimension(width,height)
Function设置组件宽,高。
width 组件宽度
height 组件高度
width(width)
Function设置组件宽度。
width 组件宽度
height(height)
Function设置组件高度。
height 组件高度
style(styleName)
Function设置组件样式。
styleName 组件样式名
config(inConfig)
Function其它组件配置。
inConfig 组件配置Map对象
renderInto(context)
Function在网站上渲染网站连接组件。
context
要渲染到的DOM节点或选择符[链],默认使用选择符选中的第一个元素。 render()
Function在网站上渲染网站连接组件,渲染该组件到组件预先指定的id。
微评论组件的私有方法
appkey(inAppkey)
Function设置微评论组件的Appkey。
inAppkey 微评论组件的Appkey,如801126062
colors(colors*)
Function自定义微评论组件的外观。
colors 微评论组件颜色设置,如blue,green,#06c等。最多4个,依次代表背景色,评论背景色,边框色,主字色
历史更新
版本:
1.52012.1- 由于某些接口不需要鉴权,如public_timeline,因此移除了T.api接口的登录态检查。若T.api如出现鉴权错误,请调用 T.loginStatus 检查登录态是否正常。
- 修复IE6,7下使用flash方案跨域数据乱序的错误。
常见问题
- 我在使用过程中遇到问题应该如何解决?
请首先查阅 接口常见问题。如果仍未解决,可以加入OpenJS专属QQ群 221677647。如果你认为遇到了bug或是浏览器兼容性问题,可以在 问题跟踪系统 中提交你的问题,我们的开发人员会尽快跟踪处理。 - check sign error?
check sign error是调用api时最常见的一个错误,造成这个错误的原因是被调用的接口需要鉴权,而当前没有获得用户授权,T.loginStatus() 返回undefined。要解决这个问题,请首先查阅 API文档 确定被调用接口是否需要鉴权。 若接口不需要鉴权而出现了鉴权错误,请检查传入的appkey是否正确,若appkey不正确也会产生此错误。
若接口要求鉴权,而T.loginStatus()返回undefined,可以考虑使用 T.login() 获得用户授权后再调用接口,或调用 T.api 时声明accesstoken。
- OpenJS与fusion api有什么关系?它与其它js库兼容吗?
OpenJS 和 Fusion api 没有关系,它们都是独立的js库。OpenJS可以与现有的js库或框架兼容,它会在使用者的网站上声明 QQWB 和 T 两个全局变量,它在运行过程中也会产生少量的带有特殊前缀的临时全局变量,不会影响其它js代码的执行。 - OpenJS是如何实现跨域数据提交的?
对于支持 postMessage 的浏览器,我们优先使用此方法,在其余浏览器我们采用flash提供的跨域机制完成数据传输(flashplayer要求支持ExternalInterface),要查看浏览器是否支持这两种技术,请访问此页面。 - 用OpenJS开发的应用非嵌入的时候正常,用iframe嵌入到其它页面就不正常了,是不是OpenJS不支持iframe?
OpenJS自带的鉴权机制会利用cookie保存用户的授权信息,当您的应用嵌入到另外一个页面时,就会遇到 第三方cookie 的问题,简单来说就是被嵌入非同源的页面无法读取或写入cookie。开发者只需要按照 这篇教程 在程序中输出 p3p header 即可。一般情况下,在腾讯微博应用频道上线的应用都是以iframe嵌入的,会遇到这个问题。 - 用户授权了应用,这个授权可以持续多久有效?
使用OpenJS自带的授权机制进行授权,用户的授权信息会保存cookie里,如果用户不主动清除cookie并且 T.logout() 没有被调用(实际上也是清除cookie),授权是一直有效的,否则的话用户需要重新授权。 - 授权出错,redirect_uri与注册的应用网址不匹配?
oauth2.0协议对外暴露了appid,为防止有人冒用其它人的appid让用户授权,非法获得用户的信任。我们要求授权后页面回跳的地址必须是该appid拥有者所指定的地址(应用网址),否则便阻止用户授权。这可能会给开发者应用开发过程中的调试带来不便,我们建议在开发过程中采用配置HOSTS文件改变域名到IP映射的办法解决这个问题,或者也可以在开发阶段采用ip地址作为网址,应用提交审核或正式上线时再切换到域名。
- 什么是腾讯域内应用?
腾讯域内应用,是指应用网址以qq.com结尾的应用,简称域内应用。
OpenJS同时支持腾讯域内应用与域外应用的开发,两者的区别是授权画面不一样,域内应用采用浮层式的体验,域外应用采用弹窗的体验。
注意,使用OpenJS开发的域内应用document.domain为qq.com。
OpenJS完美支持域内应用与域外应用互相迁移,意味者开发者无需更改任何代码即可把域外的应用迁移到域内使用,反之亦可。
成功案例