4700 lines
171 KiB
JavaScript
4700 lines
171 KiB
JavaScript
(function() {
|
|
var a, b = window.T,
|
|
c = "http";
|
|
scheme = c + "://", host = "open.t.qq.com", a = {
|
|
name: "Tencent
|
|
weibo
|
|
SDK",
|
|
version: "1.0",
|
|
appkey: {
|
|
value: "{APPKEY}",
|
|
version: "{APPKEY_VERSION}",
|
|
verified: !1
|
|
},
|
|
debug: !0,
|
|
pingback: !0,
|
|
_domain: {
|
|
api: scheme + host + "{API_URI}",
|
|
auth: scheme + host + "{AUTH_URI}",
|
|
query: scheme + host + "{QUERY_TOKEN_URI}",
|
|
exchange: scheme + host + "{EXCHANGE_TOKEN_URI}",
|
|
flashproxy: scheme + host + "{FLASHPROXY_URI}",
|
|
serverproxy: scheme + host + "{SERVERPROXY_URI}",
|
|
clientproxy: "{CLIENTPROXY_URI}"
|
|
},
|
|
_const: {
|
|
AUTH_WINDOW_NAME: "authClientProxy_ee5a0f93",
|
|
AUTH_WINDOW_WIDTH: 575,
|
|
AUTH_WINDOW_HEIGHT: 465
|
|
},
|
|
_cookie: {
|
|
names: {
|
|
accessToken: "QQWBToken",
|
|
refreshToken: "QQWBRefreshToken"
|
|
},
|
|
path: "/",
|
|
domain: ""
|
|
},
|
|
noConflict: function() {
|
|
return
|
|
b && (window.T = b), a
|
|
},
|
|
copy: function(a, b, c, d) {
|
|
for (var e in b) if (c || typeof
|
|
a[e] == "undefined") a[e] = d ? d(b[e]) : b[e];
|
|
return a
|
|
},
|
|
create: function(a, b) {
|
|
var
|
|
c = this,
|
|
d = a ? a.split(".") : [],
|
|
e = d.length;
|
|
for (var f = 0; f < e; f++) {
|
|
var
|
|
g = d[f],
|
|
h = c[g];
|
|
h || (h = b && f + 1 === e ? b : {}, c[g] = h), c = h
|
|
}
|
|
return
|
|
c
|
|
},
|
|
extend: function(b, c, d) {
|
|
return a.copy(typeof
|
|
b == "string" ? a.create.call(this, b) : b, c, d)
|
|
},
|
|
_alias: function(b, c) {
|
|
c = c || a;
|
|
if (typeof
|
|
b == "string") this[b] = c;
|
|
else if (Object.prototype.toString.call(b) === "[object
|
|
Array]") for (var
|
|
d = 0, e = b.length; d < e; d++) this[b[d]] = c
|
|
},
|
|
alias: function(b, c) {
|
|
a._alias(b, a[c])
|
|
},
|
|
assign: function(a, b, c) {
|
|
var
|
|
d = this,
|
|
e = d,
|
|
f = a ? a.split(".") : [],
|
|
g = f.length;
|
|
for (var h = 0; h < g; h++) {
|
|
var
|
|
i = f[h],
|
|
j = d[i];
|
|
if (!j) throw new Error("Tencent weibo SDK: [ERROR] no such name
|
|
" + i);
|
|
e = d, d = j
|
|
}
|
|
if (typeof d == "string") e[i] = d.replace(new
|
|
RegExp("\\{" + b + "\\}", "ig"), c);
|
|
else if (typeof d == "object") for (var k in d) d.hasOwnProperty(k) && typeof d[k] == "string" && (d[k] = d[k].replace(new
|
|
RegExp("\\{" + b + "\\}", "ig"), c))
|
|
},
|
|
uid: function() {
|
|
return
|
|
Math.random().toString(16).substr(2)
|
|
}
|
|
}, a.alias("provide", "create"), a._alias.call(window, ["QQWB", "T"], a), a.assign("_domain", "API_URI", "/api"), a.assign("_domain", "AUTH_URI", "/oauth2_html/login.php"), a.assign("_domain", "SERVERPROXY_URI", "/open-js/proxy.html"), a.assign("_domain", "FLASHPROXY_URI", "/open-js/proxy_v15.swf"), a.assign("_domain", "EXCHANGE_TOKEN_URI", "/cgi-bin/exchange_token"), a.assign("_domain", "QUERY_TOKEN_URI", "/cgi-bin/auto_token")
|
|
})(), QQWB.extend("String", {
|
|
_trimLeft: /^\s+/,
|
|
_trimRight: /\s+$/,
|
|
isString: function(a) {
|
|
return
|
|
typeof a == "string"
|
|
},
|
|
ltrim: function(a) {
|
|
return
|
|
a == null ? "" : a.toString().replace(this._trimLeft, "")
|
|
},
|
|
rtrim: function(a) {
|
|
return
|
|
a == null ? "" : a.toString().replace(this._trimRight, "")
|
|
},
|
|
trim: String.prototype.trim ?
|
|
function(a) {
|
|
return
|
|
a == null ? "" : String.prototype.trim.call(a)
|
|
} : function(a) {
|
|
return
|
|
a == null ? "" : a.toString().replace(this._trimLeft, "").replace(this._trimRight, "")
|
|
},
|
|
startsWith: String.prototype.startsWith ?
|
|
function(a, b) {
|
|
return
|
|
a == null ? !1 : String.prototype.startsWith.call(a, b)
|
|
} : function(a, b) {
|
|
return
|
|
a == null ? !1 : a.toString().indexOf(b) == 0
|
|
},
|
|
endsWith: String.prototype.endsWith ?
|
|
function(a, b) {
|
|
return
|
|
a == null ? !1 : String.prototype.endsWith.call(a, b)
|
|
} : function(a, b) {
|
|
return
|
|
a == null ? !1 : a.toString().lastIndexOf(b) >= 0 && a.toString().lastIndexOf(b) + b.length == a.length
|
|
}
|
|
}), QQWB.extend("_const", {
|
|
HTTP_METHOD_GET: "GET",
|
|
HTTP_METHOD_POST: "POST",
|
|
HTTP_METHOD_GET_OR_POST: "GET
|
|
|
|
|
POST",
|
|
API_CATEGORY_TIMELINE: "时间线",
|
|
API_CATEGORY_WEIBO: "微博相关",
|
|
API_CATEGORY_ACCOUNT: "账户相关",
|
|
API_CATEGORY_RELATION: "关系链相关",
|
|
API_CATEGORY_SIXIN: "私信相关",
|
|
API_CATEGORY_SEARCH: "搜索相关",
|
|
API_CATEGORY_TRENS: "热度趋势",
|
|
API_CATEGORY_QUERY: "查看数据",
|
|
API_CATEGORY_FAVORITE: "数据收藏",
|
|
API_CATEGORY_TOPIC: "话题相关",
|
|
API_CATEGORY_TAG: "标签相关",
|
|
API_CATEGORY_OTHER: "其他",
|
|
API_NO_DESCRIPTION: "暂时没有关于此参数的说明",
|
|
API_NO_DEFAULT_VALUE: "",
|
|
COMMON_NULL: null,
|
|
COMMON_EMPTY_STRING: ""
|
|
}), QQWB.extend("_apiProvider", {
|
|
_apiRetError: {
|
|
1: "参数错误",
|
|
2: "频率受限",
|
|
3: "鉴权失败",
|
|
4: "内部错误"
|
|
},
|
|
_apiErrorCode: {
|
|
4: "过多脏话",
|
|
5: "禁止访问",
|
|
6: "记录不存在",
|
|
8: "内容过长",
|
|
9: "内容包含垃圾信息",
|
|
10: "发表太快,频率限制",
|
|
11: "源消息不存在",
|
|
12: "未知错误",
|
|
13: "重复发表"
|
|
},
|
|
_apiParseRetCode: function(a) {
|
|
var
|
|
b = a.match(/\"ret\":(\d+)\}/) || a.match(/<ret>(\d+)<\/ret>/);
|
|
return
|
|
b ? parseInt(b[1], 10) : b
|
|
},
|
|
_apiParseErrorCode: function(a) {
|
|
var
|
|
b = a.match(/\"errcode\":(-?\d+)/) || a.match(/<errcode>(\d+)<\/errcode>/);
|
|
return
|
|
b ? parseInt(b[1], 10) : b
|
|
},
|
|
_apiGetErrorMessage: function(a, b) {
|
|
var
|
|
c = [],
|
|
a = a + "",
|
|
b = b + "",
|
|
d = QQWB._apiProvider._apiRetError[a],
|
|
e = QQWB._apiProvider._apiErrorCode[b];
|
|
return
|
|
d && c.push(d), e && c.push(e), c.length > 0 ? c.join(",") : "未知错误"
|
|
},
|
|
apis: {
|
|
"/statuses/home_timeline": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "主页时间线",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/home_timeline_vip": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "vip用户时间线",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: "2",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/public_timeline": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "广播大厅时间线",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pos: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/user_timeline": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "其他用户发表时间线",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/mentions_timeline": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "@提到我的时间线",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
type: {
|
|
defaultValue: "0x1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/ht_timeline": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "话题时间线",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
httext: {
|
|
defaultValue: "pBoard",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pageinfo: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/broadcast_timeline": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "我发表时间线",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/special_timeline": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "特别收听的人发表时间线",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/broadcast_timeline_ids": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "我发表时间线索引",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
type: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
contenttype: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
accesslevel: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/home_timeline_ids": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "首页时间线索引",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
type: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
contenttype: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
accesslevel: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/mentions_timeline_ids": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "提及我的时间线索引",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
type: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
contenttype: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
accesslevel: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/user_timeline_ids": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "用户发表时间线索引",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
type: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
contenttype: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
accesslevel: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/users_timeline": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "多用户发表时间线",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
names: {
|
|
defaultValue: "t,api_weibo",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
type: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
contenttype: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
accesslevel: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/users_timeline_ids": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "多用户发表时间线索引",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
names: {
|
|
defaultValue: "t,api_weibo",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
type: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
contenttype: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
accesslevel: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/area_timeline": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "同城发表时间线",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pos: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
country: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
province: {
|
|
defaultValue: 11,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
city: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/statuses/ht_timeline_ext": {
|
|
category: QQWB._const.API_CATEGORY_TIMELINE,
|
|
description: "话题时间线(修复翻页问题)",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 10,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
flag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
accesslevel: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
type: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
contenttype: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
httext: {
|
|
defaultValue: "iweibo",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
htid: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/show": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "获取一条微博数据",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
id: {
|
|
defaultValue: 51545056800467,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/add": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "发表一条微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/del": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "删除一条微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
id: {
|
|
defaultValue: 94035056272295,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/re_add": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "转播一条微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reid: {
|
|
defaultValue: 77048060858014,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/reply": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "回复一条微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reid: {
|
|
defaultValue: 77048060858014,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/add_pic": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "发表一条图片微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pic: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/add_emotion": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "发表一条心情微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
signtype: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/re_count": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "转播数或点评数",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
ids: {
|
|
defaultValue: 0xb04fd23c98500000,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
flag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/re_list": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "获取单条微博的转发和点评列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
flag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
rootid: {
|
|
defaultValue: 92035070199751,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pageflag: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: "2",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
twitterid: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/comment": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "点评一条微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reid: {
|
|
defaultValue: 28135069067568,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/add_music": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "发表音频微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
url: {
|
|
defaultValue: "http://url.cn",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
title: {
|
|
defaultValue: "歌名",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
author: {
|
|
defaultValue: "演唱者",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reid: {
|
|
defaultValue: 12345678,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/add_video": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "发表视频微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
url: {
|
|
defaultValue: "http://url.cn",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/add_video": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "发表视频微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
url: {
|
|
defaultValue: "http://url.cn",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/getvideoinfo": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "获取视频信息",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
url: {
|
|
defaultValue: "http://v.youku.com/v_show/id_XMjExODczODM2.html",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/list": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "根据微博ID批量得到微博数据",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
ids: {
|
|
defaultValue: "39110101242147,39578069128701",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/add_video_prev": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "预发表一条视频微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
vid: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
title: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/t/sub_re_count": {
|
|
category: QQWB._const.API_CATEGORY_WEIBO,
|
|
description: "获取转播的再次转播数",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
ids: {
|
|
defaultValue: "8171051658365,55054116813124",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/user/info": {
|
|
category: QQWB._const.API_CATEGORY_ACCOUNT,
|
|
description: "获取自己的详细资料",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET
|
|
},
|
|
"/user/update": {
|
|
category: QQWB._const.API_CATEGORY_ACCOUNT,
|
|
description: "更新个人资料",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
nick: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
sex: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
year: {
|
|
defaultValue: 2e3,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
month: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
day: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
countrycode: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
provincecode: {
|
|
defaultValue: 11,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
citycode: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
introduction: {
|
|
defaultValue: "xxxx",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/user/update_edu": {
|
|
category: QQWB._const.API_CATEGORY_ACCOUNT,
|
|
description: "更新个人教育信息",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
year: {
|
|
defaultValue: 1995,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
level: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
schoolid: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
field: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
departmentid: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/user/update_head": {
|
|
category: QQWB._const.API_CATEGORY_ACCOUNT,
|
|
description: "更新个人资料头像",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
pic: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/user/other_info": {
|
|
category: QQWB._const.API_CATEGORY_ACCOUNT,
|
|
description: "获取其他人资料",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/user/infos": {
|
|
category: QQWB._const.API_CATEGORY_ACCOUNT,
|
|
description: "多用户信息",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
names: {
|
|
defaultValue: "t,api_weibo",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/user/verify": {
|
|
category: QQWB._const.API_CATEGORY_ACCOUNT,
|
|
description: "验证账户是否合法(是否注册微博)",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/user/emotion": {
|
|
category: QQWB._const.API_CATEGORY_ACCOUNT,
|
|
description: "获取心情微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
id: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
timstamp: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
type: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
contenttype: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
accesslevel: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
emotiontype: {
|
|
defaultValue: "0xFFFFFFFF",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 10,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/fanslist": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "我的听众列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
startindex: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/idollist": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "我收听的人列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
startindex: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/blacklist": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "黑名单列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
startindex: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/speciallist": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "特别收听列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
startindex: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/add": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "收听某个用户",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/del": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "取消收听某个用户",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/addspecial": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "特别收听某个用户",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/delspecial": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "取消特别收听某个用户",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/addblacklist": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "添加某个用户到黑名单",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/delblacklist": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "从黑名单中删除某个用户",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/check": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "检查是否我的听众或收听的人",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
names: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
flag: {
|
|
defaultValue: "2",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/user_fanslist": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "其他账户听众列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 30,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
startindex: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/user_idollist": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "其他账户收听的人列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 30,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
startindex: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/user_speciallist": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "其他账户特别收听的人列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 30,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
startindex: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
name: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/fanslist_s": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "多听众列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 100,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
startindex: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/idollist_s": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "多收听人列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 100,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
startindex: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/friends/mutual_list": {
|
|
category: QQWB._const.API_CATEGORY_RELATION,
|
|
description: "互听关系链列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
name: {
|
|
defaultValue: "t",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
startindex: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 30,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/private/add": {
|
|
category: QQWB._const.API_CATEGORY_SIXIN,
|
|
description: "发私信",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
content: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
clientip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
jing: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
wei: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
name: {
|
|
defaultValue: "mmplayer",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/private/del": {
|
|
category: QQWB._const.API_CATEGORY_SIXIN,
|
|
description: "删除一条私信",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
id: {
|
|
defaultValue: 26154115313103,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/private/recv": {
|
|
category: QQWB._const.API_CATEGORY_SIXIN,
|
|
description: "收件箱",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/private/send": {
|
|
category: QQWB._const.API_CATEGORY_SIXIN,
|
|
description: "发件箱",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/search/user": {
|
|
category: QQWB._const.API_CATEGORY_SEARCH,
|
|
description: "搜索用户",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
keyword: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagesize: {
|
|
defaultValue: 10,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
page: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/search/t": {
|
|
category: QQWB._const.API_CATEGORY_SEARCH,
|
|
description: "搜索微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
keyword: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagesize: {
|
|
defaultValue: 10,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
page: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/search/userbytag": {
|
|
category: QQWB._const.API_CATEGORY_SEARCH,
|
|
description: "通过标签搜索用户",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
keyword: {
|
|
defaultValue: "test",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagesize: {
|
|
defaultValue: 10,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
page: {
|
|
defaultValue: "1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/trends/ht": {
|
|
category: QQWB._const.API_CATEGORY_TRENS,
|
|
description: "话题热榜",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
type: {
|
|
defaultValue: "3",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pos: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/trends/t": {
|
|
category: QQWB._const.API_CATEGORY_TRENS,
|
|
description: "热门转播",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pos: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/info/update": {
|
|
category: QQWB._const.API_CATEGORY_QUERY,
|
|
description: "更新条数",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
op: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
type: {
|
|
defaultValue: "9",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/fav/addt": {
|
|
category: QQWB._const.API_CATEGORY_FAVORITE,
|
|
description: "收藏一条微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
id: {
|
|
defaultValue: 123456789,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/fav/delt": {
|
|
category: QQWB._const.API_CATEGORY_FAVORITE,
|
|
description: "取消收藏一条微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
id: {
|
|
defaultValue: 123456789,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/fav/list_t": {
|
|
category: QQWB._const.API_CATEGORY_FAVORITE,
|
|
description: "收藏的微博列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
nexttime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
prevtime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/fav/addht": {
|
|
category: QQWB._const.API_CATEGORY_FAVORITE,
|
|
description: "订阅话题",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
id: {
|
|
defaultValue: 123456789,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/fav/delht": {
|
|
category: QQWB._const.API_CATEGORY_FAVORITE,
|
|
description: "取消收藏话题",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
id: {
|
|
defaultValue: 123456789,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/fav/list_ht": {
|
|
category: QQWB._const.API_CATEGORY_FAVORITE,
|
|
description: "获取已订阅话题列表",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
reqnum: {
|
|
defaultValue: 20,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pageflag: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
pagetime: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
lastid: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/ht/ids": {
|
|
category: QQWB._const.API_CATEGORY_TOPIC,
|
|
description: "根据话题名称查询话题ID",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
httexts: {
|
|
defaultValue: "abc,efg",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/ht/info": {
|
|
category: QQWB._const.API_CATEGORY_TOPIC,
|
|
description: "根据话题ID获取话题相关微博",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
ids: {
|
|
defaultValue: 0xb04fd23c98500000,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/tag/add": {
|
|
category: QQWB._const.API_CATEGORY_TAG,
|
|
description: "添加标签",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
tag: {
|
|
defaultValue: "snow",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/tag/del": {
|
|
category: QQWB._const.API_CATEGORY_TAG,
|
|
description: "删除标签",
|
|
supportMethod: QQWB._const.HTTP_METHOD_POST,
|
|
supportParams: {
|
|
tagid: {
|
|
defaultValue: 0x4735d427dffb9400,
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/other/kownperson": {
|
|
category: QQWB._const.API_CATEGORY_OTHER,
|
|
description: "我可能认识的人",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
ip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
country_code: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
province_code: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
},
|
|
city_code: {
|
|
defaultValue: "",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/other/kownperson": {
|
|
category: QQWB._const.API_CATEGORY_OTHER,
|
|
description: "可能认识的人",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET
|
|
},
|
|
"/other/shorturl": {
|
|
category: QQWB._const.API_CATEGORY_OTHER,
|
|
description: "短URL转长URL",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
url: {
|
|
defaultValue: "3M6GSa",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/other/get_emotions": {
|
|
category: QQWB._const.API_CATEGORY_OTHER,
|
|
description: "获取表情接口",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
type: {
|
|
defaultValue: "0",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/other/kownperson": {
|
|
category: QQWB._const.API_CATEGORY_OTHER,
|
|
description: "我可能认识的人",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET,
|
|
supportParams: {
|
|
ip: {
|
|
defaultValue: "127.0.0.1",
|
|
description: QQWB._const.API_NO_DESCRIPTION
|
|
}
|
|
}
|
|
},
|
|
"/other/videokey": {
|
|
category: QQWB._const.API_CATEGORY_OTHER,
|
|
description: "获取视频上传的key",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET
|
|
},
|
|
"/other/gettopreadd": {
|
|
category: QQWB._const.API_CATEGORY_OTHER,
|
|
description: "一键转播热门排行",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET
|
|
},
|
|
"/other/url_converge": {
|
|
category: QQWB._const.API_CATEGORY_OTHER,
|
|
description: "短url聚合",
|
|
supportMethod: QQWB._const.HTTP_METHOD_GET
|
|
}
|
|
},
|
|
getDescriptor: function(a) {
|
|
return
|
|
this.apis[a]
|
|
},
|
|
isProvide: function(a) {
|
|
return !!this.getDescriptor(a)
|
|
},
|
|
describe: function(a) {
|
|
var b = this.getDescriptor(a);
|
|
return
|
|
b ? b.category + ">" + b.description : ""
|
|
},
|
|
compat: function(a) {
|
|
return !QQWB.String.startsWith(a, "/") && (a = "/" + a), a.toLowerCase()
|
|
}
|
|
});
|
|
var
|
|
JSON;
|
|
JSON || (JSON = {}), function() {
|
|
function f(a) {
|
|
return a < 10 ? "0" + a : a
|
|
}
|
|
|
|
function
|
|
quote(a) {
|
|
return
|
|
escapable.lastIndex = 0, escapable.test(a) ? '"' + a.replace(escapable, function(a) {
|
|
var
|
|
b = meta[a];
|
|
return typeof
|
|
b == "string" ? b : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
|
|
}) + '"' : '"' + a + '"'
|
|
}
|
|
|
|
function
|
|
str(a, b) {
|
|
var c, d, e, f, g = gap,
|
|
h, i = b[a];
|
|
i && typeof i == "object" && typeof
|
|
i.toJSON == "function" && (i = i.toJSON(a)), typeof
|
|
rep == "function" && (i = rep.call(b, a, i));
|
|
switch (typeof i) {
|
|
case "string":
|
|
return
|
|
quote(i);
|
|
case "number":
|
|
return
|
|
isFinite(i) ? String(i) : "null";
|
|
case "boolean":
|
|
case "null":
|
|
return
|
|
String(i);
|
|
case "object":
|
|
if (!i) return "null";
|
|
gap += indent, h = [];
|
|
if (Object.prototype.toString.apply(i) === "[object
|
|
Array]") {
|
|
f = i.length;
|
|
for (c = 0; c < f; c += 1) h[c] = str(c, i) || "null";
|
|
return
|
|
e = h.length === 0 ? "[]" : gap ? "[\n" + gap + h.join(",\n" + gap) + "\n" + g + "]" : "[" + h.join(",") + "]", gap = g, e
|
|
}
|
|
if (rep && typeof
|
|
rep == "object") {
|
|
f = rep.length;
|
|
for (c = 0; c < f; c += 1) typeof
|
|
rep[c] == "string" && (d = rep[c], e = str(d, i), e && h.push(quote(d) + (gap ? ":
|
|
" : ":") + e))
|
|
} else for (d in i) Object.prototype.hasOwnProperty.call(i, d) && (e = str(d, i), e && h.push(quote(d) + (gap ? ":
|
|
" : ":") + e));
|
|
return
|
|
e = h.length === 0 ? "{}" : gap ? "{\n" + gap + h.join(",\n" + gap) + "\n" + g + "}" : "{" + h.join(",") + "}", gap = g, e
|
|
}
|
|
}
|
|
"use
|
|
strict", typeof
|
|
Date.prototype.toJSON != "function" && (Date.prototype.toJSON = function(a) {
|
|
return
|
|
isFinite(this.valueOf()) ? this.getUTCFullYear() + "-" + f(this.getUTCMonth() + 1) + "-" + f(this.getUTCDate()) + "T" + f(this.getUTCHours()) + ":" + f(this.getUTCMinutes()) + ":" + f(this.getUTCSeconds()) + "Z" : null
|
|
}, String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function(a) {
|
|
return
|
|
this.valueOf()
|
|
});
|
|
var
|
|
cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
|
escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,
|
|
gap, indent, meta = {
|
|
"\b": "\\b",
|
|
"\t": "\\t",
|
|
"\n": "\\n",
|
|
"\f": "\\f",
|
|
"\r": "\\r",
|
|
'"': '\\"',
|
|
"\\": "\\\\"
|
|
},
|
|
rep;
|
|
typeof
|
|
JSON.stringify != "function" && (JSON.stringify = function(a, b, c) {
|
|
var
|
|
d;
|
|
gap = "", indent = "";
|
|
if (typeof c == "number") for (d = 0; d < c; d += 1) indent += " ";
|
|
else typeof c == "string" && (indent = c);
|
|
rep = b;
|
|
if (!b || typeof b == "function" || typeof
|
|
b == "object" && typeof b.length == "number") return str("", {
|
|
"": a
|
|
});
|
|
throw new
|
|
Error("JSON.stringify")
|
|
}), typeof
|
|
JSON.parse != "function" && (JSON.parse = function(text, reviver) {
|
|
function
|
|
walk(a, b) {
|
|
var c, d, e = a[b];
|
|
if (e && typeof e == "object") for (c in e) Object.prototype.hasOwnProperty.call(e, c) && (d = walk(e, c), d !== undefined ? e[c] = d : delete
|
|
e[c]);
|
|
return reviver.call(a, b, e)
|
|
}
|
|
var
|
|
j;
|
|
text = String(text), cx.lastIndex = 0, cx.test(text) && (text = text.replace(cx, function(a) {
|
|
return "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
|
|
}));
|
|
if (/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) return
|
|
j = eval("(" + text + ")"), typeof reviver == "function" ? walk({
|
|
"": j
|
|
}, "") : j;
|
|
throw new
|
|
SyntaxError("JSON.parse")
|
|
})
|
|
}(), QQWB.extend("JSON", {
|
|
fromString: function(a) {
|
|
if (!a || !QQWB.String.isString(a)) return {};
|
|
a = a.replace(/^\s+/, "").replace(/\s+$/, "");
|
|
if (window.JSON && window.JSON.parse) a = window.JSON.parse(a);
|
|
else if (/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, "@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, "]").replace(/(?:^|:|,)(?:\s*\[)+/g, ""))) a = (new
|
|
Function("return " + data))();
|
|
else throw new SyntaxError("Invalid JSON:
|
|
" + a);
|
|
return a
|
|
},
|
|
stringify: function(a) {
|
|
return
|
|
a == null ? "" : window.JSON.stringify(a)
|
|
},
|
|
toString: function(a) {
|
|
return
|
|
QQWB.JSON.stringify(a)
|
|
},
|
|
parse: function(a) {
|
|
return
|
|
a == null ? {} : window.JSON.parse(a)
|
|
}
|
|
}, !0), QQWB.provide("man", function(a) {
|
|
return
|
|
a = this._apiProvider.compat(a), this._apiProvider.getDescriptor(a) ? QQWB.JSON.stringify(this._apiProvider.getDescriptor(a)) : "no
|
|
such api"
|
|
}), QQWB.extend("Array", {
|
|
isArray: function(a) {
|
|
return
|
|
Object.prototype.toString.call(a) === "[object
|
|
Array]"
|
|
},
|
|
inArray: function(a, b) {
|
|
for (var
|
|
c = 0, d = a.length; c < d; c++) if (b === a[c]) return !0;
|
|
return !1
|
|
},
|
|
fromString: function(a, b, c) {
|
|
return
|
|
QQWB.String.isString(a) ? (b = b || "", c ? a.split(b, c) : a.split(b)) : []
|
|
},
|
|
fromArguments: function(a, b) {
|
|
return
|
|
typeof
|
|
a != "object" ? [] : b ? Array.prototype.slice.call(a, b) : Array.prototype.slice.call(a)
|
|
},
|
|
toArray: function(a) {
|
|
return
|
|
typeof a == "string" ? a.split("") : typeof
|
|
a == "object" ? Array.prototype.slice.call(a, 0) : this.toArray(a.toString())
|
|
},
|
|
each: function(a, b) {
|
|
for (var
|
|
c = 0, d = a.length; c < d; c++) if (!1 === b(c, a[c])) break
|
|
},
|
|
get: function(a, b) {
|
|
var
|
|
c = a.length;
|
|
if (Math.abs(b) < c) return
|
|
b >= 0 ? a[b] : a[c + b]
|
|
}
|
|
}), QQWB.extend("dom", {
|
|
create: function(a, b) {
|
|
var
|
|
c = document.createElement(a + "");
|
|
if (b && c) for (attr in b) b.hasOwnProperty(attr) && (QQWB.String.startsWith(attr, "data-") ? c.setAttribute(attr, b[attr]) : c[attr] = b[attr]);
|
|
return
|
|
c
|
|
},
|
|
createHidden: function(a, b, c) {
|
|
a = a || "div";
|
|
var d = this.create(a, b);
|
|
return
|
|
c ? (d.width = d.height = 0, d.style.width = d.style.height = 0, d.style.position = "absolute", d.style.top = "-9999px") : d.style.display = "none", d
|
|
},
|
|
append: function(a, b) {
|
|
return
|
|
b = b || document.body, a && a.nodeType && b.appendChild(a), this
|
|
},
|
|
html: function(a, b) {
|
|
return
|
|
a && a.nodeType && b && (a.innerHTML = b), this
|
|
},
|
|
appendHidden: function(a, b, c) {
|
|
var
|
|
d = this.createHidden(null, b, c);
|
|
return
|
|
this.html(d, a), this.append(d)
|
|
},
|
|
remove: function(a) {
|
|
return
|
|
a && a.nodeType && a.parentNode && a.parentNode.removeChild(a), this
|
|
},
|
|
hasClass: function(a, b) {
|
|
return ("
|
|
" + a.className + " ").indexOf(" " + b + " ") >= 0
|
|
},
|
|
addClass: function(a, b) {
|
|
return
|
|
b = QQWB.String.trim(b), QQWB.Array.isArray(a) ? (QQWB.Array.each(a, function(a, c) {
|
|
QQWB.dom.addClass(c, b)
|
|
}), this) : (QQWB.dom.hasClass(a, b) || (a.className = a.className + "
|
|
" + b), this)
|
|
},
|
|
removeClass: function(a, b) {
|
|
return
|
|
b = QQWB.String.trim(b), QQWB.Array.isArray(a) ? (QQWB.Array.each(a, function(a, c) {
|
|
QQWB.dom.removeClass(c, b)
|
|
}), this) : (QQWB.dom.hasClass(a, b) && (a.className = a.className.replace(b, ""), QQWB.dom.removeClass(a, b)), this)
|
|
}
|
|
}), QQWB.extend("queryString", {
|
|
encode: function(a, b, c, d) {
|
|
var
|
|
e = /%20/g,
|
|
f = b || "&",
|
|
g = c || encodeURIComponent,
|
|
h = [],
|
|
i = [],
|
|
j, k;
|
|
for (j in a) if (a.hasOwnProperty(j)) {
|
|
k = a[j];
|
|
if (k !== null && typeof
|
|
k != "undefined") {
|
|
j = g(j).replace(e, "+"), k = g(k).replace(e, "+");
|
|
if (!d) h.push(j + "=" + k);
|
|
else for (var l = 0, m = d.length; l < m; l++) d[l] === j && (h[l] = j + "=" + k)
|
|
}
|
|
}
|
|
for (var
|
|
n = 0, o = h.length; n < o; n++) typeof h[n] != "undefined" && i.push(h[n]);
|
|
return
|
|
h = i, i = null, h.join(f)
|
|
},
|
|
decode: function(a, b, c) {
|
|
var
|
|
d = c || decodeURIComponent,
|
|
e = b || "&",
|
|
f = a.split(e),
|
|
g = {},
|
|
h;
|
|
for (var
|
|
i = 0, j = f.length; i < j; i++) h = f[i].split("=", 2), h && h[0] && (g[d(h[0])] = d(h[1]));
|
|
return
|
|
g
|
|
}
|
|
}), function() {
|
|
function q(a, b, c, d, e, f) {
|
|
for (var g = 0, h = d.length; g < h; g++) {
|
|
var
|
|
i = d[g];
|
|
if (i) {
|
|
var
|
|
j = !1;
|
|
i = i[a];
|
|
while (i) {
|
|
if (i.sizcache === c) {
|
|
j = d[i.sizset];
|
|
break
|
|
}
|
|
i.nodeType === 1 && !f && (i.sizcache = c, i.sizset = g);
|
|
if (i.nodeName.toLowerCase() === b) {
|
|
j = i;
|
|
break
|
|
}
|
|
i = i[a]
|
|
}
|
|
d[g] = j
|
|
}
|
|
}
|
|
}
|
|
|
|
function
|
|
r(a, b, c, d, e, f) {
|
|
for (var g = 0, i = d.length; g < i; g++) {
|
|
var j = d[g];
|
|
if (j) {
|
|
var
|
|
k = !1;
|
|
j = j[a];
|
|
while (j) {
|
|
if (j.sizcache === c) {
|
|
k = d[j.sizset];
|
|
break
|
|
}
|
|
if (j.nodeType === 1) {
|
|
f || (j.sizcache = c, j.sizset = g);
|
|
if (typeof
|
|
b != "string") {
|
|
if (j === b) {
|
|
k = !0;
|
|
break
|
|
}
|
|
} else if (h.filter(b, [j]).length > 0) {
|
|
k = j;
|
|
break
|
|
}
|
|
}
|
|
j = j[a]
|
|
}
|
|
d[g] = k
|
|
}
|
|
}
|
|
}
|
|
var
|
|
a = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^
|
|
>+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
|
|
b = 0,
|
|
c = Object.prototype.toString,
|
|
d = !1,
|
|
e = !0,
|
|
f = /\\/g,
|
|
g = /\W/;
|
|
[0, 0].sort(function() {
|
|
return
|
|
e = !1, 0
|
|
});
|
|
var h = function(b, d, e, f) {
|
|
e = e || [], d = d || document;
|
|
var
|
|
g = d;
|
|
if (d.nodeType !== 1 && d.nodeType !== 9) return [];
|
|
if (!b || typeof
|
|
b != "string") return e;
|
|
var
|
|
k, l, n, o, p, q, r, t, u = !0,
|
|
v = h.isXML(d),
|
|
w = [],
|
|
x = b;
|
|
do {
|
|
a.exec(""), k = a.exec(x);
|
|
if (k) {
|
|
x = k[3], w.push(k[1]);
|
|
if (k[2]) {
|
|
o = k[3];
|
|
break
|
|
}
|
|
}
|
|
} while (k);
|
|
if (w.length > 1 && j.exec(b)) if (w.length === 2 && i.relative[w[0]]) l = s(w[0] + w[1], d);
|
|
else {
|
|
l = i.relative[w[0]] ? [d] : h(w.shift(), d);
|
|
while (w.length) b = w.shift(), i.relative[b] && (b += w.shift()), l = s(b, l)
|
|
} else {
|
|
!f && w.length > 1 && d.nodeType === 9 && !v && i.match.ID.test(w[0]) && !i.match.ID.test(w[w.length - 1]) && (p = h.find(w.shift(), d, v), d = p.expr ? h.filter(p.expr, p.set)[0] : p.set[0]);
|
|
if (d) {
|
|
p = f ? {
|
|
expr: w.pop(),
|
|
set: m(f)
|
|
} : h.find(w.pop(), w.length === 1 && (w[0] === "~" || w[0] === "+") && d.parentNode ? d.parentNode : d, v), l = p.expr ? h.filter(p.expr, p.set) : p.set, w.length > 0 ? n = m(l) : u = !1;
|
|
while (w.length) q = w.pop(), r = q, i.relative[q] ? r = w.pop() : q = "", r == null && (r = d), i.relative[q](n, r, v)
|
|
} else n = w = []
|
|
}
|
|
n || (n = l), n || h.error(q || b);
|
|
if (c.call(n) === "[object
|
|
Array]") if (!u) e.push.apply(e, n);
|
|
else if (d && d.nodeType === 1) for (t = 0; n[t] != null; t++) n[t] && (n[t] === !0 || n[t].nodeType === 1 && h.contains(d, n[t])) && e.push(l[t]);
|
|
else for (t = 0; n[t] != null; t++) n[t] && n[t].nodeType === 1 && e.push(l[t]);
|
|
else m(n, e);
|
|
return
|
|
o && (h(o, g, e, f), h.uniqueSort(e)), e
|
|
};
|
|
h.uniqueSort = function(a) {
|
|
if (o) {
|
|
d = e, a.sort(o);
|
|
if (d) for (var
|
|
b = 1; b < a.length; b++) a[b] === a[b - 1] && a.splice(b--, 1)
|
|
}
|
|
return
|
|
a
|
|
}, h.matches = function(a, b) {
|
|
return
|
|
h(a, null, null, b)
|
|
}, h.matchesSelector = function(a, b) {
|
|
return
|
|
h(b, null, null, [a]).length > 0
|
|
}, h.find = function(a, b, c) {
|
|
var
|
|
d;
|
|
if (!a) return [];
|
|
for (var e = 0, g = i.order.length; e < g; e++) {
|
|
var
|
|
h, j = i.order[e];
|
|
if (h = i.leftMatch[j].exec(a)) {
|
|
var
|
|
k = h[1];
|
|
h.splice(1, 1);
|
|
if (k.substr(k.length - 1) !== "\\") {
|
|
h[1] = (h[1] || "").replace(f, ""), d = i.find[j](h, b, c);
|
|
if (d != null) {
|
|
a = a.replace(i.match[j], "");
|
|
break
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return
|
|
d || (d = typeof
|
|
b.getElementsByTagName != "undefined" ? b.getElementsByTagName("*") : []), {
|
|
set: d,
|
|
expr: a
|
|
}
|
|
}, h.filter = function(a, b, c, d) {
|
|
var
|
|
e, f, g = a,
|
|
j = [],
|
|
k = b,
|
|
l = b && b[0] && h.isXML(b[0]);
|
|
while (a && b.length) {
|
|
for (var
|
|
m in i.filter) if ((e = i.leftMatch[m].exec(a)) != null && e[2]) {
|
|
var
|
|
n, o, p = i.filter[m],
|
|
q = e[1];
|
|
f = !1, e.splice(1, 1);
|
|
if (q.substr(q.length - 1) === "\\") continue;
|
|
k === j && (j = []);
|
|
if (i.preFilter[m]) {
|
|
e = i.preFilter[m](e, k, c, j, d, l);
|
|
if (!e) f = n = !0;
|
|
else if (e === !0) continue
|
|
}
|
|
if (e) for (var
|
|
r = 0;
|
|
(o = k[r]) != null; r++) if (o) {
|
|
n = p(o, e, r, k);
|
|
var
|
|
s = d ^ !! n;
|
|
c && n != null ? s ? f = !0 : k[r] = !1 : s && (j.push(o), f = !0)
|
|
}
|
|
if (n !== undefined) {
|
|
c || (k = j), a = a.replace(i.match[m], "");
|
|
if (!f) return [];
|
|
break
|
|
}
|
|
}
|
|
if (a === g) if (f == null) h.error(a);
|
|
else break;
|
|
g = a
|
|
}
|
|
return k
|
|
}, h.error = function(a) {
|
|
throw "Syntax error,
|
|
unrecognized expression: " + a
|
|
};
|
|
var
|
|
i = h.selectors = {
|
|
order: ["ID", "NAME", "TAG"],
|
|
match: {
|
|
ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
|
|
CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
|
|
NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
|
|
ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
|
|
TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
|
|
CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
|
|
POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
|
|
PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
|
|
},
|
|
leftMatch: {},
|
|
attrMap: {
|
|
"class": "className",
|
|
"for": "htmlFor"
|
|
},
|
|
attrHandle: {
|
|
href: function(a) {
|
|
return
|
|
a.getAttribute("href")
|
|
},
|
|
type: function(a) {
|
|
return
|
|
a.getAttribute("type")
|
|
}
|
|
},
|
|
relative: {
|
|
"+": function(a, b) {
|
|
var c = typeof
|
|
b == "string",
|
|
d = c && !g.test(b),
|
|
e = c && !d;
|
|
d && (b = b.toLowerCase());
|
|
for (var
|
|
f = 0, i = a.length, j; f < i; f++) if (j = a[f]) {
|
|
while ((j = j.previousSibling) && j.nodeType !== 1);
|
|
a[f] = e || j && j.nodeName.toLowerCase() === b ? j || !1 : j === b
|
|
}
|
|
e && h.filter(b, a, !0)
|
|
},
|
|
">": function(a, b) {
|
|
var
|
|
c, d = typeof
|
|
b == "string",
|
|
e = 0,
|
|
f = a.length;
|
|
if (d && !g.test(b)) {
|
|
b = b.toLowerCase();
|
|
for (; e < f; e++) {
|
|
c = a[e];
|
|
if (c) {
|
|
var
|
|
i = c.parentNode;
|
|
a[e] = i.nodeName.toLowerCase() === b ? i : !1
|
|
}
|
|
}
|
|
} else {
|
|
for (; e < f; e++) c = a[e], c && (a[e] = d ? c.parentNode : c.parentNode === b);
|
|
d && h.filter(b, a, !0)
|
|
}
|
|
},
|
|
"": function(a, c, d) {
|
|
var
|
|
e, f = b++,
|
|
h = r;
|
|
typeof
|
|
c == "string" && !g.test(c) && (c = c.toLowerCase(), e = c, h = q), h("parentNode", c, f, a, e, d)
|
|
},
|
|
"~": function(a, c, d) {
|
|
var
|
|
e, f = b++,
|
|
h = r;
|
|
typeof
|
|
c == "string" && !g.test(c) && (c = c.toLowerCase(), e = c, h = q), h("previousSibling", c, f, a, e, d)
|
|
}
|
|
},
|
|
find: {
|
|
ID: function(a, b, c) {
|
|
if (typeof
|
|
b.getElementById != "undefined" && !c) {
|
|
var
|
|
d = b.getElementById(a[1]);
|
|
return
|
|
d && d.parentNode ? [d] : []
|
|
}
|
|
},
|
|
NAME: function(a, b) {
|
|
if (typeof
|
|
b.getElementsByName != "undefined") {
|
|
var
|
|
c = [],
|
|
d = b.getElementsByName(a[1]);
|
|
for (var
|
|
e = 0, f = d.length; e < f; e++) d[e].getAttribute("name") === a[1] && c.push(d[e]);
|
|
return
|
|
c.length === 0 ? null : c
|
|
}
|
|
},
|
|
TAG: function(a, b) {
|
|
if (typeof
|
|
b.getElementsByTagName != "undefined") return
|
|
b.getElementsByTagName(a[1])
|
|
}
|
|
},
|
|
preFilter: {
|
|
CLASS: function(a, b, c, d, e, g) {
|
|
a = "
|
|
" + a[1].replace(f, "") + " ";
|
|
if (g) return a;
|
|
for (var
|
|
h = 0, i;
|
|
(i = b[h]) != null; h++) i && (e ^ (i.className && (" " + i.className + "
|
|
").replace(/[\t\n\r]/g, "
|
|
").indexOf(a) >= 0) ? c || d.push(i) : c && (b[h] = !1));
|
|
return !1
|
|
},
|
|
ID: function(a) {
|
|
return
|
|
a[1].replace(f, "")
|
|
},
|
|
TAG: function(a, b) {
|
|
return
|
|
a[1].replace(f, "").toLowerCase()
|
|
},
|
|
CHILD: function(a) {
|
|
if (a[1] === "nth") {
|
|
a[2] || h.error(a[0]), a[2] = a[2].replace(/^\+|\s*/g, "");
|
|
var
|
|
c = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2] === "even" && "2n" || a[2] === "odd" && "2n+1" || !/\D/.test(a[2]) && "0n+" + a[2] || a[2]);
|
|
a[2] = c[1] + (c[2] || 1) - 0, a[3] = c[3] - 0
|
|
} else a[2] && h.error(a[0]);
|
|
return
|
|
a[0] = b++, a
|
|
},
|
|
ATTR: function(a, b, c, d, e, g) {
|
|
var
|
|
h = a[1] = a[1].replace(f, "");
|
|
return !g && i.attrMap[h] && (a[1] = i.attrMap[h]), a[4] = (a[4] || a[5] || "").replace(f, ""), a[2] === "~=" && (a[4] = "
|
|
" + a[4] + "
|
|
"), a
|
|
},
|
|
PSEUDO: function(b, c, d, e, f) {
|
|
if (b[1] === "not") if ((a.exec(b[3]) || "").length > 1 || /^\w/.test(b[3])) b[3] = h(b[3], null, null, c);
|
|
else {
|
|
var
|
|
g = h.filter(b[3], c, d, !0 ^ f);
|
|
return d || e.push.apply(e, g), !1
|
|
} else if (i.match.POS.test(b[0]) || i.match.CHILD.test(b[0])) return !0;
|
|
return
|
|
b
|
|
},
|
|
POS: function(a) {
|
|
return
|
|
a.unshift(!0), a
|
|
}
|
|
},
|
|
filters: {
|
|
enabled: function(a) {
|
|
return
|
|
a.disabled === !1 && a.type !== "hidden"
|
|
},
|
|
disabled: function(a) {
|
|
return
|
|
a.disabled === !0
|
|
},
|
|
checked: function(a) {
|
|
return
|
|
a.checked === !0
|
|
},
|
|
selected: function(a) {
|
|
return
|
|
a.parentNode && a.parentNode.selectedIndex, a.selected === !0
|
|
},
|
|
parent: function(a) {
|
|
return !!a.firstChild
|
|
},
|
|
empty: function(a) {
|
|
return !a.firstChild
|
|
},
|
|
has: function(a, b, c) {
|
|
return !!h(c[3], a).length
|
|
},
|
|
header: function(a) {
|
|
return /h\d/i.test(a.nodeName)
|
|
},
|
|
text: function(a) {
|
|
var
|
|
b = a.getAttribute("type"),
|
|
c = a.type;
|
|
return
|
|
a.nodeName.toLowerCase() === "input" && "text" === c && (b === c || b === null)
|
|
},
|
|
radio: function(a) {
|
|
return
|
|
a.nodeName.toLowerCase() === "input" && "radio" === a.type
|
|
},
|
|
checkbox: function(a) {
|
|
return
|
|
a.nodeName.toLowerCase() === "input" && "checkbox" === a.type
|
|
},
|
|
file: function(a) {
|
|
return
|
|
a.nodeName.toLowerCase() === "input" && "file" === a.type
|
|
},
|
|
password: function(a) {
|
|
return
|
|
a.nodeName.toLowerCase() === "input" && "password" === a.type
|
|
},
|
|
submit: function(a) {
|
|
var
|
|
b = a.nodeName.toLowerCase();
|
|
return (b === "input" || b === "button") && "submit" === a.type
|
|
},
|
|
image: function(a) {
|
|
return
|
|
a.nodeName.toLowerCase() === "input" && "image" === a.type
|
|
},
|
|
reset: function(a) {
|
|
var
|
|
b = a.nodeName.toLowerCase();
|
|
return (b === "input" || b === "button") && "reset" === a.type
|
|
},
|
|
button: function(a) {
|
|
var
|
|
b = a.nodeName.toLowerCase();
|
|
return
|
|
b === "input" && "button" === a.type || b === "button"
|
|
},
|
|
input: function(a) {
|
|
return /input|select|textarea|button/i.test(a.nodeName)
|
|
},
|
|
focus: function(a) {
|
|
return
|
|
a === a.ownerDocument.activeElement
|
|
}
|
|
},
|
|
setFilters: {
|
|
first: function(a, b) {
|
|
return
|
|
b === 0
|
|
},
|
|
last: function(a, b, c, d) {
|
|
return
|
|
b === d.length - 1
|
|
},
|
|
even: function(a, b) {
|
|
return
|
|
b % 2 === 0
|
|
},
|
|
odd: function(a, b) {
|
|
return
|
|
b % 2 === 1
|
|
},
|
|
lt: function(a, b, c) {
|
|
return
|
|
b < c[3] - 0
|
|
},
|
|
gt: function(a, b, c) {
|
|
return
|
|
b > c[3] - 0
|
|
},
|
|
nth: function(a, b, c) {
|
|
return
|
|
c[3] - 0 === b
|
|
},
|
|
eq: function(a, b, c) {
|
|
return
|
|
c[3] - 0 === b
|
|
}
|
|
},
|
|
filter: {
|
|
PSEUDO: function(a, b, c, d) {
|
|
var
|
|
e = b[1],
|
|
f = i.filters[e];
|
|
if (f) return
|
|
f(a, c, b, d);
|
|
if (e === "contains") return (a.textContent || a.innerText || h.getText([a]) || "").indexOf(b[3]) >= 0;
|
|
if (e === "not") {
|
|
var
|
|
g = b[3];
|
|
for (var
|
|
j = 0, k = g.length; j < k; j++) if (g[j] === a) return !1;
|
|
return !0
|
|
}
|
|
h.error(e)
|
|
},
|
|
CHILD: function(a, b) {
|
|
var
|
|
c = b[1],
|
|
d = a;
|
|
switch (c) {
|
|
case "only":
|
|
case "first":
|
|
while (d = d.previousSibling) if (d.nodeType === 1) return !1;
|
|
if (c === "first") return !0;
|
|
d = a;
|
|
case "last":
|
|
while (d = d.nextSibling) if (d.nodeType === 1) return !1;
|
|
return !0;
|
|
case "nth":
|
|
var
|
|
e = b[2],
|
|
f = b[3];
|
|
if (e === 1 && f === 0) return !0;
|
|
var
|
|
g = b[0],
|
|
h = a.parentNode;
|
|
if (h && (h.sizcache !== g || !a.nodeIndex)) {
|
|
var
|
|
i = 0;
|
|
for (d = h.firstChild; d; d = d.nextSibling) d.nodeType === 1 && (d.nodeIndex = ++i);
|
|
h.sizcache = g
|
|
}
|
|
var
|
|
j = a.nodeIndex - f;
|
|
return
|
|
e === 0 ? j === 0 : j % e === 0 && j / e >= 0
|
|
}
|
|
},
|
|
ID: function(a, b) {
|
|
return
|
|
a.nodeType === 1 && a.getAttribute("id") === b
|
|
},
|
|
TAG: function(a, b) {
|
|
return
|
|
b === "*" && a.nodeType === 1 || a.nodeName.toLowerCase() === b
|
|
},
|
|
CLASS: function(a, b) {
|
|
return ("
|
|
" + (a.className || a.getAttribute("class")) + "
|
|
").indexOf(b) > -1
|
|
},
|
|
ATTR: function(a, b) {
|
|
var
|
|
c = b[1],
|
|
d = i.attrHandle[c] ? i.attrHandle[c](a) : a[c] != null ? a[c] : a.getAttribute(c),
|
|
e = d + "",
|
|
f = b[2],
|
|
g = b[4];
|
|
return
|
|
d == null ? f === "!=" : f === "=" ? e === g : f === "*=" ? e.indexOf(g) >= 0 : f === "~=" ? ("
|
|
" + e + "
|
|
").indexOf(g) >= 0 : g ? f === "!=" ? e !== g : f === "^=" ? e.indexOf(g) === 0 : f === "$=" ? e.substr(e.length - g.length) === g : f === "|=" ? e === g || e.substr(0, g.length + 1) === g + "-" : !1 : e && d !== !1
|
|
},
|
|
POS: function(a, b, c, d) {
|
|
var
|
|
e = b[2],
|
|
f = i.setFilters[e];
|
|
if (f) return
|
|
f(a, c, b, d)
|
|
}
|
|
}
|
|
},
|
|
j = i.match.POS,
|
|
k = function(a, b) {
|
|
return "\\" + (b - 0 + 1)
|
|
};
|
|
for (var
|
|
l in i.match) i.match[l] = new
|
|
RegExp(i.match[l].source + /(?![^\[]*\])(?![^\(]*\))/.source), i.leftMatch[l] = new
|
|
RegExp(/(^(?:.|\r|\n)*?)/.source + i.match[l].source.replace(/\\(\d+)/g, k));
|
|
var
|
|
m = function(a, b) {
|
|
return
|
|
a = Array.prototype.slice.call(a, 0), b ? (b.push.apply(b, a), b) : a
|
|
};
|
|
try {
|
|
Array.prototype.slice.call(document.documentElement.childNodes, 0)[0].nodeType
|
|
} catch (n) {
|
|
m = function(a, b) {
|
|
var
|
|
d = 0,
|
|
e = b || [];
|
|
if (c.call(a) === "[object
|
|
Array]") Array.prototype.push.apply(e, a);
|
|
else if (typeof
|
|
a.length == "number") for (var f = a.length; d < f; d++) e.push(a[d]);
|
|
else for (; a[d]; d++) e.push(a[d]);
|
|
return e
|
|
}
|
|
}
|
|
var
|
|
o, p;
|
|
document.documentElement.compareDocumentPosition ? o = function(a, b) {
|
|
return
|
|
a === b ? (d = !0, 0) : !a.compareDocumentPosition || !b.compareDocumentPosition ? a.compareDocumentPosition ? -1 : 1 : a.compareDocumentPosition(b) & 4 ? -1 : 1
|
|
} : (o = function(a, b) {
|
|
if (a === b) return
|
|
d = !0, 0;
|
|
if (a.sourceIndex && b.sourceIndex) return
|
|
a.sourceIndex - b.sourceIndex;
|
|
var
|
|
c, e, f = [],
|
|
g = [],
|
|
h = a.parentNode,
|
|
i = b.parentNode,
|
|
j = h;
|
|
if (h === i) return
|
|
p(a, b);
|
|
if (!h) return -1;
|
|
if (!i) return
|
|
1;
|
|
while (j) f.unshift(j), j = j.parentNode;
|
|
j = i;
|
|
while (j) g.unshift(j), j = j.parentNode;
|
|
c = f.length, e = g.length;
|
|
for (var
|
|
k = 0; k < c && k < e; k++) if (f[k] !== g[k]) return p(f[k], g[k]);
|
|
return
|
|
k === c ? p(a, g[k], -1) : p(f[k], b, 1)
|
|
}, p = function(a, b, c) {
|
|
if (a === b) return
|
|
c;
|
|
var
|
|
d = a.nextSibling;
|
|
while (d) {
|
|
if (d === b) return -1;
|
|
d = d.nextSibling
|
|
}
|
|
return
|
|
1
|
|
}), h.getText = function(a) {
|
|
var b = "",
|
|
c;
|
|
for (var
|
|
d = 0; a[d]; d++) c = a[d], c.nodeType === 3 || c.nodeType === 4 ? b += c.nodeValue : c.nodeType !== 8 && (b += h.getText(c.childNodes));
|
|
return
|
|
b
|
|
}, function() {
|
|
var
|
|
a = document.createElement("div"),
|
|
b = "script" + (new
|
|
Date).getTime(),
|
|
c = document.documentElement;
|
|
a.innerHTML = "<a
|
|
name='" + b + "'/>", c.insertBefore(a, c.firstChild), document.getElementById(b) && (i.find.ID = function(a, b, c) {
|
|
if (typeof
|
|
b.getElementById != "undefined" && !c) {
|
|
var
|
|
d = b.getElementById(a[1]);
|
|
return d ? d.id === a[1] || typeof
|
|
d.getAttributeNode != "undefined" && d.getAttributeNode("id").nodeValue === a[1] ? [d] : undefined : []
|
|
}
|
|
}, i.filter.ID = function(a, b) {
|
|
var
|
|
c = typeof
|
|
a.getAttributeNode != "undefined" && a.getAttributeNode("id");
|
|
return
|
|
a.nodeType === 1 && c && c.nodeValue === b
|
|
}), c.removeChild(a), c = a = null
|
|
}(), function() {
|
|
var
|
|
a = document.createElement("div");
|
|
a.appendChild(document.createComment("")), a.getElementsByTagName("*").length > 0 && (i.find.TAG = function(a, b) {
|
|
var
|
|
c = b.getElementsByTagName(a[1]);
|
|
if (a[1] === "*") {
|
|
var d = [];
|
|
for (var
|
|
e = 0; c[e]; e++) c[e].nodeType === 1 && d.push(c[e]);
|
|
c = d
|
|
}
|
|
return
|
|
c
|
|
}), a.innerHTML = "<a href='#'></a>", a.firstChild && typeof
|
|
a.firstChild.getAttribute != "undefined" && a.firstChild.getAttribute("href") !== "#" && (i.attrHandle.href = function(a) {
|
|
return
|
|
a.getAttribute("href", 2)
|
|
}), a = null
|
|
}(), document.querySelectorAll &&
|
|
function() {
|
|
var
|
|
a = h,
|
|
b = document.createElement("div"),
|
|
c = "__sizzle__";
|
|
b.innerHTML = "<p
|
|
class='TEST'></p>";
|
|
if (b.querySelectorAll && b.querySelectorAll(".TEST").length === 0) return;
|
|
h = function(b, d, e, f) {
|
|
d = d || document;
|
|
if (!f && !h.isXML(d)) {
|
|
var
|
|
g = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);
|
|
if (g && (d.nodeType === 1 || d.nodeType === 9)) {
|
|
if (g[1]) return
|
|
m(d.getElementsByTagName(b), e);
|
|
if (g[2] && i.find.CLASS && d.getElementsByClassName) return
|
|
m(d.getElementsByClassName(g[2]), e)
|
|
}
|
|
if (d.nodeType === 9) {
|
|
if (b === "body" && d.body) return
|
|
m([d.body], e);
|
|
if (g && g[3]) {
|
|
var
|
|
j = d.getElementById(g[3]);
|
|
if (!j || !j.parentNode) return
|
|
m([], e);
|
|
if (j.id === g[3]) return m([j], e)
|
|
}
|
|
try {
|
|
return
|
|
m(d.querySelectorAll(b), e)
|
|
} catch (k) {}
|
|
} else if (d.nodeType === 1 && d.nodeName.toLowerCase() !== "object") {
|
|
var
|
|
l = d,
|
|
n = d.getAttribute("id"),
|
|
o = n || c,
|
|
p = d.parentNode,
|
|
q = /^\s*[+~]/.test(b);
|
|
n ? o = o.replace(/'/g, "\\$&") : d.setAttribute("id", o), q && p && (d = d.parentNode);
|
|
try {
|
|
if (!q || p) return
|
|
m(d.querySelectorAll("[id='" + o + "']
|
|
" + b), e)
|
|
} catch (r) {} finally {
|
|
n || l.removeAttribute("id")
|
|
}
|
|
}
|
|
}
|
|
return
|
|
a(b, d, e, f)
|
|
};
|
|
for (var d in a) h[d] = a[d];
|
|
b = null
|
|
}(), function() {
|
|
var
|
|
a = document.documentElement,
|
|
b = a.matchesSelector || a.mozMatchesSelector || a.webkitMatchesSelector || a.msMatchesSelector;
|
|
if (b) {
|
|
var
|
|
c = !b.call(document.createElement("div"), "div"),
|
|
d = !1;
|
|
try {
|
|
b.call(document.documentElement, "[test!='']:sizzle")
|
|
} catch (e) {
|
|
d = !0
|
|
}
|
|
h.matchesSelector = function(a, e) {
|
|
e = e.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
|
|
if (!h.isXML(a)) try {
|
|
if (d || !i.match.PSEUDO.test(e) && !/!=/.test(e)) {
|
|
var
|
|
f = b.call(a, e);
|
|
if (f || !c || a.document && a.document.nodeType !== 11) return
|
|
f
|
|
}
|
|
} catch (g) {}
|
|
return
|
|
h(e, null, null, [a]).length > 0
|
|
}
|
|
}
|
|
}(), function() {
|
|
var
|
|
a = document.createElement("div");
|
|
a.innerHTML = "<div class='test
|
|
e'></div><div
|
|
class='test'></div>";
|
|
if (!a.getElementsByClassName || a.getElementsByClassName("e").length === 0) return;
|
|
a.lastChild.className = "e";
|
|
if (a.getElementsByClassName("e").length === 1) return;
|
|
i.order.splice(1, 0, "CLASS"), i.find.CLASS = function(a, b, c) {
|
|
if (typeof
|
|
b.getElementsByClassName != "undefined" && !c) return
|
|
b.getElementsByClassName(a[1])
|
|
}, a = null
|
|
}(), document.documentElement.contains ? h.contains = function(a, b) {
|
|
return
|
|
a !== b && (a.contains ? a.contains(b) : !0)
|
|
} : document.documentElement.compareDocumentPosition ? h.contains = function(a, b) {
|
|
return !!(a.compareDocumentPosition(b) & 16)
|
|
} : h.contains = function() {
|
|
return !1
|
|
}, h.isXML = function(a) {
|
|
var
|
|
b = (a ? a.ownerDocument || a : 0).documentElement;
|
|
return
|
|
b ? b.nodeName !== "HTML" : !1
|
|
};
|
|
var s = function(a, b) {
|
|
var
|
|
c, d = [],
|
|
e = "",
|
|
f = b.nodeType ? [b] : b;
|
|
while (c = i.match.PSEUDO.exec(a)) e += c[0], a = a.replace(i.match.PSEUDO, "");
|
|
a = i.relative[a] ? a + "*" : a;
|
|
for (var
|
|
g = 0, j = f.length; g < j; g++) h(a, f[g], d);
|
|
return
|
|
h.filter(e, d)
|
|
},
|
|
t = window.Sizzle;
|
|
h.noConflict = function() {
|
|
window.Sizzle = t
|
|
}, window.Sizzle = h
|
|
}(), function() {
|
|
function
|
|
b(b) {
|
|
var c;
|
|
if (!QQWB.Array.isArray(this)) return
|
|
this;
|
|
c = [];
|
|
for (var
|
|
d = 0, e = this.length; d < e; d++) c = c.concat(a(b, this[d]));
|
|
return
|
|
c
|
|
}
|
|
|
|
function c(b) {
|
|
return typeof
|
|
b != "string" ? this : b.length <= 0 ? this : a.matches(":contains(" + b + ")", this)
|
|
}
|
|
|
|
function
|
|
d(b) {
|
|
return a.matches(b, this)
|
|
}
|
|
|
|
function e(b) {
|
|
return
|
|
a.matches(":not(" + b + ")", this)
|
|
}
|
|
|
|
function f(a) {
|
|
return
|
|
QQWB.Array.get(this, a)
|
|
}
|
|
|
|
function
|
|
g(a) {
|
|
if (!QQWB.Array.isArray(this) || !a) return this;
|
|
for (var
|
|
b = 0, c = this.length; b < c; b++) if (a(this[b]) === !1) break;
|
|
return
|
|
this
|
|
}
|
|
|
|
function h(a) {
|
|
return !a.find && (a.find = function(c) {
|
|
return
|
|
h(b.call(a, c))
|
|
}), !a.contains && (a.contains = function(b) {
|
|
return
|
|
h(c.call(a, b))
|
|
}), !a.keep && (a.keep = function(b) {
|
|
return
|
|
h(d.call(a, b))
|
|
}), !a.tear && (a.tear = function(b) {
|
|
return
|
|
h(e.call(a, b))
|
|
}), !a.get && (a.get = function(b) {
|
|
return
|
|
f.call(a, b)
|
|
}), !a.each && (a.each = function(b) {
|
|
return
|
|
g.call(a, b)
|
|
}), a
|
|
}
|
|
var
|
|
a = window.Sizzle;
|
|
a.noConflict(), QQWB.provide("dom.find", function(b, c) {
|
|
return
|
|
h(a(b, c))
|
|
}), QQWB._alias("find", QQWB.dom.find)
|
|
}(), function() {
|
|
var
|
|
a = function() {
|
|
function b(a) {
|
|
return
|
|
Object.prototype.toString.call(a).slice(8, -1).toLowerCase()
|
|
}
|
|
|
|
function
|
|
c(a, b) {
|
|
for (var c = []; b > 0; c[--b] = a);
|
|
return c.join("")
|
|
}
|
|
var
|
|
d = function() {
|
|
return
|
|
d.cache.hasOwnProperty(arguments[0]) || (d.cache[arguments[0]] = d.parse(arguments[0])), d.format.call(null, d.cache[arguments[0]], arguments)
|
|
};
|
|
return
|
|
d.format = function(d, e) {
|
|
var
|
|
f = 1,
|
|
g = d.length,
|
|
h = "",
|
|
i, j = [],
|
|
k, l, m, n, o, p;
|
|
for (k = 0; k < g; k++) {
|
|
h = b(d[k]);
|
|
if (h === "string") j.push(d[k]);
|
|
else if (h === "array") {
|
|
m = d[k];
|
|
if (m[2]) {
|
|
i = e[f];
|
|
for (l = 0; l < m[2].length; l++) {
|
|
if (!i.hasOwnProperty(m[2][l])) throw
|
|
a('[sprintf] property "%s" does not
|
|
exist', m[2][l]);
|
|
i = i[m[2][l]]
|
|
}
|
|
} else m[1] ? i = e[m[1]] : i = e[f++];
|
|
if (/[^s]/.test(m[8]) && b(i) != "number") throw
|
|
a("[sprintf] expecting number but found
|
|
%s", b(i));
|
|
switch (m[8]) {
|
|
case "b":
|
|
i = i.toString(2);
|
|
break;
|
|
case "c":
|
|
i = String.fromCharCode(i);
|
|
break;
|
|
case "d":
|
|
i = parseInt(i, 10);
|
|
break;
|
|
case "e":
|
|
i = m[7] ? i.toExponential(m[7]) : i.toExponential();
|
|
break;
|
|
case "f":
|
|
i = m[7] ? parseFloat(i).toFixed(m[7]) : parseFloat(i);
|
|
break;
|
|
case "o":
|
|
i = i.toString(8);
|
|
break;
|
|
case "s":
|
|
i = (i = i ? String(i) : "") && m[7] ? i.substring(0, m[7]) : i;
|
|
break;
|
|
case "u":
|
|
i = Math.abs(i);
|
|
break;
|
|
case "x":
|
|
i = i.toString(16);
|
|
break;
|
|
case "X":
|
|
i = i.toString(16).toUpperCase()
|
|
}
|
|
i = /[def]/.test(m[8]) && m[3] && i >= 0 ? "+" + i : i, o = m[4] ? m[4] == "0" ? "0" : m[4].charAt(1) : "
|
|
", p = m[6] - String(i).length, n = m[6] ? c(o, p) : "", j.push(m[5] ? i + n : n + i)
|
|
}
|
|
}
|
|
return
|
|
j.join("")
|
|
}, d.cache = {}, d.parse = function(a) {
|
|
var
|
|
b = a,
|
|
c = [],
|
|
d = [],
|
|
e = 0;
|
|
while (b) {
|
|
if ((c = /^[^\x25]+/.exec(b)) !== null) d.push(c[0]);
|
|
else if ((c = /^\x25{2}/.exec(b)) !== null) d.push("%");
|
|
else {
|
|
if ((c = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(b)) === null) throw "[sprintf]
|
|
huh?";
|
|
if (c[2]) {
|
|
e |= 1;
|
|
var
|
|
f = [],
|
|
g = c[2],
|
|
h = [];
|
|
if ((h = /^([a-z_][a-z_\d]*)/i.exec(g)) === null) throw "[sprintf]
|
|
huh?";
|
|
f.push(h[1]);
|
|
while ((g = g.substring(h[0].length)) !== "") if ((h = /^\.([a-z_][a-z_\d]*)/i.exec(g)) !== null) f.push(h[1]);
|
|
else if ((h = /^\[(\d+)\]/.exec(g)) !== null) f.push(h[1]);
|
|
else throw "[sprintf] huh?";
|
|
c[2] = f
|
|
} else e |= 2;
|
|
if (e === 3) throw "[sprintf] mixing positional and
|
|
named placeholders is not (yet)
|
|
supported";
|
|
d.push(c)
|
|
}
|
|
b = b.substring(c[0].length)
|
|
}
|
|
return
|
|
d
|
|
}, d
|
|
}(),
|
|
b = function(b, c) {
|
|
return
|
|
c.unshift(b), a.apply(null, c)
|
|
};
|
|
QQWB.extend("String.format", {
|
|
sprintf: a,
|
|
vsprintf: b
|
|
}), QQWB._alias("format", QQWB.String.format)
|
|
}(), QQWB.extend("time", {
|
|
now: function() {
|
|
return +this.dateNow()
|
|
},
|
|
secondsNow: function() {
|
|
return
|
|
Math.round(this.now() / 1e3)
|
|
},
|
|
dateNow: function() {
|
|
return
|
|
new Date
|
|
},
|
|
shortTime: function(a, b) {
|
|
return a instanceof
|
|
Date || (b = a, a = this.dateNow()), b = b || "%(year)s/%(month)s/%(day)s
|
|
%(hour)02d:%(minute)02d:%(second)02d", QQWB.format.sprintf(b, {
|
|
year: a.getFullYear(),
|
|
month: a.getMonth(),
|
|
day: a.getDate(),
|
|
hour: a.getHours(),
|
|
minute: a.getMinutes(),
|
|
second: a.getSeconds()
|
|
})
|
|
}
|
|
}), QQWB.extend("log", {
|
|
CRITICAL: 50,
|
|
ERROR: 40,
|
|
WARNING: 30,
|
|
INFO: 20,
|
|
DEBUG: 10,
|
|
NOTSET: 0,
|
|
_level: 0,
|
|
_format: "%(source)s%(popup)s%(frame)s%(name)s:
|
|
[%(levelname)s] %(time)s
|
|
%(message)s",
|
|
setLevel: function(a) {
|
|
return
|
|
this._level = a, this
|
|
},
|
|
setFormat: function(a) {
|
|
return
|
|
this._format = a, this
|
|
},
|
|
debug: function(a) {
|
|
return
|
|
this.DEBUG >= this._level && this._out("DEBUG", a), this
|
|
},
|
|
info: function(a) {
|
|
return
|
|
this.INFO >= this._level && this._out("INFO", a), this
|
|
},
|
|
warning: function(a) {
|
|
return
|
|
this.WARNING >= this._level && this._out("WARNING", a), this
|
|
},
|
|
error: function(a) {
|
|
return
|
|
this.ERROR >= this._level && this._out("ERROR", a), this
|
|
},
|
|
critical: function(a) {
|
|
return
|
|
this.CRITICAL >= this._level && this._out("CRITICAL", a), this
|
|
},
|
|
_out: function(a, b) {
|
|
var
|
|
c = this._format;
|
|
c = QQWB.format.sprintf(c, {
|
|
name: QQWB.name,
|
|
levelname: a,
|
|
time: QQWB.time.shortTime(),
|
|
message: b,
|
|
frame: window != window.parent ? "*" : "",
|
|
source: window.name ? window.name : "",
|
|
popup: window.opener || window.name === QQWB._const.AUTH_WINDOW_NAME ? "#" : ""
|
|
}), this._capture && typeof
|
|
this._captureLevel == "number" && this[a] > this._captureLevel && this._capturedMessages && (this._capturedMessages.length >= this._captureMaxSize && this._capturedMessages.shift(), this._capturedMessages.push(c)), QQWB.debug && window.console && window.console.log(c)
|
|
},
|
|
startCapture: function(a, b) {
|
|
return
|
|
this._captureLevel = a || this.NOTSET, this._captureMaxSize = b || 50, this._capturedMessages = [], this._capture = !0, this
|
|
},
|
|
stopCapture: function() {
|
|
return
|
|
this._capture && (this._capture = !1), this
|
|
},
|
|
lastCaptured: function(a) {
|
|
return
|
|
a = a || "\n", this._capturedMessages ? this._capturedMessages.join(a) : ""
|
|
}
|
|
}), QQWB.extend("cookie", {
|
|
set: function(a, b, c, d, e, f) {
|
|
f = f || escape;
|
|
if (typeof
|
|
c == "undefined" || c === null) c = -1;
|
|
var
|
|
g = e ? "domain=" + e : "",
|
|
h = d ? "path=" + d : "",
|
|
i = "";
|
|
return
|
|
c === 0 ? i = "expires=" + (new
|
|
Date(1970, 1, 1)).toUTCString() : c > 0 && (i = "expires=" + (new
|
|
Date(+(new
|
|
Date) + c * 1e3)).toUTCString()), document.cookie = [a + "=" + f(b), i, h, g].join(";
|
|
"), this
|
|
},
|
|
get: function(a, b, c) {
|
|
b = b || unescape;
|
|
var
|
|
d = a + "=";
|
|
cookies = (document.cookie || "").split(/\s*;\s*/);
|
|
for (var
|
|
e = 0, f = cookies.length; e < f; e++) {
|
|
var
|
|
g = cookies[e];
|
|
if (g.indexOf(d) === 0) return
|
|
b(g.substr(d.length))
|
|
}
|
|
return
|
|
c
|
|
},
|
|
del: function(a, b, c) {
|
|
return
|
|
this.set(a, "", 0, b, c), document.cookie.indexOf(a + "=") >= 0 && QQWB.log.warning("Cookie
|
|
may not be deleted as you
|
|
expected"), this
|
|
}
|
|
}), QQWB.extend("XML", {
|
|
isXML: function(a) {},
|
|
toString: function(a) {
|
|
return
|
|
this.stringify(a)
|
|
},
|
|
stringify: function(a) {
|
|
var b;
|
|
return
|
|
window.ActiveXObject ? b = a.xml : b = (new
|
|
XMLSerializer).serializeToString(a), b
|
|
},
|
|
fromString: function(a) {
|
|
var
|
|
b;
|
|
if (window.ActiveXObject) b = new
|
|
ActiveXObject("Microsoft.XMLDOM"), b.async = "false", b.loadXML(a);
|
|
else {
|
|
var
|
|
c = new
|
|
DOMParser;
|
|
b = c.parseFromString(a, "text/xml")
|
|
}
|
|
return
|
|
b
|
|
}
|
|
}, !0), QQWB.extend("Function", {
|
|
isFunction: function(a) {
|
|
return
|
|
typeof
|
|
a == "function"
|
|
}
|
|
}), QQWB.extend("deferred", {
|
|
_promiseMethods: "done
|
|
fail isResolved isRejected promise then always success
|
|
error complete whatever".split("
|
|
"),
|
|
_deferred: function() {
|
|
var
|
|
a = [],
|
|
b, c, d, e = {
|
|
done: function() {
|
|
if (!d) {
|
|
var
|
|
c = arguments,
|
|
f, g;
|
|
b && (g = b, b = 0);
|
|
for (var
|
|
h = 0, i = c.length; h < i; h++) f = c[h], QQWB.Array.isArray(f) ? e.done.apply(e, f) : QQWB.Function.isFunction(f) && a.push(f);
|
|
g && e.resolveWith(g[0], g[1])
|
|
}
|
|
return
|
|
this
|
|
},
|
|
resolveWith: function(e, f) {
|
|
if (!d && !b && !c) {
|
|
f = f || [], c = 1;
|
|
try {
|
|
while (a[0]) a.shift().apply(e, f)
|
|
} finally {
|
|
b = [e, f], c = 0
|
|
}
|
|
}
|
|
return
|
|
this
|
|
},
|
|
resolve: function() {
|
|
return
|
|
e.resolveWith(this, arguments), this
|
|
},
|
|
isResolved: function() {
|
|
return !!c || !! b
|
|
},
|
|
cancel: function() {
|
|
return
|
|
d = 1, a = [], this
|
|
}
|
|
};
|
|
return e
|
|
},
|
|
deferred: function(a) {
|
|
var
|
|
b, c = QQWB.deferred._deferred(),
|
|
d = QQWB.deferred._deferred();
|
|
return
|
|
QQWB.extend(c, {
|
|
fail: d.done,
|
|
then: function(a, b) {
|
|
return
|
|
c.done(a).fail(b), this
|
|
},
|
|
always: function() {
|
|
return
|
|
c.done.apply(c, arguments).fail.apply(this, arguments)
|
|
},
|
|
rejectWith: d.resolveWith,
|
|
reject: d.resolve,
|
|
isRejected: d.isResolved,
|
|
promise: function(a) {
|
|
if (a == null) {
|
|
if (b) return
|
|
b;
|
|
b = a = {}
|
|
}
|
|
var
|
|
d = QQWB.deferred._promiseMethods.length;
|
|
while (d--) a[QQWB.deferred._promiseMethods[d]] = c[QQWB.deferred._promiseMethods[d]];
|
|
return
|
|
a
|
|
}
|
|
}), c.success = c.done, c.error = c.fail, c.complete = c.whatever = c.always, c.done(d.cancel).fail(c.cancel), delete
|
|
c.cancel, a && a.call(c, c), c
|
|
},
|
|
when: function(a) {
|
|
function
|
|
f(a) {
|
|
return
|
|
|
|
function(c) {
|
|
b[a] = arguments.length > 1 ? QQWB.Array.fromArguments(arguments) : c, --d || e.resolveWith(e, QQWB.Array.fromArguments(b))
|
|
}
|
|
}
|
|
var
|
|
b = arguments,
|
|
c = b.length,
|
|
d = c,
|
|
e = c <= 1 && a && QQWB.Function.isFunction(a.promise) ? a : QQWB.deferred.deferred();
|
|
if (c > 1) for (var
|
|
g = 0; g < c; g++) b[g] && QQWB.Function.isFunction(b[g].promise) ? b[g].promise().then(f(g), e.reject) : --d, d || e.resolveWith(e, b);
|
|
else e !== a && e.resolveWith(e, c ? [a] : []);
|
|
return
|
|
e.promise()
|
|
}
|
|
}), QQWB._alias(["task", "when"], QQWB.deferred.when), QQWB.extend("io", {
|
|
_globalIOTimeout: 3e4,
|
|
_IOScript: function(a) {
|
|
var
|
|
b, c, d = document.head || document.getElementsByTagName("head")[0] || document.documentElement;
|
|
return {
|
|
send: function(e) {
|
|
var
|
|
f = QQWB.time.now();
|
|
b = document.createElement("script"), b.async = "async", a.charset && (b.charset = a.charset), b.src = a.url, c = setTimeout(function() {
|
|
QQWB.log.warning("script
|
|
loading timeout"), e(599, "network connect
|
|
timeout", QQWB.time.now() - f)
|
|
}, QQWB.io._globalIOTimeout), b.onload = b.onreadystatechange = function(a, g) {
|
|
if (g || !b.readyState || /loaded|complete/.test(b.readyState)) clearTimeout(c), b.onload = b.onreadystatechange = null, d && b.parentNode && d.removeChild(b), b = null, !g && e && e.apply(QQWB, [200, "success", QQWB.time.now() - f]), g && e && e.apply(QQWB, [-1, "aborted", QQWB.time.now() - f])
|
|
}, b.onerror = function(a) {
|
|
clearTimeout(c), e && e.apply(QQWB, [404, a, QQWB.time.now() - f])
|
|
}, d.insertBefore(b, d.firstChild)
|
|
},
|
|
abort: function() {
|
|
b && b.onload(0, 1)
|
|
}
|
|
}
|
|
},
|
|
_IOAjax: function(a) {
|
|
var
|
|
b, c, a = a || {},
|
|
d = window.XMLHttpRequest ? new
|
|
window.XMLHttpRequest : new
|
|
window.ActiveXObject("Microsoft.XMLHTTP");
|
|
return
|
|
a.async || (a.async = "async"), {
|
|
send: function(e) {
|
|
var
|
|
f = QQWB.time.now();
|
|
a.username ? d.open(a.type, a.url, a.async, a.username, a.password) : d.open(a.type, a.url, a.async);
|
|
try {
|
|
a.type == "POST" && d.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"), d.setRequestHeader("X-Requested-With", "XMLHttpRequest"), d.setRequestHeader("X-Requested-From", "openjs")
|
|
} catch (g) {}
|
|
d.send(a.data || null), c = setTimeout(function() {
|
|
QQWB.log.warning("request
|
|
timeout"), e(599, "network connect
|
|
timeout", QQWB.time.now() - f)
|
|
}, QQWB.io._globalIOTimeout), b = function(g, h) {
|
|
var
|
|
i, j, k, l, m, n;
|
|
try {
|
|
if (b && (h || d.readyState === 4)) {
|
|
b = null;
|
|
if (h) d.readyState !== 4 && d.abort();
|
|
else {
|
|
i = d.status, k = d.getAllResponseHeaders(), l = {}, n = d.responseXML, n && n.documentElement && (l.xml = n), l.text = d.responseText;
|
|
try {
|
|
j = d.statusText
|
|
} catch (o) {
|
|
j = ""
|
|
}
|
|
i === 1223 && (i = 204), a.dataType.toLowerCase() == "json" ? m = QQWB.JSON.fromString(l.text) : a.dataType.toLowerCase() == "xml" ? m = l.xml : m = l.text
|
|
}
|
|
clearTimeout(c), e(i, j, QQWB.time.now() - f, m, l.text, k, a.dataType)
|
|
}
|
|
} catch (p) {
|
|
var
|
|
q = p;
|
|
i = -2, j = "", j += "Exception
|
|
[Type:", j += q && q.type ? q.type : "unknown exception
|
|
type", j += ",
|
|
Message:", j += q && q.message ? q.message : q, j += "]", QQWB.log.warning("caught
|
|
" + j + " exception
|
|
QQWB.io._IOAjax"), h || (clearTimeout(c), e(i, j, QQWB.time.now() - f))
|
|
}
|
|
}, !a.async || d.readyState === 4 ? b() : d.onreadystatechange = b
|
|
},
|
|
abort: function() {
|
|
b && b(0, 1)
|
|
}
|
|
}
|
|
},
|
|
_IOFlash: function(a) {
|
|
var
|
|
b, c, d, a = a || {};
|
|
return {
|
|
send: function(e) {
|
|
var
|
|
f = QQWB.time.now();
|
|
d = 1, c = setTimeout(function() {
|
|
QQWB.log.warning("request
|
|
timeout"), e(599, "network connect
|
|
timeout", QQWB.time.now() - f)
|
|
}, QQWB.io._globalIOTimeout), b = function(d, g) {
|
|
var
|
|
h, i, j, k, l, m, n = 4;
|
|
clearTimeout(c);
|
|
try {
|
|
b && (g || n == 4) && (b = null, g ? e(-1, "request
|
|
has
|
|
aborted", QQWB.time.now() - f) : (h = this.httpStatus, i = this.httpStatus == 200 ? "ok" : "", j = "", k = {}, k.text = this.httpResponseText, a.dataType.toLowerCase() == "json" ? l = QQWB.JSON.fromString(k.text) : a.dataType.toLowerCase() == "xml" ? l = QQWB.XML.fromString(k.text) : l = k.text), e(h, i, QQWB.time.now() - f, l, k.text, j, a.dataType))
|
|
} catch (o) {
|
|
var
|
|
p = o;
|
|
h = -2, i = "", i += "Exception
|
|
[Type:", i += p && p.type ? p.type : "unknown exception
|
|
type", i += ",
|
|
Message:", i += p && p.message ? p.message : p, i += "]", QQWB.log.warning("caught
|
|
" + i + " exception
|
|
QQWB.io._IOFlash"), g || e(h, i, QQWB.time.now() - f)
|
|
}
|
|
}, window.onFlashRequestComplete_8df046 || (window.onFlashRequestComplete_8df046 = function(a) {
|
|
if (!a.ticket) {
|
|
QQWB.log.error("ticket
|
|
doesn't exists in response,
|
|
" + QQWB.JSON.stringify(a));
|
|
return
|
|
}
|
|
var
|
|
b = window.onFlashRequestComplete_8df046.callbacks.getByTicket(a.ticket),
|
|
c = a.srcEvent;
|
|
b.readyState || (b.readyState = 0), /httpStatus/i.test(c.type) ? (b.httpStatus = c.status, b.readyState++) : /error/i.test(c.type) ? (b.httpError = c.type, b.readyState++) : /complete/i.test(c.type) && (b.httpResponseText = c.target.data, b.readyState++), b.readyState == 2 && (b.call(b), window.onFlashRequestComplete_8df046.callbacks.unregister(a.ticket))
|
|
}, window.onFlashRequestComplete_8df046.callbacks = {
|
|
_callbackPool: {},
|
|
_ticketPrefix: "openjstkt",
|
|
_ticketStartIndex: 0,
|
|
register: function(a) {
|
|
var
|
|
b;
|
|
return
|
|
this._ticketStartIndex++, b = this._ticketPrefix + this._ticketStartIndex, this._callbackPool[b] = a, b
|
|
},
|
|
getByTicket: function(a) {
|
|
return
|
|
this._callbackPool[a] || QQWB.log.error("get callback
|
|
failed, callback doesn't exist at ticket
|
|
" + a), this._callbackPool[a]
|
|
},
|
|
unregister: function(a) {
|
|
return
|
|
this._callbackPool[a] ? (delete
|
|
this._callbackPool[a], !0) : (QQWB.log.error("unregister
|
|
callback failed, callback doesn't exist at ticket
|
|
" + a), !1)
|
|
}
|
|
}), QQWBFlashTransport && QQWBFlashTransport.httpRequest ? QQWBFlashTransport.httpRequest(a.url, a.data, a.type, window.onFlashRequestComplete_8df046.callbacks.register(b)) : QQWB.log.critical("flash
|
|
transportation object
|
|
error" + QQWBFlashTransportName)
|
|
},
|
|
abort: function() {
|
|
b && b(0, 1)
|
|
}
|
|
}
|
|
},
|
|
_apiAjax: function(a, b, c, d) {
|
|
var
|
|
e = {
|
|
type: d.toUpperCase(),
|
|
url: QQWB._domain.api + a,
|
|
data: QQWB.queryString.encode(b),
|
|
dataType: c
|
|
};
|
|
return
|
|
e.type == "GET" && (e.url += e.data ? "?" + e.data : "", delete
|
|
e.data), QQWB.io.ajax(e)
|
|
},
|
|
_apiFlashAjax: function(a, b, c, d) {
|
|
var
|
|
e = {
|
|
type: d.toUpperCase(),
|
|
url: QQWB._domain.api + a,
|
|
data: QQWB.queryString.encode(b),
|
|
dataType: c
|
|
};
|
|
return
|
|
e.type == "GET" && (e.url += e.data ? "?" + e.data : "", delete
|
|
e.data), QQWB.io.flashAjax(e)
|
|
},
|
|
_apiResponder: function(a) {
|
|
return
|
|
|
|
function(b, c, d, e, f, g, h) {
|
|
var
|
|
i, j;
|
|
b !== 200 ? (b = 2e6 + Math.abs(b ? b : 0), a.reject(b, c, d, "")) : typeof(i = QQWB._apiProvider._apiParseRetCode(f)) == "number" && 0 !== i ? (j = QQWB._apiProvider._apiParseErrorCode(f), b = 1e6 + i * 1e3 + 500 + (j ? j : 0), a.reject(b, QQWB._apiProvider._apiGetErrorMessage(i, j), d, f)) : a.resolve(b, c, d, e, g, h)
|
|
}
|
|
},
|
|
_ajaxResponder: function(a) {
|
|
return
|
|
|
|
function(b, c, d, e, f, g, h) {
|
|
b !== 200 ? a.reject(b, c, d, "") : a.resolve(e, d, f)
|
|
}
|
|
},
|
|
flashAjax: function(a) {
|
|
var
|
|
b = QQWB.deferred.deferred(),
|
|
c = {
|
|
type: "get",
|
|
dataType: "json"
|
|
};
|
|
return
|
|
QQWB.extend(c, a, !0), QQWB.io._IOFlash(c).send(QQWB.io._apiResponder(b)), b.promise()
|
|
},
|
|
ajax: function(a) {
|
|
var
|
|
b = QQWB.deferred.deferred(),
|
|
c = {
|
|
type: "get",
|
|
dataType: "json"
|
|
};
|
|
return
|
|
QQWB.extend(c, a, !0), QQWB.io._IOAjax(c).send(QQWB.io._apiResponder(b)), b.promise()
|
|
},
|
|
ajax2: function(a) {
|
|
var
|
|
b = QQWB.deferred.deferred(),
|
|
c = {
|
|
type: "get",
|
|
dataType: "json"
|
|
};
|
|
return
|
|
QQWB.extend(c, a, !0), QQWB.io._IOAjax(c).send(QQWB._ajaxResponder(b)), b.promise()
|
|
},
|
|
script: function(a, b) {
|
|
var
|
|
b = b || "utf-8",
|
|
c = QQWB.deferred.deferred();
|
|
return
|
|
QQWB.io._IOScript({
|
|
charset: b,
|
|
url: a
|
|
}).send(function(a, b, d) {
|
|
a !== 200 ? c.reject(a, b, d) : c.resolve(a, b, d)
|
|
}), c.promise()
|
|
},
|
|
jsonp: function(a) {
|
|
var
|
|
b = QQWB.deferred.deferred(),
|
|
c = "callback",
|
|
d = "jsonp_",
|
|
e = d + QQWB.uid(),
|
|
f = window.callbackName,
|
|
g, h = {
|
|
dataType: "text",
|
|
charset: "utf-8",
|
|
url: ""
|
|
};
|
|
return
|
|
QQWB.extend(h, a, !0), h.data && (h.url += "?" + h.data + "&" + c + "=" + e), window[e] = function(a) {
|
|
var
|
|
c = a;
|
|
h.dataType.toLowerCase() === "json" ? c = QQWB.JSON.fromString(a) : h.dataType.toLowerCase() === "xml" && (c = QQWB.XML.fromString(a)), b.resolve(c, g), window[e] = f
|
|
}, QQWB.io._IOScript(h).send(function(a, c, d) {
|
|
a !== 200 && b.reject(a, c, d), g = d
|
|
}), b.promise()
|
|
}
|
|
}), QQWB._alias("ajax", QQWB.io.ajax2), QQWB._alias("jsonp", QQWB.io.jsonp), QQWB._alias("script", QQWB.io.script), QQWB.extend("_token", {
|
|
setAccessToken: function(a, b, c, d) {
|
|
var
|
|
e = this.getTokenUser(!0);
|
|
return
|
|
QQWB.cookie.set(QQWB._cookie.names.accessToken, [a, QQWB.time.now() + b * 1e3, c || e && e.name || "", d || e && e.nick || ""].join("|"), 31536e3, QQWB._cookie.path, QQWB._cookie.domain), QQWB
|
|
},
|
|
getAccessToken: function(a) {
|
|
var
|
|
b = QQWB.cookie.get(QQWB._cookie.names.accessToken);
|
|
if (b) {
|
|
b = b.split("|", 2);
|
|
if (a || parseInt(b[1], 10) > QQWB.time.now()) return
|
|
b[0]
|
|
}
|
|
},
|
|
getTokenUser: function(a) {
|
|
var
|
|
b = QQWB.cookie.get(QQWB._cookie.names.accessToken);
|
|
if (b) {
|
|
b = b.split("|", 4);
|
|
if (a || parseInt(b[1], 10) > QQWB.time.now()) return {
|
|
name: b[2],
|
|
nick: b[3]
|
|
}
|
|
}
|
|
},
|
|
clearAccessToken: function() {
|
|
return
|
|
QQWB.cookie.del(QQWB._cookie.names.accessToken, QQWB._cookie.path, QQWB._cookie.domain), QQWB
|
|
},
|
|
setRefreshToken: function(a) {
|
|
return
|
|
QQWB.cookie.set(QQWB._cookie.names.refreshToken, a, 31536e3, QQWB._cookie.path, QQWB._cookie.domain), QQWB
|
|
},
|
|
getRefreshToken: function() {
|
|
return
|
|
QQWB.cookie.get(QQWB._cookie.names.refreshToken)
|
|
},
|
|
clearRefreshToken: function() {
|
|
return
|
|
QQWB.cookie.del(QQWB._cookie.names.refreshToken, QQWB._cookie.path, QQWB._cookie.domain), QQWB
|
|
},
|
|
exchangeForToken: function(a) {
|
|
return
|
|
QQWB.io.jsonp({
|
|
url: QQWB._domain.exchange,
|
|
data: QQWB.queryString.encode({
|
|
response_type: "token",
|
|
client_id: QQWB.appkey.value,
|
|
scope: "all",
|
|
state: "1",
|
|
refresh_token: this.getRefreshToken(),
|
|
access_token: this.getAccessToken(!0)
|
|
})
|
|
}).success(function(a) {
|
|
var
|
|
b = a;
|
|
QQWB.String.isString(a) && (a = QQWB.queryString.decode(a)), a.access_token ? (!a.expires_in && QQWB.log.error("token
|
|
expires_in not
|
|
retrieved"), !a.wb_name && QQWB.log.warning("weibo
|
|
username not retrieved, will not update
|
|
username"), !a.wb_nick && QQWB.log.warning("weibo usernick
|
|
not retrieved, will not update
|
|
usernick"), QQWB._token.setAccessToken(a.access_token, parseInt(a.expires_in, 10), a.wb_name, a.wb_nick), a.refresh_token ? QQWB._token.setRefreshToken(a.refresh_token) : QQWB.log.error("refresh
|
|
token not retrieved"), QQWB.log.info("exchange token
|
|
succeed")) : a.error ? QQWB.log.error("exchange token error
|
|
" + a.error) : QQWB.log.error("unexpected result returned
|
|
from server " + b + " while exchanging for new access
|
|
token")
|
|
}).error(function(a, b) {
|
|
a === 404 ? QQWB.log.error("exchange
|
|
token has failed, script not
|
|
found") : QQWB.log.error("exchange token has failed,
|
|
" + b)
|
|
}).complete(function(b, c, d) {
|
|
a && a.apply(QQWB, [b, c, d])
|
|
}), QQWB
|
|
},
|
|
getNewAccessToken: function(a) {
|
|
return
|
|
QQWB.io.jsonp({
|
|
url: QQWB._domain.query,
|
|
data: QQWB.queryString.encode({
|
|
response_type: "token",
|
|
client_id: QQWB.appkey.value,
|
|
scope: "all",
|
|
state: "1"
|
|
})
|
|
}).success(function(a) {
|
|
var
|
|
b = a;
|
|
QQWB.String.isString(a) && (a = QQWB.queryString.decode(a)), a.access_token ? (!a.expires_in && QQWB.log.error("token
|
|
expires_in not
|
|
retrieved"), !a.wb_name && QQWB.log.warning("weibo
|
|
username not
|
|
retrieved"), !a.wb_nick && QQWB.log.warning("weibo
|
|
usernick not
|
|
retrieved"), QQWB._token.setAccessToken(a.access_token, parseInt(a.expires_in, 10), a.wb_name, a.wb_nick), a.refresh_token ? QQWB._token.setRefreshToken(a.refresh_token) : QQWB.log.error("refresh
|
|
token not retrieved"), QQWB.log.info("retrieve new
|
|
access token
|
|
succeed")) : a.error ? QQWB.log.error("retrieve new access
|
|
token error " + a.error) : QQWB.log.error("unexpected
|
|
result returned from server " + b + " while retrieving new
|
|
access
|
|
token")
|
|
}).error(function(a, b) {
|
|
a === 404 ? QQWB.log.error("get
|
|
token has failed, script not
|
|
found") : QQWB.log.error("get token failed,
|
|
" + b)
|
|
}).complete(function(b, c, d) {
|
|
a && a.apply(QQWB, [b, c, d])
|
|
}), QQWB
|
|
},
|
|
resolveResponse: function(a, b) {
|
|
var
|
|
c, d = (b || window).QQWB,
|
|
e = QQWB.String.isString(a) ? d.queryString.decode(a) : a;
|
|
e.access_token ? (d._token.setAccessToken(e.access_token, parseInt(e.expires_in, 10), e.wb_name, e.wb_nick), e.refresh_token ? d._token.setRefreshToken(e.refresh_token) : d.log.error("refresh
|
|
token not
|
|
retrieved"), c = d.loginStatus(), d.log.info("user
|
|
" + c.name + " logged
|
|
in"), d.trigger(d.events.USER_LOGGEDIN_EVENT, c)) : e.error ? (d.log.error("login
|
|
error occurred
|
|
" + e.error), e.message = e.error, d.trigger(d.events.USER_LOGIN_FAILED_EVENT, e)) : (d.log.error("unexpected
|
|
result returned from server
|
|
" + a), e.message = e.error = "server
|
|
error", d.trigger(d.events.USER_LOGIN_FAILED_EVENT, e))
|
|
}
|
|
}), QQWB.extend("_eventProvider", {
|
|
_getEventsMap: function() {
|
|
return
|
|
this._eventsMap || (this._eventsMap = {}), this._eventsMap
|
|
},
|
|
bind: function(a, b) {
|
|
var
|
|
c = this._getEventsMap();
|
|
c[a] ? QQWB.Array.inArray(c[a], b) || c[a].push(b) : c[a] = [b]
|
|
},
|
|
unbind: function(a, b) {
|
|
var
|
|
c = this._getEventsMap()[a];
|
|
if (c) if (b) for (var
|
|
d = 0, e = c.length; d < e; d++) b === c[d] && (c[d] = null);
|
|
else delete
|
|
this._getEventsMap()[a]
|
|
},
|
|
trigger: function(a, b) {
|
|
var
|
|
c = this._getEventsMap()[a];
|
|
if (c) for (var
|
|
d = 0, e = c.length; d < e; d++) {
|
|
var
|
|
f = c[d];
|
|
f && f.call(QQWB, b)
|
|
}
|
|
}
|
|
}), QQWB.extend("", {
|
|
bind: function(a, b) {
|
|
return
|
|
a = a.toLowerCase(), this._eventProvider.bind(a, b), this
|
|
},
|
|
once: function(a, b) {
|
|
a = a.toLowerCase();
|
|
var
|
|
c = function() {
|
|
var
|
|
d = QQWB.Array.fromArguments(arguments);
|
|
b.apply(QQWB, d), this._eventProvider.unbind(a, c), c = null
|
|
};
|
|
return
|
|
this._eventProvider.bind(a, c), this
|
|
},
|
|
unbind: function(a, b) {
|
|
return
|
|
a = a.toLowerCase(), this._eventProvider.unbind(a, b), this
|
|
},
|
|
trigger: function(a, b) {
|
|
return
|
|
a = a.toLowerCase(), this._eventProvider.trigger(a, b), this
|
|
}
|
|
}), QQWB.extend("events", {
|
|
USER_LOGGEDIN_EVENT: "UserLoggedIn",
|
|
USER_LOGIN_FAILED_EVENT: "UserLoginFailed",
|
|
USER_LOGGEDOUT_EVENT: "UserLoggedOut",
|
|
TOKEN_READY_EVENT: "tokenReady",
|
|
DOCUMENT_READY_EVENT: "documentReady",
|
|
EVERYTHING_READY_EVENT: "everythingReady"
|
|
}), function() {
|
|
function
|
|
j(a) {
|
|
a = a.toLowerCase();
|
|
var
|
|
b = e.exec(a) || d.exec(a) || c.exec(a) || a.indexOf("compatible") < 0 && f.exec(a) || [];
|
|
return {
|
|
browser: b[1] || "unknown",
|
|
version: b[2] || "0"
|
|
}
|
|
}
|
|
|
|
function
|
|
k() {
|
|
for (var a in i) i.hasOwnProperty(a) && i[a]() && (g[a] = !0)
|
|
}
|
|
|
|
function
|
|
l() {
|
|
var
|
|
a = navigator.userAgent || navigator.vendor || window.opera;
|
|
return /android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge
|
|
|maemo|midp|mmp|opera m(ob|in)i|palm(
|
|
os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows
|
|
(ce|phone)|xda|xiino/i.test(a) || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a
|
|
wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r
|
|
|s
|
|
)|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1
|
|
u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp(
|
|
i|ip)|hs\-c|ht(c(\-|
|
|
|_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(
|
|
|\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt(
|
|
|\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg(
|
|
g|\/(k|l|u)|50|54|e\-|e\/|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-|
|
|
|o|v)|zz)|mt(50|p1|v
|
|
)|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v
|
|
)|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-|
|
|
)|webc|whit|wi(g
|
|
|nc|nw)|wmlb|wonu|x700|xda(\-|2|g)|yas\-|your|zeto|zte\-/i.test(a.substr(0, 4)) ? {
|
|
mobile: !0
|
|
} : {
|
|
pc: !0
|
|
}
|
|
}
|
|
|
|
function
|
|
m() {
|
|
var a = navigator.appVersion,
|
|
b = {},
|
|
c = "unknown";
|
|
return
|
|
a.indexOf("Win") != -1 && (c = "windows"), a.indexOf("Mac") != -1 && (c = "mac"), a.indexOf("X11") != -1 && (c = "unix"), a.indexOf("Linux") != -1 && (c = "linux"), b[c] = !0, b
|
|
}
|
|
var
|
|
a, b = navigator.userAgent,
|
|
c = /(msie)
|
|
([\w.]+)/,
|
|
d = /(opera)(?:.*version)?[
|
|
\/]([\w.]+)/,
|
|
e = /(webkit)[
|
|
\/]([\w.]+)/,
|
|
f = /(mozilla)(?:.*?
|
|
rv:([\w.]+))?/,
|
|
g = {},
|
|
h = ["Webkit", "Moz", "O", "ms", "khtml"],
|
|
i = {
|
|
cookie: function() {
|
|
var
|
|
a = navigator.cookieEnabled;
|
|
if (a && QQWB.browser.webkit) {
|
|
var
|
|
b = "COOKIE_TEST_" + QQWB.uid();
|
|
document.cookie = b + "=" + 1 + ";
|
|
domain=;
|
|
path=;", document.cookie.indexOf(b) < 0 ? a = !1 : document.cookie = b + "=" + ";
|
|
expires=" + (new Date(1970, 1, 1)).toUTCString() + ";
|
|
domain=; path=;"
|
|
}
|
|
return !a && QQWB.log.critical("Your
|
|
browser doesn't support cookie or cookie isn't
|
|
enabled"), a
|
|
},
|
|
flash: function() {
|
|
if (typeof
|
|
navigator.plugins != "undefined" && typeof
|
|
navigator.plugins["Shockwave Flash"] == "object") {
|
|
var
|
|
a = navigator.plugins["Shockwave
|
|
Flash"].description,
|
|
b = typeof
|
|
navigator.mimeTypes != "undefined" && navigator.mimeTypes["application/x-shockwave-flash"] && navigator.mimeTypes["application/x-shockwave-flash"].enabledPlugin;
|
|
return
|
|
a && b
|
|
}
|
|
if (typeof
|
|
window.ActiveXObject != "undefined") try {
|
|
var c = new
|
|
ActiveXObject("ShockwaveFlash.ShockwaveFlash");
|
|
if (c) return
|
|
c.getVariable("$version")
|
|
} catch (d) {}
|
|
},
|
|
userdata: function() {
|
|
return
|
|
QQWB.browser.msie
|
|
},
|
|
postmessage: function() {
|
|
return !!window.postMessage && (QQWB.browser.msie && parseInt(QQWB.browser.version, 10) < 8 ? !1 : !0)
|
|
},
|
|
canvas: function() {
|
|
var
|
|
a = document.createElement("canvas");
|
|
return !!a.getContext && !! a.getContext("2d")
|
|
},
|
|
webgl: function() {
|
|
return !!window.WebGLRenderingContext
|
|
},
|
|
geolocation: function() {
|
|
return !!navigator.geolocation
|
|
},
|
|
websqldatabase: function() {
|
|
return !!window.openDatabase
|
|
},
|
|
indexeddb: function() {
|
|
for (var
|
|
a = 0, b = h.length; a < b; a++) if (window[h[a].toLowerCase() + "IndexedDB"]) return !0;
|
|
return !!window.indexedDB
|
|
},
|
|
websocket: function() {
|
|
for (var
|
|
a = 0, b = h.length; a < b; a++) if (window[h[a].toLowerCase() + "WebSocket"]) return !0;
|
|
return !!window.WebSocket
|
|
},
|
|
localstorage: function() {
|
|
return
|
|
window.localStorage && localStorage.getItem
|
|
},
|
|
sessionstorage: function() {
|
|
return
|
|
window.sessionStorage && sessionStorage.getItem
|
|
},
|
|
webworker: function() {
|
|
return !!window.Worker
|
|
},
|
|
applicationcache: function() {
|
|
return !!window.applicationCache
|
|
}
|
|
};
|
|
a = j(b), QQWB.extend("browser", {
|
|
version: a.version
|
|
}), QQWB.browser[a.browser] = !0, k(), QQWB.extend("browser.feature", g), QQWB.extend("browser.platform", l()), QQWB.extend("browser.os", m())
|
|
}(), QQWB.extend("flash", {
|
|
NO_CACHE: 1,
|
|
load: function(a, b, c) {
|
|
this.loadedSwfs || (this.loadedSwfs = []);
|
|
if (QQWB.Array.inArray(this.loadedSwfs, a)) {
|
|
QQWB.log.warning(a + "is
|
|
already
|
|
loaded");
|
|
return
|
|
}
|
|
c === this.NO_CACHE && (a += "?" + QQWB.uid());
|
|
var
|
|
d = "movieContainer_" + QQWB.uid(),
|
|
e = "movie_" + QQWB.uid(),
|
|
f = "onFlashReady_a1f5b4ce",
|
|
g = window[f];
|
|
return
|
|
window[f] = function() {
|
|
b && b(e), window[f] = g, g = null, b && (b = null), e = null
|
|
}, QQWB.dom.appendHidden(["<object", 'type="application/x-shockwave-flash"', 'id="' + e + '"', QQWB.browser.msie ? 'name="' + e + '"' : "", QQWB.browser.msie ? 'data="' + a + '"' : "", QQWB.browser.msie ? 'classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"' : "", 'allowscriptaccess="always">', '<param
|
|
name="movie" value="' + a + '"></param>', '<param
|
|
name="allowscriptaccess"
|
|
value="always"></param>', "</object>"].join("
|
|
"), {
|
|
id: d
|
|
}, !0), document.getElementById(d)
|
|
},
|
|
getSWFObjectByName: function(a) {
|
|
return
|
|
QQWB.browser.msie ? window[a] : document[a].length ? document[a][1] : document[a]
|
|
}
|
|
}), QQWB.extend("_solution", {
|
|
HTML5_SOLUTION: "html5",
|
|
FLASH_SOLUTION: "flash",
|
|
SILVER_LIGHT_SOLUTION: "silverlight",
|
|
initSolution: function(a) {
|
|
var
|
|
b, c = QQWB.deferred.deferred();
|
|
!this[a] && QQWB.Array.inArray([this.HTML5_SOLUTION, this.FLASH_SOLUTION, this.SILVER_LIGHT_SOLUTION], a) && (this[a] = {}, this[a].name = a, this[a].readyState = 0, this[a].id = "solution_" + QQWB.uid(), this[a].deferred = QQWB.deferred.deferred(), this[a].promise = this[a].deferred.promise());
|
|
if (this[a] && this[a].readyState !== 0) this[a].deferred.success(function() {
|
|
c.resolve(QQWB.Array.fromArguments(arguments))
|
|
}).fail(function() {
|
|
c.reject(QQWB.Array.fromArguments(arguments))
|
|
});
|
|
else switch (a) {
|
|
case
|
|
this.HTML5_SOLUTION:
|
|
if (QQWB.browser.feature.postmessage) {
|
|
b = this[this.HTML5_SOLUTION];
|
|
var
|
|
d = function(a) {
|
|
QQWB._domain.serverproxy.indexOf(a.origin) !== 0 ? QQWB.log.warning("unexpected
|
|
message arrived from " + a.origin + " with data
|
|
" + a.data) : (a.data === "success" ? (QQWB.log.info("html5
|
|
solution was successfully
|
|
initialized"), b.readyState = 1, b.deferred.resolve()) : QQWB.log.info("unexpected
|
|
solution signal
|
|
" + a.data), window.addEventListener ? window.removeEventListener("message", d, !1) : window.attachEvent && window.detachEvent("onmessage", d), d = null)
|
|
};
|
|
window.addEventListener ? window.addEventListener("message", d, !1) : window.attachEvent && window.attachEvent("onmessage", d), QQWB.everythingReady(function() {
|
|
QQWB.log.info("init
|
|
html5
|
|
solution..."), serverframe = QQWB.dom.createHidden("iframe", {
|
|
id: b.id,
|
|
src: QQWB._domain.serverproxy
|
|
}), QQWB.dom.append(serverframe), serverframe.onload = function(a) {
|
|
setTimeout(function() {
|
|
b.readyState !== 1 && (QQWB.log.error("html5
|
|
solution initialition has failed, server proxy frame
|
|
encountered
|
|
error"), b.readyState = 2, b.deferred.reject(-1, "server
|
|
proxy frame not working"))
|
|
}, 1e3)
|
|
}
|
|
})
|
|
} else QQWB.log.error("can't init solution
|
|
\"" + a) + "\",browser doesn't support
|
|
postmessage", c.reject("browser not
|
|
supported");
|
|
break;
|
|
case
|
|
this.FLASH_SOLUTION:
|
|
QQWB.browser.feature.flash ? (b = this[this.FLASH_SOLUTION], QQWB.everythingReady(function() {
|
|
QQWB.log.info("init
|
|
flash solution...");
|
|
var
|
|
a, c = 1e4,
|
|
d = QQWB.flash.load(QQWB._domain.flashproxy, function(c) {
|
|
QQWB.log.info("flash
|
|
solution initlized
|
|
successfully"), b.readyState = 1, window.QQWBFlashTransport = QQWB.flash.getSWFObjectByName(c), a && clearTimeout(a), b.deferred.resolve()
|
|
}, QQWB.flash.NO_CACHE);
|
|
a = setTimeout(function() {
|
|
b.deferred.isResolved() || (b.readyState = 2, b.deferred.reject(-1, "encounter
|
|
error while loading proxy swf, need newer flash
|
|
player"), QQWB.dom.remove(d))
|
|
}, c)
|
|
})) : (QQWB.log.error("can't
|
|
init solution \"" + a) + "\",browser doesn't support
|
|
flash or flash is disabled", c.reject("browser not
|
|
supported"));
|
|
break;
|
|
case
|
|
this.SILVER_LIGHT_SOLUTION:
|
|
QQWB.browser.feature.silverlight ? (-2, QQWB.log.error("sorry,
|
|
silverlight solution is not
|
|
implemented")) : (QQWB.log.error("can't init solution
|
|
\"" + a) + "\",browser doesn't support silverlight or
|
|
silverlight is disabled", c.reject("browser not
|
|
supported"));
|
|
break;
|
|
default:
|
|
QQWB.log.error("can't init
|
|
solution \"" + a) + '",not supported', c.reject("solution
|
|
" + a + " not supported")
|
|
}
|
|
return
|
|
c.promise()
|
|
}
|
|
}), QQWB.extend("ping", {
|
|
_pingbackURL: "http://btrace.qq.com/collect",
|
|
_stupidPingParamsOrder: ["ftime", "sIp", "iQQ", "sBiz", "sOp", "iSta", "iTy", "iFlow"],
|
|
_paramSeprator: ";",
|
|
_getBasePingParams: function() {
|
|
var
|
|
a = QQWB.cookie.get("uin", null, "0").match(/\d+/)[0],
|
|
b = "";
|
|
return {
|
|
sIp: "",
|
|
iQQ: a,
|
|
sBiz: "open-js",
|
|
sOp: "",
|
|
iSta: "",
|
|
iTy: 1183,
|
|
iFlow: b,
|
|
iFrom: "",
|
|
iPubFrom: "",
|
|
sUrl: "",
|
|
iUrlType: "",
|
|
iPos: "",
|
|
sText: "",
|
|
iBak1: "",
|
|
iBak2: "",
|
|
sBak1: "",
|
|
sBak2: QQWB.uid()
|
|
}
|
|
},
|
|
pingWith: function(a, b) {
|
|
a = QQWB.extend(QQWB.ping._getBasePingParams(), a, !0), QQWBPingTransport_18035d19 = new
|
|
Image(1, 1), QQWBPingTransport_18035d19.src = QQWB.ping._pingbackURL + "?" + QQWB.queryString.encode(a, null, null, b)
|
|
},
|
|
pingInit: function() {
|
|
function
|
|
a() {
|
|
var a = 1e6;
|
|
return
|
|
feature = 0, QQWB.browser.msie ? a += 100 : QQWB.browser.opera ? a += 200 : QQWB.browser.webkit ? a += 300 : QQWB.browser.mozilla ? a += 400 : a += 500, QQWB.browser.feature.postmessage && (feature += 1), QQWB.browser.feature.flash && (feature += 2), QQWB.browser.feature.cookie && (feature += 4), a += feature, a
|
|
}
|
|
|
|
function
|
|
b() {
|
|
var a = 1e6;
|
|
return
|
|
QQWB.browser.platform.mobile ? a += 100 : a += 200, QQWB.browser.os.windows ? a += 10 : QQWB.browser.os.windows ? a += 20 : QQWB.browser.os.mac ? a += 30 : QQWB.browser.os.unix ? a += 40 : QQWB.browser.os.linux ? a += 50 : a += 60, a += parseInt(QQWB.appkey.version, 10), a
|
|
}
|
|
return
|
|
QQWB.ping.pingWith({
|
|
sOp: "init",
|
|
iFrom: QQWB.version.replace(/\./g, ""),
|
|
iPubFrom: b(),
|
|
sUrl: [document.title, document.location.href].join(QQWB.ping._paramSeprator),
|
|
sText: QQWB.appkey.value,
|
|
iBak1: a()
|
|
}, QQWB.ping._stupidPingParamsOrder.concat("iFrom", "iPubFrom", "sUrl", "iUrlType", "iPos", "sText", "iBak1", "iBak2", "sBak1", "sBak2"))
|
|
},
|
|
_pingAuthorize: function(a) {
|
|
return
|
|
QQWB.ping.pingWith({
|
|
sOp: "login",
|
|
iSta: a ? 1 : 0,
|
|
iFrom: QQWB.version.replace(/\./g, ""),
|
|
sUrl: document.location.href,
|
|
sText: QQWB.appkey.value
|
|
}, QQWB.ping._stupidPingParamsOrder.concat("iFrom", "iPubFrom", "sUrl", "iUrlType", "iPos", "sText", "iBak1", "iBak2", "sBak1", "sBak2"))
|
|
},
|
|
pingLoggedIn: function() {
|
|
return
|
|
QQWB.ping._pingAuthorize(!0)
|
|
},
|
|
pingLoggedInFailed: function() {
|
|
return
|
|
QQWB.ping._pingAuthorize(!1)
|
|
},
|
|
pingAPI: function(a, b, c, d, e, f, g, h) {
|
|
var
|
|
i = 1e6;
|
|
a = a || "", b = b || "", c = c || "", d = d || "", e = e || "-2", f = f || "", g = g || "-1", h = h || "";
|
|
switch (h) {
|
|
case
|
|
QQWB._solution.HTML5_SOLUTION:
|
|
case "postmessage":
|
|
i += 100;
|
|
break;
|
|
case
|
|
QQWB._solution.FLASH_SOLUTION:
|
|
i += 200;
|
|
break;
|
|
case
|
|
QQWB._solution.SILVER_LIGHT_SOLUTION:
|
|
i += 400
|
|
}
|
|
d = d.toUpperCase();
|
|
switch (d) {
|
|
case "GET":
|
|
i += 10;
|
|
break;
|
|
case "POST":
|
|
i += 20
|
|
}
|
|
return
|
|
QQWB.ping.pingWith({
|
|
sOp: "api",
|
|
iSta: e,
|
|
iFrom: QQWB.version.replace(/\./g, ""),
|
|
iPubFrom: i,
|
|
sUrl: document.location.href,
|
|
sText: QQWB.appkey.value,
|
|
iBak1: g,
|
|
sBak1: [a, b].join(QQWB.ping._paramSeprator)
|
|
}, QQWB.ping._stupidPingParamsOrder.concat("iFrom", "iPubFrom", "sUrl", "iUrlType", "iPos", "sText", "iBak1", "iBak2", "sBak1", "sBak2"))
|
|
}
|
|
}), QQWB.extend("door", {
|
|
doors: 0,
|
|
door: function(a, b) {
|
|
var
|
|
c = 0;
|
|
return this.doors++, {
|
|
lock: function() {
|
|
return
|
|
c++, a && a.call(QQWB), this
|
|
},
|
|
unlock: function() {
|
|
return
|
|
c--, c = Math.max(0, c), b && b.call(QQWB), this
|
|
},
|
|
isOpen: function() {
|
|
return
|
|
c === 0
|
|
}
|
|
}
|
|
},
|
|
count: function() {
|
|
return
|
|
this.doors
|
|
}
|
|
}), QQWB.extend("", {
|
|
init: function(a) {
|
|
if (this._inited === !0) return
|
|
this.log.warning("already
|
|
initialized"), this;
|
|
this.log.info("init signal has
|
|
arrived"), a = QQWB.extend({
|
|
callbackurl: document.location.href.replace(location.search, "").replace(location.hash, ""),
|
|
pingback: !0,
|
|
synclogin: !0
|
|
}, a, !0), QQWB.pingback = a.pingback;
|
|
var
|
|
b = this._token.getAccessToken(),
|
|
c = this._token.getAccessToken(!0),
|
|
d = this._token.getRefreshToken(),
|
|
e = d && !b && c,
|
|
f = !d && !b && a.synclogin;
|
|
return
|
|
a.appkey && (this.log.info("client id is
|
|
" + a.appkey), this.assign("appkey.value", "APPKEY", a.appkey)), this.log.info("client
|
|
proxy uri is
|
|
" + a.callbackurl), this.assign("_domain", "CLIENTPROXY_URI", a.callbackurl), (e || f) && QQWB._tokenReadyDoor.lock(), e ? (this.log.info("exchanging
|
|
refresh token to access
|
|
token..."), QQWB._token.exchangeForToken(function(b) {
|
|
a.synclogin && b.error && (QQWB.log.warning("exchange
|
|
token has failed, trying to retrieve a new
|
|
access_token..."), this._tokenReadyDoor.lock(), QQWB._token.getNewAccessToken(function() {
|
|
this._tokenReadyDoor.unlock()
|
|
})), this._tokenReadyDoor.unlock()
|
|
})) : f && (this.log.info("retrieving
|
|
new access
|
|
token..."), QQWB._token.getNewAccessToken(function() {
|
|
QQWB._tokenReadyDoor.unlock()
|
|
})), /^[a-z\d][a-z\d]{30}[a-z\d]$/i.test(QQWB.appkey.value) ? this.assign("appkey", "APPKEY_VERSION", 1) : /^[1-9][0-9]{7}[0-9]$/.test(QQWB.appkey.value) ? this.assign("appkey", "APPKEY_VERSION", 2) : this.assign("appkey", "APPKEY_VERSION", 3), this._inited = !0, QQWB._tokenReadyDoor.unlock(), this.pingback && this.ping && this.ping.pingInit(), this.pingback && this.ping && QQWB.bind(QQWB.events.USER_LOGGEDIN_EVENT, this.ping.pingLoggedIn), this.pingback && this.ping && QQWB.bind(QQWB.events.USER_LOGIN_FAILED_EVENT, this.ping.pingLoggedInFailed), this
|
|
},
|
|
_tokenReadyDoor: QQWB.door.door(function() {
|
|
this.log.info("tokenReady
|
|
is locked")
|
|
}, function() {
|
|
this.log.info("tokenReady is
|
|
unlocked"), this._tokenReadyDoor.isOpen() && this.log.info("token
|
|
is
|
|
ready") && this.trigger(this.events.TOKEN_READY_EVENT)
|
|
}),
|
|
tokenReady: function(a) {
|
|
return
|
|
this._tokenReadyDoor.isOpen() ? a && a() : this.bind(this.events.TOKEN_READY_EVENT, a), this
|
|
},
|
|
_isDocumentReady: !1,
|
|
_tryToTriggerDocumentReadyEvents: function() {
|
|
if (this._isDocumentReady) return;
|
|
try {
|
|
var
|
|
a = document.getElementsByTagName("body")[0].appendChild(document.createElement("span"));
|
|
a.parentNode.removeChild(a)
|
|
} catch (b) {
|
|
return
|
|
}
|
|
this._isDocumentReady = !0, this.log.info("document
|
|
is
|
|
ready"), this._everythingReadyDoor.unlock(), this.trigger(this.events.DOCUMENT_READY_EVENT)
|
|
},
|
|
documentReady: function(a) {
|
|
return
|
|
this._isDocumentReady ? a && a() : (this.bind(this.events.DOCUMENT_READY_EVENT, a), this._tryToTriggerDocumentReadyEvents()), this
|
|
},
|
|
_everythingReadyDoor: QQWB.door.door(function() {
|
|
this.log.info("everythingReady
|
|
is
|
|
locked")
|
|
}, function() {
|
|
this.log.info("everythingReady
|
|
is
|
|
unlocked"), this._everythingReadyDoor.isOpen() && this.log.info("everything
|
|
is
|
|
ready") && this.trigger(this.events.EVERYTHING_READY_EVENT)
|
|
}),
|
|
everythingReady: function(a) {
|
|
return
|
|
this._everythingReadyDoor.isOpen() ? a && a() : this.bind(this.events.EVERYTHING_READY_EVENT, a), this
|
|
}
|
|
}), T.alias("ready", "everythingReady"), function() {
|
|
function
|
|
c() {
|
|
QQWB.browser.feature.postmessage ? QQWB._solution.initSolution(QQWB._solution.HTML5_SOLUTION) : QQWB.browser.feature.flash ? QQWB._solution.initSolution(QQWB._solution.FLASH_SOLUTION) : QQWB.log.error("init
|
|
solution is called, but no solution for the
|
|
browser")
|
|
}
|
|
var
|
|
a = window != window.parent,
|
|
b = QQWB._domain.serverproxy === window.location.href;
|
|
QQWB._tokenReadyDoor.lock(), QQWB._everythingReadyDoor.lock(), QQWB._everythingReadyDoor.lock(), QQWB.bind(QQWB.events.TOKEN_READY_EVENT, function() {
|
|
QQWB._everythingReadyDoor.unlock()
|
|
});
|
|
if (a && b && QQWB.browser.feature.postmessage) {
|
|
QQWB.log.info("library
|
|
booting at server proxy mode");
|
|
var
|
|
d = "*",
|
|
e = window.parent;
|
|
e.postMessage("success", d);
|
|
var
|
|
f = function(a) {
|
|
var
|
|
b = QQWB.JSON.fromString(a.data),
|
|
c = b.id,
|
|
f = b.data,
|
|
g = f[0];
|
|
f[2].toLowerCase() == "xml" && (f[2] = "xmltext"), g ? QQWB.io._apiAjax.apply(this, f).complete(function() {
|
|
e.postMessage(QQWB.JSON.stringify({
|
|
id: c,
|
|
data: QQWB.Array.fromArguments(arguments)
|
|
}), d)
|
|
}) : (e.postMessage(QQWB.JSON.stringify({
|
|
id: c,
|
|
data: [-1, "interface
|
|
can not be empty"]
|
|
}), d), QQWB.log.error("interface is
|
|
empty"))
|
|
};
|
|
window.addEventListener ? window.addEventListener("message", f, !1) : window.attachEvent && window.attachEvent("onmessage", f);
|
|
return
|
|
}
|
|
QQWB.log.info("library
|
|
booting at normal
|
|
mode"), c()
|
|
}(), QQWB._isDocumentReady || (window.addEventListener && document.addEventListener("DOMContentLoaded", function() {
|
|
QQWB._tryToTriggerDocumentReadyEvents()
|
|
}, !1), window.attachEvent && (document.attachEvent("onreadystatechange", function() {
|
|
/complete/.test(document.readyState) && (document.detachEvent("onreadystatechange", arguments.callee), QQWB._tryToTriggerDocumentReadyEvents())
|
|
}), window === window.top &&
|
|
function() {
|
|
if (QQWB._isDocumentReady) return;
|
|
try {
|
|
document.documentElement.doScroll("left")
|
|
} catch (a) {
|
|
setTimeout(arguments.callee, 0);
|
|
return
|
|
}
|
|
QQWB._tryToTriggerDocumentReadyEvents()
|
|
}()), QQWB.browser.webkit &&
|
|
function() {
|
|
if (QQWB._isDocumentReady) return;
|
|
if (!/load|complete/.test(document.readyState)) {
|
|
setTimeout(arguments.callee, 0);
|
|
return
|
|
}
|
|
QQWB._tryToTriggerDocumentReadyEvents()
|
|
}()), function() {
|
|
function
|
|
b() {
|
|
var
|
|
c = !! QQWB._token.getAccessToken(),
|
|
d;
|
|
a && QQWB.log.info("cancel
|
|
the **OLD** maintain token
|
|
schedule"), a && clearTimeout(a), c ? (d = parseInt(QQWB.cookie.get(QQWB._cookie.names.accessToken).split("|")[1], 10) - QQWB.time.now() - 15e3, QQWB.log.info("scheduled
|
|
to exchange token after
|
|
" + d + "ms"), a = setTimeout(function() {
|
|
QQWB._token.exchangeForToken(function() {
|
|
b()
|
|
})
|
|
}, d)) : (a && QQWB.log.info("cancel
|
|
the exchange token schedule"), a && clearTimeout(a))
|
|
}
|
|
var
|
|
a;
|
|
QQWB.bind(QQWB.events.TOKEN_READY_EVENT, b), QQWB.bind(QQWB.events.USER_LOGGEDIN_EVENT, b), QQWB.bind(QQWB.events.USER_LOGIN_FAILED_EVENT, b), QQWB.bind(QQWB.events.USER_LOGGEDOUT_EVENT, b)
|
|
}();
|
|
if (QQWB.browser.feature.localstorage) QQWB.extend("localStorage", {
|
|
set: function(a, b, c) {
|
|
a = "k" + a;
|
|
var
|
|
d = QQWB.time.secondsNow() + (c || 7) * 24 * 3600,
|
|
e = {
|
|
value: b,
|
|
expire: d
|
|
};
|
|
return
|
|
localStorage[a] = JSON.stringify(e), localStorage[a]
|
|
},
|
|
get: function(a, b) {
|
|
a = "k" + a;
|
|
var
|
|
c = localStorage[a];
|
|
return
|
|
c && (c = JSON.parse(c)) && c.value && QQWB.time.secondsNow() < c.expire ? c.value : b
|
|
},
|
|
del: function(a) {
|
|
return
|
|
a = "k" + a, localStorage.removeItem(a), !localStorage[a]
|
|
}
|
|
});
|
|
else if (QQWB.browser.feature.userdata) {
|
|
var
|
|
userData, storeName = "QQWBLocalStore";
|
|
QQWB.documentReady(function() {
|
|
userData = document.createElement("input"), userData.type = "hidden", userData.style.display = "none", userData.addBehavior("#default#userData"), userData.expires = (new
|
|
Date(QQWB.time.now() + 31536e7)).toUTCString(), document.body.appendChild(userData)
|
|
}), QQWB.extend("localStorage", {
|
|
set: function(a, b, c) {
|
|
a = "k" + a;
|
|
var
|
|
d = QQWB.time.secondsNow() + (c || 7) * 24 * 3600,
|
|
e = {
|
|
value: b,
|
|
expire: d
|
|
};
|
|
return !userData && QQWB.log.error("store
|
|
can't set value for key " + a + ", userData is
|
|
unavaiable, please try
|
|
later"), userData && userData.load(storeName), userData && userData.setAttribute(a, JSON.stringify(e)), userData && userData.save(storeName), userData.getAttribute(a)
|
|
},
|
|
get: function(a, b) {
|
|
a = "k" + a, !userData && QQWB.log.error("store
|
|
can't get value for key " + a + ", userData is
|
|
unavaiable, please try
|
|
later"), userData && userData.load(storeName);
|
|
var
|
|
c = userData && userData.getAttribute(a);
|
|
return
|
|
c && (c = JSON.parse(c)) && c.value && QQWB.time.secondsNow() < c.expire ? c.value : b
|
|
},
|
|
del: function(a) {
|
|
return
|
|
a = "k" + a, !userData && QQWB.log.error("store can't
|
|
delete value for key " + a + ", userData is unavaiable,
|
|
please try
|
|
later"), userData && userData.load(storeName), userData && userData.removeAttribute(a), userData && userData.save(storeName), !userData.getAttribute(a)
|
|
}
|
|
})
|
|
} else QQWB.log.warning("T.localStorage object isn't
|
|
initialized, do check before
|
|
use");
|
|
QQWB.localStorage && (QQWB._alias.call(QQWB.localStorage, "save", QQWB.localStorage.set), QQWB._alias.call(QQWB.localStorage, "remove", QQWB.localStorage.del)), QQWB.extend("auth.authWindow", {
|
|
_width: QQWB._const.AUTH_WINDOW_WIDTH,
|
|
_height: QQWB._const.AUTH_WINDOW_HEIGHT,
|
|
_name: QQWB._const.AUTH_WINDOW_NAME,
|
|
_url: QQWB._domain.auth,
|
|
_attribs: "toolbar=no,menubar=no,scrollbars=yes,resizable=yes,location=yes,status=no",
|
|
_authorizing: !1,
|
|
_window: null,
|
|
show: function() {
|
|
var
|
|
a, b, c, d;
|
|
return
|
|
this._authorizing ? this.focus() : (a = (window.screenX || window.screenLeft) + ((window.outerWidth || document.documentElement.clientWidth) - this._width) / 2, b = (window.screenY || window.screenTop) + ((window.outerHeight || document.documentElement.clientHeight) - this._height) / 2, c = QQWB.queryString.encode({
|
|
response_type: "token",
|
|
client_id: QQWB.appkey.value,
|
|
redirect_uri: QQWB._domain.clientproxy,
|
|
scope: "all",
|
|
status: 0
|
|
}), d = ["width=" + this._width, "height=" + this._height, "left=" + a, "top=" + b], this._window = window.open(this._url + "?" + c, this._name, d + "," + this._attribs), this._authorizing = !0, function() {
|
|
var
|
|
a = QQWB.auth.authWindow,
|
|
b;
|
|
if (a._window.closed) {
|
|
QQWB._token.resolveResponse("error=access_denied"), a.close();
|
|
return
|
|
}
|
|
try {
|
|
b = a._window.location.hash
|
|
} catch (c) {
|
|
b = null
|
|
}
|
|
if (b) {
|
|
b = QQWB.queryString.decode(b.split("#").pop()), parseInt(b.status, 10) == 200 && QQWB._token.resolveResponse(b), a.close();
|
|
return
|
|
}
|
|
setTimeout(arguments.callee, 0)
|
|
}()), this
|
|
},
|
|
close: function() {
|
|
return
|
|
this._authorizing = !1, this._window ? this._window.closed ? this : (this._window.close(), this) : this
|
|
},
|
|
focus: function() {
|
|
return
|
|
this._window && this._window.focus(), this
|
|
}
|
|
}), QQWB.extend("auth", {
|
|
login: function(a, b) {
|
|
QQWB._inited || QQWB.log.critical("Library
|
|
not initialized, call T.init() to initialize");
|
|
var
|
|
c = QQWB.loginStatus(),
|
|
d;
|
|
if (c && a) {
|
|
a(c);
|
|
return
|
|
}
|
|
if (a || b) d = function(c) {
|
|
c.access_token && a ? a(c) : c.error && b ? b(c) : QQWB.log.warning("confused
|
|
result of
|
|
T.login"), QQWB.unbind(QQWB.events.USER_LOGGEDIN_EVENT, d), QQWB.unbind(QQWB.events.USER_LOGIN_FAILED_EVENT, d), d = null
|
|
}, QQWB.bind(QQWB.events.USER_LOGGEDIN_EVENT, d), QQWB.bind(QQWB.events.USER_LOGIN_FAILED_EVENT, d);
|
|
return
|
|
QQWB.auth.authWindow.show().focus(), QQWB
|
|
},
|
|
logout: function(a) {
|
|
var
|
|
b = QQWB.loginStatus();
|
|
return QQWB.log.info("logging
|
|
out
|
|
user..."), b ? (QQWB._token.clearAccessToken(), QQWB._token.clearRefreshToken(), QQWB.log.info(b.name + "
|
|
has logged out
|
|
successfully")) : QQWB.log.warning("oops, user not
|
|
logged
|
|
in"), a && a.call(QQWB), QQWB.trigger(QQWB.events.USER_LOGGEDOUT_EVENT), QQWB
|
|
},
|
|
loginStatus: function(a) {
|
|
var
|
|
b, c = QQWB._token.getAccessToken(),
|
|
d = QQWB._token.getTokenUser();
|
|
return
|
|
c && (b = {
|
|
access_token: c,
|
|
name: d.name,
|
|
nick: d.nick
|
|
}), a && a.call(QQWB, b), b
|
|
}
|
|
}), QQWB._alias("login", QQWB.auth.login), QQWB._alias("logout", QQWB.auth.logout), QQWB._alias("loginStatus", QQWB.auth.loginStatus), QQWB.provide("api", function(a, b, c, d, e) {
|
|
a = this._apiProvider.compat(a), b = b || {}, c = (c || "json").toLowerCase(), d = d || "GET";
|
|
var
|
|
f, g, h = c,
|
|
i = {
|
|
json: !0,
|
|
xml: !0
|
|
},
|
|
j = QQWB.deferred.deferred();
|
|
h in i || (h = "json"), b.oauth_consumer_key = QQWB.appkey.value, b.oauth_token = QQWB._token.getAccessToken(), b.oauth_version = "2.0", b.format = h, f = j.promise(), e && QQWB.Array.inArray([QQWB._solution.HTML5_SOLUTION, QQWB._solution.FLASH_SOLUTION, QQWB._solution.SILVER_LIGHT_SOLUTION], e) ? (QQWB.log.warning("forced
|
|
to use solution
|
|
" + e), QQWB._solution[e] || (QQWB.log.warning("forced
|
|
to use solution " + e + ", this solution is not inited,
|
|
initialzing..."), QQWB._solution.initSolution[e]), g = QQWB._solution[e]) : g = QQWB.browser.feature.postmessage && QQWB._solution[QQWB._solution.HTML5_SOLUTION] || QQWB.browser.feature.flash && QQWB._solution[QQWB._solution.FLASH_SOLUTION] || QQWB.browser.feature.silverlight && QQWB._solution[QQWB._solution.SILVER_LIGHT_SOLUTION];
|
|
if (!g || g.readyState === 2) return
|
|
QQWB.log.critical("solution
|
|
error"), j.reject(-1, "solution
|
|
error", 0), f;
|
|
if (g.readyState === 0) return
|
|
QQWB.log.warning("solution is not ready, your api
|
|
call request has been cached, will invoke
|
|
immediately when solution is
|
|
ready"), g.promise.done(function() {
|
|
QQWB.log.info('invoking
|
|
cached api call "QQWB.api( ' + [a, b, c, d].join(",") + '
|
|
)"...'), QQWB.api(a, b, c, d).success(function() {
|
|
j.resolveWith(j, QQWB.Array.fromArguments(arguments))
|
|
}).error(function() {
|
|
j.rejectWith(j, QQWB.Array.fromArguments(arguments))
|
|
})
|
|
}).fail(function() {
|
|
QQWB.log.error("can't
|
|
invoking cached api call \"QQWB.api(
|
|
" + [a, b, c, d].join(",") + '
|
|
)"'), j.rejectWith(j, QQWB.Array.fromArguments(arguments))
|
|
}), f;
|
|
QQWB.api.id || QQWB.extend(QQWB.api, {
|
|
id: 0,
|
|
total: function() {
|
|
return
|
|
QQWB.api.id
|
|
}
|
|
}), QQWB.api.id++, QQWB.log.info("[" + QQWB.api.id + ']
|
|
requesting data "' + QQWB._apiProvider.describe(a) + '"
|
|
from
|
|
server...');
|
|
if (g === QQWB._solution[QQWB._solution.HTML5_SOLUTION]) {
|
|
var
|
|
k = document.getElementById(g.id);
|
|
if (!k) QQWB.log.critical("server
|
|
proxy not found"), j.reject(-1, "server proxy not
|
|
found", 0);
|
|
else if (k.src !== QQWB._domain.serverproxy) QQWB.log.critical("server
|
|
proxy is not valid, src attribute has unexpected
|
|
value"), j.reject(-1, "server proxy not
|
|
valid", 0);
|
|
else {
|
|
QQWB.api._deferredCollection || QQWB.extend(QQWB.api, {
|
|
_deferredCollection: {},
|
|
deferredAt: function(a) {
|
|
if (this._deferredCollection[a]) return
|
|
this._deferredCollection[a];
|
|
QQWB.log.warning("get
|
|
deferred object has failed, that object does not
|
|
exist at index
|
|
" + a)
|
|
},
|
|
uncollect: function(a) {
|
|
this._deferredCollection[a] ? delete
|
|
this._deferredCollection[a] : QQWB.log.warning("uncollect
|
|
deferred object has failed, that object does not
|
|
exist at index
|
|
" + a)
|
|
},
|
|
collect: function(a) {
|
|
if (a.promise) return
|
|
this._deferredCollection[this.id] = a, this.id;
|
|
QQWB.log.warning("collect
|
|
a non-deferred object is
|
|
illegal")
|
|
}
|
|
}), QQWB.api.messageHandler || (QQWB.provide("api.messageHandler", function(a) {
|
|
if (QQWB._domain.serverproxy.indexOf(a.origin) !== 0) QQWB.log.warning("unexpected
|
|
message arrived from " + a.origin + " with data
|
|
" + a.data);
|
|
else {
|
|
var
|
|
b = QQWB.JSON.fromString(a.data),
|
|
c = b.id,
|
|
d = QQWB.api.deferredAt(c),
|
|
e = b.data;
|
|
d ? (e[0] !== 200 ? d.reject.apply(d, e) : (e[5] == "xmltext" && (e[3] = QQWB.XML.fromString(e[3])), d.resolve(e[3], e[2], e[4])), QQWB.api.uncollect(c)) : QQWB.log.warning("related
|
|
deferred object not found, it shouldn't
|
|
happen")
|
|
}
|
|
}), window.addEventListener ? window.addEventListener("message", QQWB.api.messageHandler, !1) : window.attachEvent && window.attachEvent("onmessage", QQWB.api.messageHandler));
|
|
try {
|
|
var
|
|
l = QQWB.api.collect(j);
|
|
setTimeout(function() {
|
|
k.contentWindow.postMessage(QQWB.JSON.stringify({
|
|
id: l,
|
|
data: [a, b, c, d]
|
|
}), QQWB._domain.serverproxy)
|
|
}, 0)
|
|
} catch (m) {
|
|
QQWB.log.critical("post
|
|
message to server proxy has failed,
|
|
" + m), j.reject(-1, m, 0)
|
|
}
|
|
}
|
|
} else g === QQWB._solution[QQWB._solution.FLASH_SOLUTION] && QQWB.io._apiFlashAjax(a, b, c, d).complete(function() {
|
|
var
|
|
a = QQWB.Array.fromArguments(arguments);
|
|
a[0] !== 200 ? j.reject.apply(j, a) : j.resolve(a[3], a[2], a[4])
|
|
});
|
|
return
|
|
|
|
function() {
|
|
var
|
|
e = QQWB.api.id;
|
|
f.complete(function() {
|
|
QQWB.log.info("*[" + e + "]
|
|
done"), e = null
|
|
});
|
|
if (QQWB.pingback && QQWB.ping) {
|
|
function
|
|
h(e, f, h) {
|
|
QQWB.ping.pingAPI(a, QQWB.queryString.encode(b), c, d, e, f, h, g.name)
|
|
}
|
|
f.success(function(a, b) {
|
|
h(200, "ok", b)
|
|
}), f.fail(function(a, b, c) {
|
|
h(a, b, c)
|
|
})
|
|
}
|
|
}(), f
|
|
})
|
|
/*
|
|
|xGv00|6d5d6ce9717937b567ca32a7f3d7c7d0 */
|
|
|