Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
weixin_46011646
wechaty
提交
1bdc7613
W
wechaty
项目概览
weixin_46011646
/
wechaty
与 Fork 源项目一致
Fork自
wechaty / wechaty
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
W
wechaty
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
1bdc7613
编写于
11月 16, 2016
作者:
C
cherry-geqi
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
convert wechaty-bro.js to plain old javascript syntax in favour of phantomjs
上级
fc8d833f
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
437 addition
and
425 deletion
+437
-425
src/puppet-web/wechaty-bro.js
src/puppet-web/wechaty-bro.js
+437
-425
未找到文件。
src/puppet-web/wechaty-bro.js
浏览文件 @
1bdc7613
...
...
@@ -28,48 +28,49 @@
/*global angular*/
(
function
(
port
)
{
(
function
(
port
)
{
function
init
()
{
if
(
!
angularIsReady
())
{
retObj
.
code
=
503
// 503 SERVICE UNAVAILABLE https://httpstatuses.com/503
retObj
.
message
=
'
init() without a ready angular env
'
return
retObj
retObj
.
code
=
503
;
// 503 SERVICE UNAVAILABLE https://httpstatuses.com/503
retObj
.
message
=
'
init() without a ready angular env
'
;
return
retObj
;
}
if
(
!
initClog
(
false
))
{
// make console.log work (wxapp disabled the console.log)
retObj
.
code
=
503
// 503 Service Unavailable http://www.restapitutorial.com/httpstatuscodes.html
retObj
.
message
=
'
initClog fail
'
return
retObj
if
(
!
initClog
(
false
))
{
// make console.log work (wxapp disabled the console.log)
retObj
.
code
=
503
;
// 503 Service Unavailable http://www.restapitutorial.com/httpstatuscodes.html
retObj
.
message
=
'
initClog fail
'
;
return
retObj
;
}
if
(
WechatyBro
.
vars
.
initStatus
===
true
)
{
log
(
'
WechatyBro.init() called twice: already inited
'
)
retObj
.
code
=
304
// 304 Not Modified https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5
retObj
.
message
=
'
init() already inited before. returned with do nothing
'
return
retObj
log
(
'
WechatyBro.init() called twice: already inited
'
)
;
retObj
.
code
=
304
;
// 304 Not Modified https://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html#sec10.3.5
retObj
.
message
=
'
init() already inited before. returned with do nothing
'
;
return
retObj
;
}
clog
(
'
init on port:
'
+
port
)
clog
(
'
init on port:
'
+
port
)
;
if
(
MMCgiLogined
())
{
login
(
'
page refresh
'
)
login
(
'
page refresh
'
)
;
}
glueToAngular
()
connectSocket
()
hookEvents
()
glueToAngular
()
;
connectSocket
()
;
hookEvents
()
;
checkScan
()
checkScan
()
;
heartBeat
(
true
)
heartBeat
(
true
)
;
clog
(
'
inited!. ;-D
'
)
WechatyBro
.
vars
.
initStatus
=
true
clog
(
'
inited!. ;-D
'
)
;
WechatyBro
.
vars
.
initStatus
=
true
;
retObj
.
code
=
200
retObj
.
message
=
'
WechatyBro Init Succ on port:
'
+
port
return
retObj
retObj
.
code
=
200
;
retObj
.
message
=
'
WechatyBro Init Succ on port:
'
+
port
;
return
retObj
;
}
/**
...
...
@@ -78,81 +79,92 @@
*/
function
initClog
(
enabled
)
{
if
(
!
enabled
)
{
return
true
return
true
;
}
if
(
WechatyBro
.
vars
.
iframe
)
{
log
(
'
initClog() again? there is already a iframe
'
)
return
true
log
(
'
initClog() again? there is already a iframe
'
)
;
return
true
;
}
if
(
!
document
.
body
)
{
// Javascript Error Null is not an Object
if
(
!
document
.
body
)
{
// Javascript Error Null is not an Object
// log('initClog() not ready because document.body not ready')
return
false
return
false
;
}
var
i
=
document
.
createElement
(
'
iframe
'
)
var
i
=
document
.
createElement
(
'
iframe
'
)
;
if
(
!
i
)
{
// log('initClog() not ready because document.createElement fail')
return
false
return
false
;
}
// slog('initClog got iframe element')
i
.
style
.
display
=
'
none
'
document
.
body
.
appendChild
(
i
)
WechatyBro
.
vars
.
iframe
=
i
i
.
style
.
display
=
'
none
'
;
document
.
body
.
appendChild
(
i
)
;
WechatyBro
.
vars
.
iframe
=
i
;
// if (!WechatyBro.vars.iframe) {
// throw new Error('iframe gone after appendChild, WTF???')
// }
// slog('initClog done')
return
true
return
true
;
}
function
clog
(
s
)
{
if
(
!
WechatyBro
.
vars
.
iframe
)
{
// throw new Error('clog() iframe not found when be invocked')
return
return
;
}
var
d
=
new
Date
()
s
=
d
.
getHours
()
+
'
:
'
+
d
.
getMinutes
()
+
'
:
'
+
d
.
getSeconds
()
+
'
<WechatyBro>
'
+
s
var
d
=
new
Date
()
;
s
=
d
.
getHours
()
+
'
:
'
+
d
.
getMinutes
()
+
'
:
'
+
d
.
getSeconds
()
+
'
<WechatyBro>
'
+
s
;
WechatyBro
.
vars
.
iframe
.
contentWindow
.
console
.
log
(
s
)
WechatyBro
.
vars
.
iframe
.
contentWindow
.
console
.
log
(
s
)
;
}
function
slog
(
msg
)
{
WechatyBro
.
emit
(
'
log
'
,
msg
)
}
function
log
(
s
)
{
clog
(
s
);
slog
(
s
)
}
function
slog
(
msg
)
{
WechatyBro
.
emit
(
'
log
'
,
msg
);
}
function
log
(
s
)
{
clog
(
s
);
slog
(
s
);
}
/**
* WechatyBro.emit, will save event & data when there's no socket io connection to prevent event lost
* NOTICE: only clog available here, because slog & log will call emit, death loop
*/
function
emit
(
event
,
data
)
{
var
eventsBuf
=
WechatyBro
.
vars
.
eventsBuf
var
eventsBuf
=
WechatyBro
.
vars
.
eventsBuf
;
if
(
!
eventsBuf
.
map
)
{
throw
new
Error
(
'
WechatyBro.vars.eventsBuf must be a Array
'
)
throw
new
Error
(
'
WechatyBro.vars.eventsBuf must be a Array
'
)
;
}
if
(
event
)
{
eventsBuf
.
unshift
([
event
,
data
])
eventsBuf
.
unshift
([
event
,
data
])
;
}
var
socket
=
WechatyBro
.
vars
.
socket
var
socket
=
WechatyBro
.
vars
.
socket
;
if
(
!
socket
)
{
clog
(
'
WechatyBro.vars.socket not ready
'
)
return
setTimeout
(
emit
,
1000
)
// resent eventsBuf after 1000ms
clog
(
'
WechatyBro.vars.socket not ready
'
)
;
return
setTimeout
(
emit
,
1000
)
;
// resent eventsBuf after 1000ms
}
var
bufLen
=
eventsBuf
.
length
var
bufLen
=
eventsBuf
.
length
;
if
(
bufLen
)
{
if
(
bufLen
>
1
)
{
clog
(
'
WechatyBro.vars.eventsBuf has
'
+
bufLen
+
'
unsend events
'
)
}
if
(
bufLen
>
1
)
{
clog
(
'
WechatyBro.vars.eventsBuf has
'
+
bufLen
+
'
unsend events
'
);
}
while
(
eventsBuf
.
length
)
{
var
eventData
=
eventsBuf
.
pop
()
if
(
eventData
&&
eventData
.
map
&&
eventData
.
length
===
2
)
{
clog
(
'
emiting
'
+
eventData
[
0
])
socket
.
emit
(
eventData
[
0
],
eventData
[
1
])
}
else
{
clog
(
'
WechatyBro.emit() got invalid eventData:
'
+
eventData
[
0
]
+
'
,
'
+
eventData
[
1
]
+
'
, length:
'
+
eventData
.
length
)
}
var
eventData
=
eventsBuf
.
pop
();
if
(
eventData
&&
eventData
.
map
&&
eventData
.
length
===
2
)
{
clog
(
'
emiting
'
+
eventData
[
0
]);
socket
.
emit
(
eventData
[
0
],
eventData
[
1
]);
}
else
{
clog
(
'
WechatyBro.emit() got invalid eventData:
'
+
eventData
[
0
]
+
'
,
'
+
eventData
[
1
]
+
'
, length:
'
+
eventData
.
length
);
}
}
if
(
bufLen
>
1
)
{
clog
(
'
WechatyBro.vars.eventsBuf[
'
+
bufLen
+
'
] all sent
'
)
}
if
(
bufLen
>
1
)
{
clog
(
'
WechatyBro.vars.eventsBuf[
'
+
bufLen
+
'
] all sent
'
);
}
}
}
...
...
@@ -161,118 +173,115 @@
* Functions that Glued with AngularJS
*
*/
function
MMCgiLogined
()
{
return
!!
(
window
.
MMCgi
&&
window
.
MMCgi
.
isLogin
)
}
function
MMCgiLogined
()
{
return
!!
(
window
.
MMCgi
&&
window
.
MMCgi
.
isLogin
);
}
function
angularIsReady
()
{
// don't log inside, because we has not yet init clog here.
return
!!
(
(
typeof
angular
)
!==
'
undefined
'
&&
angular
.
element
&&
angular
.
element
(
'
body
'
)
&&
angular
.
element
(
document
).
injector
()
)
return
!!
(
typeof
angular
!==
'
undefined
'
&&
angular
.
element
&&
angular
.
element
(
'
body
'
)
&&
angular
.
element
(
document
).
injector
());
}
function
heartBeat
(
firstTime
)
{
var
TIMEOUT
=
15000
// 15s
var
TIMEOUT
=
15000
;
// 15s
if
(
firstTime
&&
WechatyBro
.
vars
.
heartBeatTimmer
)
{
WechatyBro
.
log
(
'
heartBeat timer exist when 1st time is true? return for do nothing
'
)
return
WechatyBro
.
log
(
'
heartBeat timer exist when 1st time is true? return for do nothing
'
)
;
return
;
}
WechatyBro
.
emit
(
'
ding
'
,
'
heartbeat@browser
'
)
WechatyBro
.
vars
.
heartBeatTimmer
=
setTimeout
(
heartBeat
,
TIMEOUT
)
return
TIMEOUT
WechatyBro
.
emit
(
'
ding
'
,
'
heartbeat@browser
'
)
;
WechatyBro
.
vars
.
heartBeatTimmer
=
setTimeout
(
heartBeat
,
TIMEOUT
)
;
return
TIMEOUT
;
}
function
glueToAngular
()
{
var
injector
=
angular
.
element
(
document
).
injector
()
var
injector
=
angular
.
element
(
document
).
injector
();
if
(
!
injector
)
{
throw
new
Error
(
'
glueToAngular cant get injector(right now)
'
)
}
var
accountFactory
=
injector
.
get
(
'
accountFactory
'
)
var
appFactory
=
injector
.
get
(
'
appFactory
'
)
var
chatroomFactory
=
injector
.
get
(
'
chatroomFactory
'
)
var
chatFactory
=
injector
.
get
(
'
chatFactory
'
)
var
contactFactory
=
injector
.
get
(
'
contactFactory
'
)
var
confFactory
=
injector
.
get
(
'
confFactory
'
)
var
emojiFactory
=
injector
.
get
(
'
emojiFactory
'
)
var
loginFactory
=
injector
.
get
(
'
loginFactory
'
)
var
http
=
injector
.
get
(
'
$http
'
)
var
state
=
injector
.
get
(
'
$state
'
)
var
mmHttp
=
injector
.
get
(
'
mmHttp
'
)
var
appScope
=
angular
.
element
(
'
[ng-controller="appController"]
'
).
scope
()
var
rootScope
=
injector
.
get
(
'
$rootScope
'
)
var
loginScope
=
angular
.
element
(
'
[ng-controller="loginController"]
'
).
scope
()
/*
// method 1
appFactory.syncOrig = appFactory.sync
appFactory.syncCheckOrig = appFactory.syncCheck
appFactory.sync = function() { WechatyBro.log('appFactory.sync() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return appFactory.syncOrig(arguments) }
appFactory.syncCheck = function() { WechatyBro.log('appFactory.syncCheck() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return appFactory.syncCheckOrig(arguments) }
// method 2
$.ajaxOrig = $.ajax
$.ajax = function() { WechatyBro.log('$.ajax() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return $.ajaxOrig(arguments) }
$.ajax({
url: "https://wx.qq.com/zh_CN/htmledition/v2/images/webwxgeticon.jpg"
, type: "GET"
}).done(function (response) {
alert("success");
})
// method 3 - mmHttp
mmHttp.getOrig = mmHttp.get
mmHttp.get = function() { WechatyBro.log('mmHttp.get() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return mmHttp.getOrig(arguments) }
*/
throw
new
Error
(
'
glueToAngular cant get injector(right now)
'
)
;
}
var
accountFactory
=
injector
.
get
(
'
accountFactory
'
);
var
appFactory
=
injector
.
get
(
'
appFactory
'
);
var
chatroomFactory
=
injector
.
get
(
'
chatroomFactory
'
)
;
var
chatFactory
=
injector
.
get
(
'
chatFactory
'
);
var
contactFactory
=
injector
.
get
(
'
contactFactory
'
);
var
confFactory
=
injector
.
get
(
'
confFactory
'
);
var
emojiFactory
=
injector
.
get
(
'
emojiFactory
'
);
var
loginFactory
=
injector
.
get
(
'
loginFactory
'
);
var
http
=
injector
.
get
(
'
$http
'
);
var
state
=
injector
.
get
(
'
$state
'
);
var
mmHttp
=
injector
.
get
(
'
mmHttp
'
);
var
appScope
=
angular
.
element
(
'
[ng-controller="appController"]
'
).
scope
();
var
rootScope
=
injector
.
get
(
'
$rootScope
'
);
var
loginScope
=
angular
.
element
(
'
[ng-controller="loginController"]
'
).
scope
();
/*
// method 1
appFactory.syncOrig = appFactory.sync
appFactory.syncCheckOrig = appFactory.syncCheck
appFactory.sync = function() { WechatyBro.log('appFactory.sync() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return appFactory.syncOrig(arguments) }
appFactory.syncCheck = function() { WechatyBro.log('appFactory.syncCheck() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return appFactory.syncCheckOrig(arguments) }
// method 2
$.ajaxOrig = $.ajax
$.ajax = function() { WechatyBro.log('$.ajax() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return $.ajaxOrig(arguments) }
$.ajax({
url: "https://wx.qq.com/zh_CN/htmledition/v2/images/webwxgeticon.jpg"
, type: "GET"
}).done(function (response) {
alert("success");
})
// method 3 - mmHttp
mmHttp.getOrig = mmHttp.get
mmHttp.get = function() { WechatyBro.log('mmHttp.get() !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!'); return mmHttp.getOrig(arguments) }
*/
/**
* generate $scope with a contoller (as it is not assigned in html staticly)
* https://github.com/angular/angular.js/blob/a4e60cb6970d8b6fa9e0af4b9f881ee3ba7fdc99/test/ng/controllerSpec.js#L24
*/
var
contentChatScope
=
rootScope
.
$new
()
injector
.
get
(
'
$controller
'
)(
'
contentChatController
'
,
{
$scope
:
contentChatScope
})
var
contentChatScope
=
rootScope
.
$new
();
injector
.
get
(
'
$controller
'
)(
'
contentChatController
'
,
{
$scope
:
contentChatScope
});
// get all we need from wx in browser(angularjs)
WechatyBro
.
glue
=
{
injector
:
injector
,
http
:
http
,
mmHttp
,
state
injector
:
injector
,
http
:
http
,
mmHttp
:
mmHttp
,
state
:
state
,
,
accountFactory
:
accountFactory
,
chatroomFactory
,
chatFactory
:
chatFactory
,
confFactory
:
confFactory
,
contactFactory
:
contactFactory
,
emojiFactory
,
loginFactory
:
loginFactory
accountFactory
:
accountFactory
,
chatroomFactory
:
chatroomFactory
,
chatFactory
:
chatFactory
,
confFactory
:
confFactory
,
contactFactory
:
contactFactory
,
emojiFactory
:
emojiFactory
,
loginFactory
:
loginFactory
,
,
rootScope
:
rootScope
,
appScope
:
appScope
,
loginScope
:
loginScope
rootScope
:
rootScope
,
appScope
:
appScope
,
loginScope
:
loginScope
,
,
contentChatScope
:
contentChatScope
}
contentChatScope
:
contentChatScope
}
;
return
true
return
true
;
}
function
checkScan
()
{
clog
(
'
checkScan()
'
)
clog
(
'
checkScan()
'
)
;
if
(
isLogin
())
{
log
(
'
checkScan() - already login, no more check, and return(only)
'
)
//but I will emit a login event')
log
(
'
checkScan() - already login, no more check, and return(only)
'
)
;
//but I will emit a login event')
// login('checkScan found already login')
return
return
;
}
if
(
!
WechatyBro
.
glue
.
loginScope
)
{
log
(
'
checkScan() - loginScope disappeared, no more check
'
)
login
(
'
loginScope disappeared
'
)
return
log
(
'
checkScan() - loginScope disappeared, no more check
'
)
;
login
(
'
loginScope disappeared
'
)
;
return
;
}
// loginScope.code:
...
...
@@ -280,114 +289,119 @@
// 408: 未确认(显示二维码后30秒触发)
// 201: 扫描,未确认
// 200: 登录成功
var
code
=
+
WechatyBro
.
glue
.
loginScope
.
code
var
url
=
WechatyBro
.
glue
.
loginScope
.
qrcodeUrl
var
code
=
+
WechatyBro
.
glue
.
loginScope
.
code
;
var
url
=
WechatyBro
.
glue
.
loginScope
.
qrcodeUrl
;
if
(
url
&&
code
!==
WechatyBro
.
vars
.
scanCode
)
{
log
(
'
checkScan() - code change detected: from
'
+
WechatyBro
.
vars
.
scanCode
+
'
to
'
+
code
)
log
(
'
checkScan() - code change detected: from
'
+
WechatyBro
.
vars
.
scanCode
+
'
to
'
+
code
);
WechatyBro
.
emit
(
'
scan
'
,
{
code
:
code
,
url
:
url
})
WechatyBro
.
vars
.
scanCode
=
code
code
:
code
,
url
:
url
})
;
WechatyBro
.
vars
.
scanCode
=
code
;
}
if
(
code
===
200
)
{
login
(
'
scan code 200
'
)
login
(
'
scan code 200
'
)
;
}
else
{
setTimeout
(
checkScan
,
1000
)
setTimeout
(
checkScan
,
1000
)
;
}
return
return
;
}
function
isLogin
()
{
return
!!
WechatyBro
.
vars
.
loginStatus
}
function
isLogin
()
{
return
!!
WechatyBro
.
vars
.
loginStatus
;
}
function
login
(
data
)
{
log
(
'
login(
'
+
data
+
'
)
'
)
log
(
'
login(
'
+
data
+
'
)
'
)
;
if
(
!
WechatyBro
.
vars
.
loginStatus
)
{
WechatyBro
.
vars
.
loginStatus
=
true
WechatyBro
.
vars
.
loginStatus
=
true
;
}
WechatyBro
.
emit
(
'
login
'
,
data
)
WechatyBro
.
emit
(
'
login
'
,
data
)
;
}
function
logout
(
data
)
{
log
(
'
logout(
'
+
data
+
'
)
'
)
WechatyBro
.
vars
.
loginStatus
=
false
log
(
'
logout(
'
+
data
+
'
)
'
)
;
WechatyBro
.
vars
.
loginStatus
=
false
;
// WechatyBro.emit('logout', data)
if
(
WechatyBro
.
glue
.
loginFactory
)
{
WechatyBro
.
glue
.
loginFactory
.
loginout
()
WechatyBro
.
glue
.
loginFactory
.
loginout
()
;
}
checkScan
()
checkScan
()
;
}
function
quit
()
{
log
(
'
quit()
'
)
logout
(
'
quit()
'
)
log
(
'
quit()
'
)
;
logout
(
'
quit()
'
)
;
if
(
WechatyBro
.
vars
.
socket
)
{
WechatyBro
.
vars
.
socket
.
close
()
WechatyBro
.
vars
.
socket
=
null
WechatyBro
.
vars
.
socket
.
close
()
;
WechatyBro
.
vars
.
socket
=
null
;
}
}
function
ding
(
data
)
{
log
(
'
recv ding
'
);
return
data
||
'
dong
'
}
function
ding
(
data
)
{
log
(
'
recv ding
'
);
return
data
||
'
dong
'
;
}
function
hookEvents
()
{
var
rootScope
=
WechatyBro
.
glue
.
rootScope
var
appScope
=
WechatyBro
.
glue
.
appScope
var
rootScope
=
WechatyBro
.
glue
.
rootScope
;
var
appScope
=
WechatyBro
.
glue
.
appScope
;
if
(
!
rootScope
||
!
appScope
)
{
log
(
'
hookEvents() no rootScope
'
)
return
false
log
(
'
hookEvents() no rootScope
'
)
;
return
false
;
}
rootScope
.
$on
(
'
message:add:success
'
,
function
(
event
,
data
)
{
if
(
!
isLogin
())
{
// in case of we missed the pageInit event
login
(
'
by event[message:add:success]
'
)
rootScope
.
$on
(
'
message:add:success
'
,
function
(
event
,
data
)
{
if
(
!
isLogin
())
{
// in case of we missed the pageInit event
login
(
'
by event[message:add:success]
'
);
}
WechatyBro
.
emit
(
'
message
'
,
data
)
})
WechatyBro
.
emit
(
'
message
'
,
data
)
;
})
;
rootScope
.
$on
(
'
root:pageInit:success
'
),
function
(
event
,
data
)
{
login
(
'
by event[root:pageInit:success]
'
)
}
login
(
'
by event[root:pageInit:success]
'
)
;
}
;
// newLoginPage seems not stand for a user login action
// appScope.$on("newLoginPage", function(event, data) {
// login('by event[newLoginPage]')
// })
window
.
addEventListener
(
'
unload
'
,
function
(
e
)
{
window
.
addEventListener
(
'
unload
'
,
function
(
e
)
{
// XXX only 1 event can be emitted here???
WechatyBro
.
emit
(
'
unload
'
,
String
(
e
))
WechatyBro
.
emit
(
'
unload
'
,
String
(
e
))
;
// WechatyBro.slog('emit unload')
// WechatyBro.emit('logout', e)
// WechatyBro.slog('emit logout')
// WechatyBro.slog('emit logout&unload over')
})
return
true
})
;
return
true
;
}
function
connectSocket
()
{
log
(
'
connectSocket()
'
)
log
(
'
connectSocket()
'
)
;
if
(
typeof
io
!==
'
function
'
)
{
log
(
'
connectSocket: io not found. loading lib...
'
)
log
(
'
connectSocket: io not found. loading lib...
'
)
;
// http://stackoverflow.com/a/3248500/1123955
var
script
=
document
.
createElement
(
'
script
'
)
script
.
onload
=
function
()
{
log
(
'
socket io lib loaded.
'
)
connectSocket
()
}
script
.
src
=
'
//cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.min.js
'
document
.
getElementsByTagName
(
'
head
'
)[
0
].
appendChild
(
script
)
return
// wait to be called via script.onload()
var
script
=
document
.
createElement
(
'
script
'
)
;
script
.
onload
=
function
()
{
log
(
'
socket io lib loaded.
'
)
;
connectSocket
()
;
}
;
script
.
src
=
'
//cdnjs.cloudflare.com/ajax/libs/socket.io/1.4.5/socket.io.min.js
'
;
document
.
getElementsByTagName
(
'
head
'
)[
0
].
appendChild
(
script
)
;
return
;
// wait to be called via script.onload()
}
/*global io*/
// WechatyBro global variable: socket
var
socket
=
WechatyBro
.
vars
.
socket
=
io
.
connect
(
'
wss://127.0.0.1:
'
+
port
/*, {transports: ['websocket']}*/
)
var
socket
=
WechatyBro
.
vars
.
socket
=
io
.
connect
(
'
wss://127.0.0.1:
'
+
port
/*, {transports: ['websocket']}*/
);
// ding -> dong. for test & live check purpose
// ping/pong are reserved by socket.io https://github.com/socketio/socket.io/issues/2414
socket
.
on
(
'
ding
'
,
function
(
data
)
{
log
(
'
received socket io event: ding(
'
+
data
+
'
). emit dong...
'
)
socket
.
emit
(
'
dong
'
,
data
)
})
socket
.
on
(
'
ding
'
,
function
(
data
)
{
log
(
'
received socket io event: ding(
'
+
data
+
'
). emit dong...
'
)
;
socket
.
emit
(
'
dong
'
,
data
)
;
})
;
socket
.
on
(
'
connect
'
,
function
(
e
)
{
clog
(
'
connected to server:
'
+
e
)
})
socket
.
on
(
'
disconnect
'
,
function
(
e
)
{
clog
(
'
socket disconnect:
'
+
e
)
})
socket
.
on
(
'
connect
'
,
function
(
e
)
{
clog
(
'
connected to server:
'
+
e
);
});
socket
.
on
(
'
disconnect
'
,
function
(
e
)
{
clog
(
'
socket disconnect:
'
+
e
);
});
}
/**
...
...
@@ -397,177 +411,184 @@
* getMsgImg(message.MsgId,'big',message)
*/
function
getMsgImg
(
id
,
type
,
message
)
{
var
contentChatScope
=
WechatyBro
.
glue
.
contentChatScope
var
contentChatScope
=
WechatyBro
.
glue
.
contentChatScope
;
if
(
!
contentChatScope
)
{
throw
new
Error
(
'
getMsgImg() contentChatScope not found
'
)
throw
new
Error
(
'
getMsgImg() contentChatScope not found
'
)
;
}
var
location
=
window
.
location
.
href
.
replace
(
/
\/
$/
,
''
)
var
path
=
contentChatScope
.
getMsgImg
(
id
,
type
,
message
)
return
location
+
path
var
location
=
window
.
location
.
href
.
replace
(
/
\/
$/
,
''
)
;
var
path
=
contentChatScope
.
getMsgImg
(
id
,
type
,
message
)
;
return
location
+
path
;
}
function
getMsgEmoticon
(
id
)
{
var
chatFactory
=
WechatyBro
.
glue
.
chatFactory
var
chatFactory
=
WechatyBro
.
glue
.
chatFactory
;
var
message
=
chatFactory
.
getMsg
(
id
)
return
message
.
MMPreviewSrc
||
getMsgImg
(
message
.
MsgId
,
'
big
'
,
message
)
||
message
.
MMThumbSrc
var
message
=
chatFactory
.
getMsg
(
id
)
;
return
message
.
MMPreviewSrc
||
getMsgImg
(
message
.
MsgId
,
'
big
'
,
message
)
||
message
.
MMThumbSrc
;
}
function
getMsgVideo
(
id
)
{
var
contentChatScope
=
WechatyBro
.
glue
.
contentChatScope
var
contentChatScope
=
WechatyBro
.
glue
.
contentChatScope
;
if
(
!
contentChatScope
)
{
throw
new
Error
(
'
getMsgVideo() contentChatScope not found
'
)
throw
new
Error
(
'
getMsgVideo() contentChatScope not found
'
)
;
}
var
location
=
window
.
location
.
href
.
replace
(
/
\/
$/
,
''
)
var
path
=
contentChatScope
.
getMsgVideo
(
id
)
return
location
+
path
var
location
=
window
.
location
.
href
.
replace
(
/
\/
$/
,
''
)
;
var
path
=
contentChatScope
.
getMsgVideo
(
id
)
;
return
location
+
path
;
}
/**
* from playVoice()
*/
function
getMsgVoice
(
id
)
{
var
confFactory
=
WechatyBro
.
glue
.
confFactory
var
accountFactory
=
WechatyBro
.
glue
.
accountFactory
var
confFactory
=
WechatyBro
.
glue
.
confFactory
;
var
accountFactory
=
WechatyBro
.
glue
.
accountFactory
;
var
location
=
window
.
location
.
href
.
replace
(
/
\/
$/
,
''
)
var
path
=
confFactory
.
API_webwxgetvoice
+
"
?msgid=
"
+
id
+
"
&skey=
"
+
accountFactory
.
getSkey
()
return
location
+
path
var
location
=
window
.
location
.
href
.
replace
(
/
\/
$/
,
''
)
;
var
path
=
confFactory
.
API_webwxgetvoice
+
"
?msgid=
"
+
id
+
"
&skey=
"
+
accountFactory
.
getSkey
()
;
return
location
+
path
;
}
function
getMsgPublicLinkImg
(
id
)
{
var
location
=
window
.
location
.
href
.
replace
(
/
\/
$/
,
''
)
var
path
=
'
/cgi-bin/mmwebwx-bin/webwxgetpubliclinkimg?url=xxx&msgid=
'
+
id
+
'
&pictype=location
'
return
location
+
path
var
location
=
window
.
location
.
href
.
replace
(
/
\/
$/
,
''
)
;
var
path
=
'
/cgi-bin/mmwebwx-bin/webwxgetpubliclinkimg?url=xxx&msgid=
'
+
id
+
'
&pictype=location
'
;
return
location
+
path
;
}
function
send
(
ToUserName
,
Content
)
{
var
chatFactory
=
WechatyBro
.
glue
.
chatFactory
var
confFactory
=
WechatyBro
.
glue
.
confFactory
var
chatFactory
=
WechatyBro
.
glue
.
chatFactory
;
var
confFactory
=
WechatyBro
.
glue
.
confFactory
;
if
(
!
chatFactory
||
!
confFactory
)
{
log
(
'
send() chatFactory or confFactory not exist.
'
)
return
false
log
(
'
send() chatFactory or confFactory not exist.
'
)
;
return
false
;
}
var
m
=
chatFactory
.
createMessage
({
ToUserName
:
ToUserName
,
Content
:
Content
,
MsgType
:
confFactory
.
MSGTYPE_TEXT
})
chatFactory
.
appendMessage
(
m
)
return
chatFactory
.
sendMessage
(
m
)
ToUserName
:
ToUserName
,
Content
:
Content
,
MsgType
:
confFactory
.
MSGTYPE_TEXT
})
;
chatFactory
.
appendMessage
(
m
)
;
return
chatFactory
.
sendMessage
(
m
)
;
}
function
getContact
(
id
)
{
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
;
if
(
!
contactFactory
)
{
log
(
'
contactFactory not inited
'
)
return
null
log
(
'
contactFactory not inited
'
)
;
return
null
;
}
var
c
=
contactFactory
.
getContact
(
id
)
var
contactWithoutFunction
=
{}
var
c
=
contactFactory
.
getContact
(
id
)
;
var
contactWithoutFunction
=
{}
;
if
(
c
)
{
if
(
c
.
isContact
)
{
// extend rawObj to identify `stranger`
c
.
stranger
=
!
(
c
.
isContact
())
c
.
stranger
=
!
c
.
isContact
();
}
Object
.
keys
(
c
).
forEach
(
function
(
k
)
{
Object
.
keys
(
c
).
forEach
(
function
(
k
)
{
if
(
typeof
c
[
k
]
!==
'
function
'
)
{
contactWithoutFunction
[
k
]
=
c
[
k
]
contactWithoutFunction
[
k
]
=
c
[
k
]
;
}
})
});
}
else
{
/**
* when `id` does not exist in _contact Array, maybe it is belongs to a stranger in a room.
* try to find in room's member list for this `id`, and return the contact info, if any.
*/
c
=
Object
.
keys
(
_contacts
)
.
filter
(
id
=>
id
.
match
(
/^@@/
))
// only search in room
.
map
(
id
=>
_contacts
[
id
])
// map to room array
.
filter
(
r
=>
r
.
MemberList
.
length
)
// get rid of room without member list
.
filter
(
r
=>
r
.
MemberList
.
filter
(
m
=>
m
.
UserName
===
id
)
.
length
)
.
map
(
c
=>
c
.
MemberList
.
filter
(
m
=>
m
.
UserName
===
id
)
[
0
]
)
[
0
]
c
=
Object
.
keys
(
_contacts
).
filter
(
function
(
id
)
{
return
id
.
match
(
/^@@/
);
})
// only search in room
.
map
(
function
(
id
)
{
return
_contacts
[
id
];
})
// map to room array
.
filter
(
function
(
r
)
{
return
r
.
MemberList
.
length
;
})
// get rid of room without member list
.
filter
(
function
(
r
)
{
return
r
.
MemberList
.
filter
(
function
(
m
)
{
return
m
.
UserName
===
id
;
}).
length
;
}).
map
(
function
(
c
)
{
return
c
.
MemberList
.
filter
(
function
(
m
)
{
return
m
.
UserName
===
id
;
})[
0
];
})[
0
];
if
(
c
)
{
c
.
stranger
=
true
c
.
stranger
=
true
;
Object
.
keys
(
c
).
forEach
(
function
(
k
)
{
Object
.
keys
(
c
).
forEach
(
function
(
k
)
{
if
(
typeof
c
[
k
]
!==
'
function
'
)
{
contactWithoutFunction
[
k
]
=
c
[
k
]
contactWithoutFunction
[
k
]
=
c
[
k
]
;
}
})
})
;
}
}
return
contactWithoutFunction
return
contactWithoutFunction
;
}
function
getUserName
()
{
var
accountFactory
=
WechatyBro
.
glue
.
accountFactory
return
accountFactory
?
accountFactory
.
getUserName
()
:
null
var
accountFactory
=
WechatyBro
.
glue
.
accountFactory
;
return
accountFactory
?
accountFactory
.
getUserName
()
:
null
;
}
function
contactFindAsync
(
filterFunction
)
{
const
callback
=
arguments
[
arguments
.
length
-
1
]
var
callback
=
arguments
[
arguments
.
length
-
1
];
if
(
typeof
callback
!==
'
function
'
)
{
// here we should in sync mode, because there's no callback
throw
new
Error
(
'
async method need to be called via webdriver.executeAsyncScript
'
)
throw
new
Error
(
'
async method need to be called via webdriver.executeAsyncScript
'
)
;
}
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
;
var
match
var
match
;
if
(
!
filterFunction
)
{
match
=
function
()
{
return
true
}
match
=
function
match
()
{
return
true
;
};
}
else
{
match
=
eval
(
filterFunction
)
match
=
eval
(
filterFunction
)
;
}
return
retryFind
(
0
)
return
retryFind
(
0
)
;
// retry 3 times, sleep 300ms between each time
function
retryFind
(
attempt
=
0
)
{
const
contactList
=
contactFactory
.
getAllFriendContact
()
.
filter
(
c
=>
match
(
c
.
NickName
))
.
map
(
c
=>
c
.
UserName
)
function
retryFind
()
{
var
attempt
=
arguments
.
length
>
0
&&
arguments
[
0
]
!==
undefined
?
arguments
[
0
]
:
0
;
var
contactList
=
contactFactory
.
getAllFriendContact
().
filter
(
function
(
c
)
{
return
match
(
c
.
NickName
);
}).
map
(
function
(
c
)
{
return
c
.
UserName
;
});
if
(
contactList
&&
contactList
.
length
)
{
callback
(
contactList
)
callback
(
contactList
)
;
}
else
if
(
attempt
>
3
)
{
callback
([])
callback
([])
;
}
else
{
attempt
++
setTimeout
(
_
=>
retryFind
(
attempt
),
300
)
attempt
++
;
setTimeout
(
function
(
_
)
{
return
retryFind
(
attempt
);
},
300
);
}
}
}
function
contactRemarkAsync
(
UserName
,
remark
)
{
const
callback
=
arguments
[
arguments
.
length
-
1
]
var
callback
=
arguments
[
arguments
.
length
-
1
];
if
(
typeof
callback
!==
'
function
'
)
{
// here we should in sync mode, because there's no callback
throw
new
Error
(
'
async method need to be called via webdriver.executeAsyncScript
'
)
throw
new
Error
(
'
async method need to be called via webdriver.executeAsyncScript
'
)
;
}
var
accountFactory
=
WechatyBro
.
glue
.
accountFactory
var
confFactory
=
WechatyBro
.
glue
.
confFactory
var
emojiFactory
=
WechatyBro
.
glue
.
emojiFactory
var
mmHttp
=
WechatyBro
.
glue
.
mmHttp
var
accountFactory
=
WechatyBro
.
glue
.
accountFactory
;
var
confFactory
=
WechatyBro
.
glue
.
confFactory
;
var
emojiFactory
=
WechatyBro
.
glue
.
emojiFactory
;
var
mmHttp
=
WechatyBro
.
glue
.
mmHttp
;
mmHttp
({
method
:
"
POST
"
,
...
...
@@ -582,141 +603,133 @@
timeout
:
1
e4
,
serial
:
!
0
}
}).
success
(
function
()
{
callback
(
true
)
}).
error
(
function
()
{
callback
(
false
)
})
}).
success
(
function
()
{
callback
(
true
)
;
}).
error
(
function
()
{
callback
(
false
)
;
})
;
}
function
roomFind
(
filterFunction
)
{
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
;
var
match
var
match
;
if
(
!
filterFunction
)
{
match
=
function
()
{
return
true
}
match
=
function
match
()
{
return
true
;
};
}
else
{
match
=
eval
(
filterFunction
)
match
=
eval
(
filterFunction
)
;
}
// log(match.toString())
return
contactFactory
.
getAllChatroomContact
()
.
filter
(
r
=>
match
(
r
.
NickName
))
.
map
(
r
=>
r
.
UserName
)
return
contactFactory
.
getAllChatroomContact
().
filter
(
function
(
r
)
{
return
match
(
r
.
NickName
);
}).
map
(
function
(
r
)
{
return
r
.
UserName
;
});
}
function
roomDelMember
(
ChatRoomName
,
UserName
)
{
const
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
return
chatroomFactory
.
delMember
(
ChatRoomName
,
UserName
)
var
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
;
return
chatroomFactory
.
delMember
(
ChatRoomName
,
UserName
)
;
}
function
roomAddMember
(
ChatRoomName
,
UserName
)
{
const
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
var
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
;
// XXX
// log(ChatRoomName)
// log(UserName)
return
chatroomFactory
.
addMember
(
ChatRoomName
,
UserName
)
return
chatroomFactory
.
addMember
(
ChatRoomName
,
UserName
)
;
}
function
roomModTopic
(
ChatRoomName
,
topic
)
{
const
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
return
chatroomFactory
.
modTopic
(
ChatRoomName
,
topic
)
var
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
;
return
chatroomFactory
.
modTopic
(
ChatRoomName
,
topic
)
;
}
function
roomCreateAsync
(
UserNameList
,
topic
)
{
const
callback
=
arguments
[
arguments
.
length
-
1
]
var
callback
=
arguments
[
arguments
.
length
-
1
];
if
(
typeof
callback
!==
'
function
'
)
{
// here we should in sync mode, because there's no callback
throw
new
Error
(
'
async method need to be called via webdriver.executeAsyncScript
'
)
}
const
UserNameListArg
=
UserNameList
.
map
(
n
=>
{
return
{
UserName
:
n
}
})
const
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
const
state
=
WechatyBro
.
glue
.
state
chatroomFactory
.
create
(
UserNameListArg
)
.
then
(
r
=>
{
if
(
r
.
BaseResponse
&&
0
==
r
.
BaseResponse
.
Ret
||
-
2013
==
r
.
BaseResponse
.
Ret
)
{
state
.
go
(
'
chat
'
,
{
userName
:
r
.
ChatRoomName
})
// BE CAREFUL: key name is userName, not UserName! 20161001
// if (topic) {
// setTimeout(_ => roomModTopic(r.ChatRoomName, topic), 3000)
// }
if
(
!
r
.
ChatRoomName
)
{
throw
new
Error
(
'
chatroomFactory.create() got empty r.ChatRoomName
'
)
}
callback
(
r
.
ChatRoomName
)
}
else
{
throw
new
Error
(
'
chatroomFactory.create() error with Ret:
'
+
r
&&
r
.
BaseResponse
.
Ret
+
'
with ErrMsg:
'
+
r
&&
r
.
BaseResponse
.
ErrMsg
)
}
})
.
catch
(
e
=>
{
// Async can only return by call callback
callback
(
JSON
.
parse
(
JSON
.
stringify
(
e
,
Object
.
getOwnPropertyNames
(
e
)
)
)
)
})
}
function
verifyUserRequest
(
UserName
,
VerifyContent
=
''
)
{
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
var
confFactory
=
WechatyBro
.
glue
.
confFactory
var
Ticket
=
''
// what's this?
throw
new
Error
(
'
async method need to be called via webdriver.executeAsyncScript
'
);
}
var
UserNameListArg
=
UserNameList
.
map
(
function
(
n
)
{
return
{
UserName
:
n
};
});
var
chatroomFactory
=
WechatyBro
.
glue
.
chatroomFactory
;
var
state
=
WechatyBro
.
glue
.
state
;
chatroomFactory
.
create
(
UserNameListArg
).
then
(
function
(
r
)
{
if
(
r
.
BaseResponse
&&
0
==
r
.
BaseResponse
.
Ret
||
-
2013
==
r
.
BaseResponse
.
Ret
)
{
state
.
go
(
'
chat
'
,
{
userName
:
r
.
ChatRoomName
});
// BE CAREFUL: key name is userName, not UserName! 20161001
// if (topic) {
// setTimeout(_ => roomModTopic(r.ChatRoomName, topic), 3000)
// }
if
(
!
r
.
ChatRoomName
)
{
throw
new
Error
(
'
chatroomFactory.create() got empty r.ChatRoomName
'
);
}
callback
(
r
.
ChatRoomName
);
}
else
{
throw
new
Error
(
'
chatroomFactory.create() error with Ret:
'
+
r
&&
r
.
BaseResponse
.
Ret
+
'
with ErrMsg:
'
+
r
&&
r
.
BaseResponse
.
ErrMsg
);
}
}).
catch
(
function
(
e
)
{
// Async can only return by call callback
callback
(
JSON
.
parse
(
JSON
.
stringify
(
e
,
Object
.
getOwnPropertyNames
(
e
))));
});
}
function
verifyUserRequest
(
UserName
)
{
var
VerifyContent
=
arguments
.
length
>
1
&&
arguments
[
1
]
!==
undefined
?
arguments
[
1
]
:
''
;
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
;
var
confFactory
=
WechatyBro
.
glue
.
confFactory
;
var
Ticket
=
''
;
// what's this?
contactFactory
.
verifyUser
({
UserName
,
Opcode
:
confFactory
.
VERIFYUSER_OPCODE_SENDREQUEST
,
Scene
:
confFactory
.
ADDSCENE_PF_WEB
,
Ticket
,
VerifyContent
})
.
then
(
function
()
{
// succ
UserName
:
UserName
,
Opcode
:
confFactory
.
VERIFYUSER_OPCODE_SENDREQUEST
,
Scene
:
confFactory
.
ADDSCENE_PF_WEB
,
Ticket
:
Ticket
,
VerifyContent
:
VerifyContent
})
.
then
(
function
()
{
// succ
// alert('ok')
log
(
'
friendAdd(
'
+
UserName
+
'
,
'
+
VerifyContent
+
'
) done
'
)
},
function
(
t
)
{
// fail
log
(
'
friendAdd(
'
+
UserName
+
'
,
'
+
VerifyContent
+
'
) done
'
);
},
function
(
t
)
{
// fail
// alert('not ok')
log
(
'
friendAdd(
'
+
UserName
+
'
,
'
+
VerifyContent
+
'
) fail:
'
+
t
)
})
log
(
'
friendAdd(
'
+
UserName
+
'
,
'
+
VerifyContent
+
'
) fail:
'
+
t
)
;
})
;
}
function
verifyUserOk
(
UserName
,
Ticket
)
{
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
var
confFactory
=
WechatyBro
.
glue
.
confFactory
var
contactFactory
=
WechatyBro
.
glue
.
contactFactory
;
var
confFactory
=
WechatyBro
.
glue
.
confFactory
;
contactFactory
.
verifyUser
({
UserName
,
Opcode
:
confFactory
.
VERIFYUSER_OPCODE_VERIFYOK
,
Scene
:
confFactory
.
ADDSCENE_PF_WEB
,
Ticket
}).
then
(
function
()
{
// succ
UserName
:
UserName
,
Opcode
:
confFactory
.
VERIFYUSER_OPCODE_VERIFYOK
,
Scene
:
confFactory
.
ADDSCENE_PF_WEB
,
Ticket
:
Ticket
}).
then
(
function
()
{
// succ
// alert('ok')
log
(
'
friendVerify(
'
+
UserName
+
'
,
'
+
Ticket
+
'
) done
'
)
},
function
()
{
// fail
log
(
'
friendVerify(
'
+
UserName
+
'
,
'
+
Ticket
+
'
) done
'
);
},
function
()
{
// fail
// alert('err')
log
(
'
friendVerify(
'
+
UserName
+
'
,
'
+
Ticket
+
'
) fail
'
)
})
log
(
'
friendVerify(
'
+
UserName
+
'
,
'
+
Ticket
+
'
) fail
'
)
;
})
;
}
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////
port
=
port
||
8788
port
=
port
||
8788
;
/*
* WechatyBro injectio must return this object.
...
...
@@ -724,95 +737,94 @@
*/
var
retObj
=
{
code
:
200
// 2XX ok, 4XX/5XX error. HTTP like
,
message
:
'
any message
'
,
port
:
port
}
,
message
:
'
any message
'
,
port
:
port
}
;
if
(
typeof
this
.
WechatyBro
!==
'
undefined
'
)
{
retObj
.
code
=
201
retObj
.
message
=
'
WechatyBro already injected?
'
return
retObj
retObj
.
code
=
201
;
retObj
.
message
=
'
WechatyBro already injected?
'
;
return
retObj
;
}
var
WechatyBro
=
{
glue
:
{
// will be initialized by glueToAngular() function
}
glue
:
{
}
// will be initialized by glueToAngular() function
// glue funcs
// , getLoginStatusCode: function() { return WechatyBro.glue.loginScope.code }
// , getLoginQrImgUrl: function() { return WechatyBro.glue.loginScope.qrcodeUrl }
,
angularIsReady
:
angularIsReady
,
angularIsReady
:
angularIsReady
// variable
,
vars
:
{
loginStatus
:
false
,
initStatus
:
false
loginStatus
:
false
,
initStatus
:
false
,
,
socket
:
null
,
eventsBuf
:
[]
,
scanCode
:
null
,
heartBeatTimmer
:
null
socket
:
null
,
eventsBuf
:
[],
scanCode
:
null
,
heartBeatTimmer
:
null
}
// funcs
,
init
:
init
// initialize WechatyBro @ Browser
,
send
:
send
// send message to wechat user
,
clog
:
clog
// log to Console
,
slog
:
slog
// log to SocketIO
,
log
:
log
// log to both Console & SocketIO
,
ding
:
ding
// simple return 'dong'
,
quit
:
quit
// quit wechat
,
emit
:
emit
// send event to server
,
init
:
init
// initialize WechatyBro @ Browser
,
send
:
send
// send message to wechat user
,
clog
:
clog
// log to Console
,
slog
:
slog
// log to SocketIO
,
log
:
log
// log to both Console & SocketIO
,
ding
:
ding
// simple return 'dong'
,
quit
:
quit
// quit wechat
,
emit
:
emit
// send event to server
,
logout
:
logout
// logout current logined user
,
getContact
,
getUserName
,
getMsgImg
,
getMsgEmoticon
,
getMsgVideo
,
getMsgVoice
,
getMsgPublicLinkImg
,
getContact
:
getContact
,
getUserName
:
getUserName
,
getMsgImg
:
getMsgImg
,
getMsgEmoticon
:
getMsgEmoticon
,
getMsgVideo
:
getMsgVideo
,
getMsgVoice
:
getMsgVoice
,
getMsgPublicLinkImg
:
getMsgPublicLinkImg
// for Wechaty Contact Class
,
contactFindAsync
,
contactRemarkAsync
,
contactFindAsync
:
contactFindAsync
,
contactRemarkAsync
:
contactRemarkAsync
// for Wechaty Room Class
,
roomCreateAsync
,
roomFind
,
roomAddMember
,
roomDelMember
,
roomModTopic
,
roomCreateAsync
:
roomCreateAsync
,
roomFind
:
roomFind
,
roomAddMember
:
roomAddMember
,
roomDelMember
:
roomDelMember
,
roomModTopic
:
roomModTopic
// for Friend Request
,
verifyUserRequest
,
verifyUserOk
,
verifyUserRequest
:
verifyUserRequest
,
verifyUserOk
:
verifyUserOk
// , friendAdd
// , friendVerify
// test purpose
,
isLogin
:
isLogin
,
initClog
:
initClog
}
,
isLogin
:
isLogin
,
initClog
:
initClog
}
;
this
.
WechatyBro
=
WechatyBro
retObj
.
code
=
200
retObj
.
message
=
'
WechatyBro Inject Done
'
this
.
WechatyBro
=
WechatyBro
;
retObj
.
code
=
200
;
retObj
.
message
=
'
WechatyBro Inject Done
'
;
/**
* Two return mode of WebDriver (should be one of them at a time)
* 1. a callback. return a value by call callback with args
* 2. direct return
*/
var
callback
=
arguments
[
arguments
.
length
-
1
]
var
callback
=
arguments
[
arguments
.
length
-
1
]
;
if
(
typeof
callback
===
'
function
'
)
{
return
callback
(
retObj
)
return
callback
(
retObj
)
;
}
return
retObj
return
retObj
;
// retObj.code = 500
// retObj.message = 'SHOULD NOT RUN TO HERE'
// return retObj
}.
apply
(
window
,
arguments
))
}).
apply
(
window
,
arguments
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录