-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest.js
209 lines (193 loc) · 6.81 KB
/
test.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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
var child_process = require('child_process');
var fs = require('fs');
var debug = (text)=>console.error("[DEBUG]", text);
var inspect = require('util').inspect;
var request = require('request');
var https = require('https');
var baseUrl = 'https://wx.qq.com';
var replyRobot = require('./replyRobot').turingRobot;
var getUUID = new Promise((resolve, reject)=> {
var param = {
appid: 'wx782c26e4c19acffb',
fun: 'new',
lang: 'en_US',
_: Date.now()
}
var uri = '/jslogin';
var options = {
uri: uri,
baseUrl: 'https://login.weixin.qq.com',
method: 'GET',
qs: param
};
var req = request(options, (error, response, body)=> {
if (error) {
//debug(error);
reject(error);
}
resolve(body);
});
});
var _ = require('lodash');
const botTitle = '[老猫机器人]:';
var utl = require('./util');
function handleError(e) {
console.log(e);
}
function botSpeak(obj) {
passWebwxsync(obj);
var p = new Promise((resolve, reject)=>{
//debug('obj in botSpeak:\n' + inspect(obj));
var BaseRequest = obj.BaseRequest;
var pass_ticket = obj.pass_ticket;
while (obj.MsgToUserAndSend.length > 0) {
// FIXME: 先pop的应该是后收到的?不一定,可能需要在上一步检查返回消息CreateTime,但短暂时间间隔保证顺序也许是不必要的。
var msgBundle = obj.MsgToUserAndSend.pop();
var postData = {
BaseRequest: obj.BaseRequest,
Msg: {
"ClientMsgId": utl.Now(),//`${timestamp}0${random}`},
"Content": botTitle + msgBundle.Msg,
"FromUserName": obj.username,
"LocalID": utl.Now(),//`${timestamp}0${random}`,
"ToUserName": msgBundle.User,
"Type": 1
}
};
var options = {
baseUrl: 'https://wx.qq.com',
uri: `/cgi-bin/mmwebwx-bin/webwxsendmsg?lang=en_US&pass_ticket=${pass_ticket}`,
method: 'POST',
jar: true,
json: true,
body: postData
};
request(options, (error, response, body)=>{
console.log(botTitle, msgBundle.Msg);
//debug("in botSpeak ret: " + inspect(body));
})
}
resolve(obj);
});
return p;
}
function synccheck(obj) {
var p = new Promise((resolve, reject)=>{
// 重置obj.webwxsync, 默认不需要webwxsync
obj.webwxsync = false;
var timestamp = Date.now();
var skey = obj.BaseRequest.Skey;
var sid = obj.BaseRequest.Sid;
var uin = obj.BaseRequest.Uin;
var deviceid = obj.BaseRequest.DeviceID;
var synckey = obj.SyncKey.List.map(o=>o.Key + '_' + o.Val).join('|');
var options = {
baseUrl: 'https://webpush.weixin.qq.com',
uri: '/cgi-bin/mmwebwx-bin/synccheck',
method: 'GET',
qs: {
r: timestamp,
skey: skey,
sid: sid,
uin: uin,
deviceid: deviceid,
synckey: synckey
},
jar: true,
timeout: 60000
}
request(options, (error, response, body)=>{
if (error) return reject(error);
if (body == 'window.synccheck={retcode:"1101",selector:"0"}') return reject('自动登出');
// TODO: 整理各种情况
if (body !== 'window.synccheck={retcode:"0",selector:"0"}') obj.webwxsync = true;
resolve(obj);
})
});
return p;
}
function webwxsync(obj) {
passWebwxsync(obj);
var p = new Promise((resolve, reject) => {
//debug('obj in webwxsync:\n' + inspect(obj));
var BaseRequest = obj.BaseRequest;
var pass_ticket = obj.pass_ticket;
var timestamp = Date.now();
var postData = {
BaseRequest: obj.BaseRequest,
SyncKey: obj.SyncKey
};
var options = {
baseUrl: 'https://wx.qq.com',
uri: `/cgi-bin/mmwebwx-bin/webwxsync?sid=${obj.BaseRequest.Sid}&skey=${obj.BaseRequest.Skey}&lang=en_US&pass_ticket=${pass_ticket}`,
method: 'POST',
body: postData,
json: true,
jar: true
}
request(options, (error, response, body)=>{
obj.SyncKey = body.SyncKey;
if (body.AddMsgCount = 0) return;
var msgList = utl.filterMsgList(body.AddMsgList);
debug('组装消息。。。' +'消息数量:'+msgList.length);
// FIXME:
var ps = [];
_.each(msgList, function(o){//Monster
var toUserName = o.ToUserName;
//debug('in webwxsync body:' + inspect(o));
if ((o.MsgType == 1) && (toUserName == obj.username || toUserName =='filehelper')) { //给我
debug('消息内容:'+inspect(o));
var fil = _.filter(obj.ml, {'UserName' : o.FromUserName});
if(fil.length > 0) console.log('[' + fil[0]['NickName'] + ' 说]', o.Content);
var group = _.startsWith(o.FromUserName, '@@');
if(!group) {
debug('获取机器人回复消息...');
// 有意思的东西哈哈
o.Content = o.Content.replace(/@老猫/g, '喂, ');
var replyPromise = replyRobot(o.Content);
replyPromise.then(body => {
debug('组装机器人回复消息...');
console.log(o.FromUserName);
obj.MsgToUserAndSend.push({
User: o.FromUserName,//obj.target.UserName,//
Msg: body
});
});
ps.push(replyPromise);
} else {
//debug(inspect(o));
}
}
});
Promise.all(ps).then(()=>{
resolve(obj);
});
});
});
return p;
}
function robot(obj) {
synccheck(obj).
then(webwxsync).
then(botSpeak).
then(robot).
catch(console.log);
}
function passWebwxsync(obj) {
if (!obj.webwxsync) {
return Promise.resolve(obj);
}
}
var init = require('./init');
getUUID.
then(init.checkAndParseUUID).
then(init.showQRImage).
then(init.checkScan).
then(init.checkLogin).
then(init.parseRedirectUrl).
then(init.webwxinit).
then(init.getContact).
//then(webwxstatusnotify).
then(robot).
//then(botSpeak).
catch(console.error);