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

runable tech prototype~

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