-
Notifications
You must be signed in to change notification settings - Fork 0
/
wxpusher.js
295 lines (262 loc) · 9.56 KB
/
wxpusher.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
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
const axios = require('axios');
class WxPusher {
constructor(appToken) {
this.appToken = appToken; // 应用的appToken
this.baseUrl = `https://wxpusher.zjiecode.com`; // 接口域名
this.sendMessageUrl = `${this.baseUrl}/api/send/message`; // 发送/删除消息
this.sendQueryMessageUrl = `${this.baseUrl}/api/send/query/status`; //查询状态
this.funCreateQrcodeUrl = `${this.baseUrl}/api/fun/create/qrcode`; // 创建参数二维码
this.funScanQrcodeUidUrl = `${this.baseUrl}/api/fun/scan-qrcode-uid`; // 查询扫码用户UID
this.funWxuserUrl = `${this.baseUrl}/api/fun/wxuser/v2`; // 查询用户列表V2
this.funRemoveUrl = `${this.baseUrl}/api/fun/remove`; // 删除用户
this.funRejectUrl = `${this.baseUrl}/api/fun/reject`; // 拉黑用户
}
/*
接口文档:https://wxpusher.zjiecode.com/docs
*/
// 发送消息(POST)
async sendMessage(...args) {
// 默认值
let content = "Hello WxPusher";
let summary = null;
let contentType = 1;
let topicIds = [];
let uids = [];
let url = null;
let verifyPayType = 0;
// 处理参数
const strings = args.filter(arg => typeof arg === 'string');
const arrays = args.filter(arg => Array.isArray(arg));
const numbers = args.filter(arg => typeof arg === 'number');
// 辅助函数:检查是否为有效的 URL
function isUrl(str) {
try {
new URL(str);
return true;
} catch {
return false;
}
}
// 处理字符串参数
if (strings.length === 3) {
[content, summary, url] = strings;
} else if (strings.length === 2) {
content = strings[0];
url = isUrl(strings[1]) ? strings[1] : summary;
} else if (strings.length === 1) {
content = strings[0];
}
// 处理数组参数
if (arrays.length === 1) {
const arr = arrays[0];
uids = arr.filter(item => typeof item === 'string' && item.startsWith('UID_'));
topicIds = arr.filter(item => typeof item === 'number');
} else if (arrays.length === 2) {
const [firstArray, secondArray] = arrays;
uids = firstArray.filter(item => typeof item === 'string' && item.startsWith('UID_'));
topicIds = secondArray.filter(item => typeof item === 'number');
}
// 处理数字参数
if (numbers.length === 1) {
contentType = numbers[0];
} else if (numbers.length === 2) {
[contentType, verifyPayType] = numbers;
}
const params = {
appToken: this.appToken,
content, // 内容
summary, // 消息摘要,显示在微信聊天页面或者模版消息卡片上,限制长度20(微信只能显示20),可以不传,不传默认截取content前面的内容。
contentType, // 内容类型 1表示文字 2表示html(只发送body标签内部的数据即可,不包括body标签,推荐使用这种) 3表示markdown
topicIds, // 发送目标的topicId,是一个数组!!!也就是群发,使用uids单发的时候,可以不传。
uids, // 发送目标的UID,是一个数组。注意uids和topicIds可以同时填写,也可以只填写一个。
url, // 原文链接,可选参数
verifyPayType // 是否验证订阅时间 0:不验证 1:只发送给付费的用户 2:只发送给未订阅或者订阅过期的用户
};
try {
const response = await axios.post(this.sendMessageUrl, params, {
headers: {
'Content-Type': 'application/json'
}
});
return response.data || null;
} catch (error) {
return { success: false, error: error.message };
}
}
// 发送消息(GET)
async quickSend(...args) {
// 默认值
let content = "Hello WxPusher";
let uid = null;
let topicId = null;
let url = null;
let verifyPayType = 0;
// 处理参数
const strings = args.filter(arg => typeof arg === 'string');
const numbers = args.filter(arg => typeof arg === 'number');
// 辅助函数:检查是否为有效的 URL
function isUrl(str) {
try {
new URL(str);
return true;
} catch {
return false;
}
}
// 处理字符串参数
if (strings.length === 1) {
content = strings[0];
} else if (strings.length === 2) {
content = strings[0];
const secondStr = strings[1];
if (isUrl(secondStr)) {
url = secondStr;
} else if (secondStr.startsWith('UID_')) {
uid = secondStr;
} else {
topicId = secondStr;
}
} else if (strings.length === 3) {
content = strings[0];
const secondStr = strings[1];
url = strings[2];
if (secondStr.startsWith('UID_')) {
uid = secondStr;
} else {
topicId = secondStr;
}
}
// 处理数字参数
if (numbers.length === 1) {
verifyPayType = numbers[0];
}
const params = {
appToken: this.appToken,
content, // 内容
topicId, // 发送目标的topicId,是一个字符串。
uid, // 发送目标的UID,是一个字符串。注意uid和topicId只填写一个。
url, // 原文链接,可选参数
verifyPayType // 是否验证订阅时间 0:不验证 1:只发送给付费的用户 2:只发送给未订阅或者订阅过期的用户
};
try {
const response = await axios.get(this.sendMessageUrl, { params });
return response.data || null;
} catch (error) {
return { success: false, error: error.message };
}
}
// 查询状态
async queryMessage(sendRecordId) {
const params = {
sendRecordId // 发送消息接口返回的发送id,对应给一个uid或者topic的发送id
};
try {
const response = await axios.get(this.sendQueryMessageUrl, { params });
return response.data || null;
} catch (error) {
return { success: false, error: error.message };
}
}
// 删除消息
async deleteMessage(messageContentId) {
const params = {
appToken: this.appToken,
messageContentId // 发送接口返回的消息内容id,调用一次接口生成一个,如果是发送给多个用户,多个用户共享一个messageContentId,通过messageContentId可以删除内容,删除后本次发送的所有用户都无法再查看本条消息
};
try {
const response = await axios.delete(this.sendMessageUrl, { params });
return response.data || null;
} catch (error) {
return { success: false, error: error.message };
}
}
// 创建参数二维码
async createQrcode(extra, validTime) {
const params = {
appToken: this.appToken,
extra, //必填,二维码携带的参数,最长64位
validTime //可选,二维码的有效期,默认30分钟,最长30天,单位是秒
};
try {
const response = await axios.post(this.funCreateQrcodeUrl, params, {
headers: {
'Content-Type': 'application/json'
}
});
return response.data || null;
} catch (error) {
return { success: false, error: error.message };
}
}
// 查询扫码用户UID
async queryUid(code) {
const params = {
code // 创建参数二维码接口返回的code参数。
};
try {
const response = await axios.get(this.funScanQrcodeUidUrl, { params });
return response.data || null;
} catch (error) {
return { success: false, error: error.message };
}
}
// 查询用户列表V2
async queryUser(page, pageSize, uid = null, isBlock = null, type = null) {
const params = {
appToken: this.appToken,
page, // 请求数据的页码
pageSize, // 分页大小,不能超过100,默认10
uid, // 用户的uid,可选,如果不传就是查询所有用户,传uid就是查某个用户的信息
isBlock, // 查询拉黑用户,可选,不传查询所有用户,true查询拉黑用户,false查询没有拉黑的用户
type // 关注的类型,可选,不传查询所有用户,0是应用,1是主题
};
try {
const response = await axios.get(this.funWxuserUrl, { params });
return response.data || null;
} catch (error) {
return { success: false, error: error.message };
}
}
//删除用户
async removeUser(id) {
const params = {
appToken: this.appToken,
id: id, //用户id,通过用户查询接口可以获取
};
try {
const response = await axios.delete(this.funRemoveUrl, { params });
return response.data || null;
} catch (error) {
return { success: false, error: error.message };
}
}
//拉黑用户
async rejectUser(id) {
const params = {
appToken: this.appToken,
id: id, // 用户id,通过用户查询接口可以获取
reject: true
};
try {
const response = await axios.put(this.funRejectUrl, null, { params });
return response.data || null;
} catch (error) {
return { success: false, error: error.message };
}
}
//取消拉黑用户
async acceptUser(id) {
const params = {
appToken: this.appToken,
id: id, // 用户id,通过用户查询接口可以获取
reject: false
};
try {
const response = await axios.put(this.funRejectUrl, null, { params });
return response.data || null;
} catch (error) {
return { success: false, error: error.message };
}
}
}
module.exports = WxPusher;