提交 457a79f9 编写于 作者: Huan (李卓桓)'s avatar Huan (李卓桓)

runable tech prototype~

上级 2a1644ac
......@@ -35,3 +35,4 @@ node_modules
cert.pem
key.pem
t.js
t
......@@ -19,37 +19,55 @@
408: 未确认
*/
;(function () {
// DEBUG START
delete window.console.log, delete window.console
window.console.zlog = window.console.log
// window.console.log = function () {}
window.zlog = function (s) { return window.console.zlog(s) }
zlog('Wechaty injected!. ;-D')
// DEBUG END
;(function (port) {
var port = port || 8788
var injector = angular.element(document).injector()
var rootScope = injector.get("$rootScope")
var http = injector.get("$http")
rootScope.$on("message:add:success", function (event, data) {
http.post("https://localhost:${this.PORT}", data)
})
var chatFactory = injector.get("chatFactory")
var confFactory = injector.get("confFactory")
var loginScope = angular.element(".login_box").scope()
window.Wechaty = {
getLoginStatusCode: function () { return loginScope.code }
, getLoginQrImgUrl: function () { return loginScope.qrcodeUrl }
, isReady: function () {
return !!(angular && angular.element && angular.element("body"))
}
, isLogined: function () { return 200===loginScope.code }
var Wechaty = function () {
debug(true)
hook()
zlog('Wechaty injected!. ;-D')
}
return Wechaty()
}())
angular.extend(Wechaty, {
debug: debug
, getLoginStatusCode: function () { return loginScope.code }
, getLoginQrImgUrl: function () { return loginScope.qrcodeUrl }
, isLogined: function () { return 200===loginScope.code }
, isReady: function () { return !!(angular && angular.element && angular.element("body")) }
})
function debug(enable) {
if (enable) {
delete window.console.log
delete window.console
window.console.zlog = window.console.log
window.zlog = function (s) { return window.console.zlog(s) }
window.console.log = function () {}
} else {
window.zlog = function () {}
}
}
function hook() {
rootScope.$on("message:add:success", function (event, data) {
http.post('https://localhost:' + port, data)
})
}
window.Wechaty = Wechaty
return Wechaty
}(arguments[0]))
......@@ -24,7 +24,13 @@ class PuppetWeb extends EventEmitter {
const PORT = 8788 // W(87) X(88), ascii char code ;-]
const server = this.server = new WebServer(PORT)
['message', 'login', 'logout'].map( event => {
const EVENTS = [
'message'
, 'login'
, 'logout'
]
EVENTS.map( event => {
server.on(event, data => { this.emit(event, data) })
})
}
......@@ -43,8 +49,8 @@ class PuppetWeb extends EventEmitter {
* Public Methods
*
*/
getLoginQrImgUrl(cb) {
return this.server.getLoginQrImgUrl(cb)
getLoginQrImgUrl() {
return this.server.browserProxy('Wechaty.getLoginQrImgUrl()')
}
......@@ -68,11 +74,27 @@ class WebServer extends EventEmitter {
constructor(port) {
super()
const express = initExpress()
const server = initHttpsServer(express, port)
const io = initSocketIo(server)
/**
*
* io events proxy between server & browser
*
*/
this.WEBSERVER_EVENTS = [
'message'
, 'login'
, 'logout'
]
const express = this.initExpress()
const server = this.initHttpsServer(express, port)
const socketio = this.initSocketIo(server)
const browser = this.browser = new WebBrowser(port)
const browser = this.browser = new WebBrowser(port)
this.online = false
this.on('login' , () => { this.online = true })
this.on('logout', () => { this.online = false })
}
/**
......@@ -87,7 +109,7 @@ class WebServer extends EventEmitter {
return https.createServer({
key: fs.readFileSync('key.pem'),
cert: fs.readFileSync('cert.pem')
}, app).listen(port, function () {
}, express).listen(port, function () {
console.log('Example app listening on port ' + port + '!')
})
}
......@@ -127,11 +149,11 @@ class WebServer extends EventEmitter {
*
*/
initSocketIo(server) {
const io = io.listen(server, {
const ioServer = io.listen(server, {
log: true
})
io.sockets.on('connection', function(sock) {
ioServer.sockets.on('connection', function(sock) {
console.log('socket.on connection entried')
socket = sock
......@@ -139,15 +161,7 @@ class WebServer extends EventEmitter {
socket = null
})
/**
*
* io events proxy between server & browser
*
*/
[ 'message'
, 'login'
, 'logout'
].map(event => {
this.WEBSERVER_EVENTS.map(event => {
// Events <--from-- Wechaty@Broswer
socket.on(event, data => {
console.log(`recv even ${event} from browser`)
......@@ -170,9 +184,18 @@ class WebServer extends EventEmitter {
*/
})
return io
return ioServer
}
isLogined() {
return this.online
}
browserProxy(wechatyFunction) {
if (!this.browser) throw new Error('theres no broswer found in server instance!')
return this.browser.executeScript(wechatyFunction)
}
}
......@@ -190,71 +213,76 @@ const WebDriver = require('selenium-webdriver')
class WebBrowser {
constructor(port) {
const BROWSER = 'chrome'
const BROWSER = this.BROWSER = 'chrome'
const PORT = this.PORT = port || 8788
const driver = this.driver = new WebDriver.Builder().forBrowser(BROWSER).build()
const driver = this.driver = new WebDriver.Builder().forBrowser('chrome').build()
this.open()
.then(this.inject.bind(this))
open()
.then(inject)
this.loop()
}
open() {
const WX_URL = 'https://wx.qq.com'
this.driver.get(WX_URL) // open wechat web page
console.log('waitting for dom ready')
this.driver.wait(function () {
return this.driver.isElementPresent(WebDriver.By.css('.login_box'))
}, 5*1000, '\nFailed to wait .login_box')
console.log('ready!')
return this.driver.wait(() => {
return this.driver.isElementPresent(WebDriver.By.css('div.login_box'))
}, 60*1000, '\nFailed to wait div.login_box')
}
inject(cb) {
inject() {
const injectio = fs.readFileSync(
path.join(__dirname, 'puppet-web-injectio.js')
, 'utf8'
)
console.log('start injecting')
this.driver.executeScript(injectio).then(ret => {
console.log('injected: ' + ret)
cb(ret)
})
return this.executeScript(injectio, this.PORT)
}
other() {
console.log('start wait Login')
function startCheck() {
driver.executeScript('return Wechaty.getLoginStatusCode()').then( function (c) {
console.log('got code: ' + c)
if (200!=c) {
setTimeout(startCheck, 500)
} else {
doLogin()
}
})
}
startCheck()
loop() {
console.log('start wait Login')
const that = this
function startCheck() {
that.executeScript('return Wechaty.getLoginStatusCode()').then( function (c) {
console.log('got code: ' + c)
if (200!=c) {
setTimeout(startCheck, 500)
} else {
doLogin()
}
})
}
startCheck()
function doLogin() {
console.log('logined?!')
}
function doLogin() {
console.log('logined?!')
}
}
//driver.quit()
quit() {
return this.driver.quit()
}
return driver
getLoginQrImgUrl() {
return this.executeScript('return Wechaty.getLoginQrImgUrl()')
}
getLoginQrImgUrl(cb) {
executeScript(script) {
if (!this.driver)
throw new Error('driver not found')
this.driver
.executeScript('return Wechaty.getLoginQrImgUrl()')
.then(cb)
// a promise
return this.driver
.executeScript(script)
}
}
......
......@@ -14,7 +14,7 @@ class Puppet extends EventEmitter {
if (!soul.alive()) throw new Error('soul is not alive!')
this.soul = soul
this.soul.on('message', (e) { this.emit('message', e) })
this.soul.on('message', data => { this.emit('message', data) })
}
detach() {
if (!this.soul) throw new Error('there is no soul inside to detach!')
......
......@@ -26,7 +26,8 @@
"dependencies": {
"body-parser": "^1.15.0",
"express": "^4.13.4",
"selenium-webdriver": ""
"selenium-webdriver": "",
"socket.io": "^1.4.5"
},
"devDependencies": {
"tape": "^4.5.1"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册