forked from allquixotic/SO-ChatBot
-
Notifications
You must be signed in to change notification settings - Fork 0
/
run-headless.js
129 lines (112 loc) · 2.8 KB
/
run-headless.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
var Nightmare = require('nightmare'),
readline = require('readline');
var hound = new Nightmare({
cookiesFile: 'cookies.jar',
webSecurity: false
});
var config = require('./run-headless.config.json');
function once (fn) {
var called = false, res;
return function () {
if (called) { return res; }
called = true;
res = fn.apply(this, arguments);
return res;
};
}
hound.drainQueue = function (cb) {
var self = hound;
setTimeout(next, 0);
function next(err) {
var item = self.queue.shift();
if (!item) {
cb && cb(err, self);
return;
}
var method = item[0],
args = item[1];
args.push(once(next));
method.apply(self, args);
}
};
function seLogin () {
hound
.evaluate(function(email, password) {
document.querySelector('#login-form input[type="email"]').value = email;
document.querySelector('#login-form input[type="password"]').value = password;
}, function() {}, config.email, config.password)
.screenshot('pics/mid-login.png')
.click('#login-form input[type="button"]')
.wait(10000) // wait for stackauth universal login to complete
.screenshot('pics/post-login.png');
}
function injectToChat (hound) {
hound
.goto(config.roomUrl)
.wait()
.screenshot('pics/chat.png')
.evaluate(function () {
var script = document.createElement('script');
script.src = 'http://localhost/master.js';
script.onload = function() {
//bot.activateDevMode();
console.log('Loaded bot');
bot.adapter.out.add('I have just been restarted! This happens daily automatically, or when my owner restarts me. Ready for commands.');
};
document.head.appendChild(script);
}, function () {
console.log('Injected chatbot.');
});
}
hound
.goto(config.siteUrl + '/users/login/')
.screenshot('pics/pre-login.png')
.wait(5000)
.url(function (url) {
if (!/login-add/.test(url)) {
console.log('Need to authenticate');
hound.use(seLogin);
}
else {
console.log('Cool, already logged in');
}
hound.use(injectToChat);
hound.drainQueue(function () {
console.log('Should be done loading stuff.');
hitTheRepl();
});
})
.setup(function () {
hound.drainQueue();
});
function hitTheRepl() {
var repl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
console.log('You are now in a REPL with the remote page. Have fun!');
hound.on('consoleMessage', function (msg) {
console.log('<', msg);
});
hound.on('error', function (msg) {
console.log('! ', msg);
});
repl.on('line', function (data) {
hound.evaluate(function (code) {
try {
return eval(code);
}
catch (e) {
return e.message;
}
}, function (res) {
console.log('$', res);
repl.prompt();
}, data).drainQueue();
});
repl.on('close', function () {
console.log('Leaving the nightmare...');
hound.teardownInstance();
});
repl.prompt();
}