forked from w2r/cfworker_WeCom
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcfworker.js
347 lines (323 loc) · 9.22 KB
/
cfworker.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
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
addEventListener('fetch', event => {
event.respondWith(postWeChatUrl(event.request))
})
async function gatherResponse(response) {
const { headers } = response
const contentType = headers.get("content-type") || ""
if (contentType.includes("application/json")) {
return JSON.stringify(await response.json())
}
else if (contentType.includes("application/text")) {
return await response.text()
}
else if (contentType.includes("text/html")) {
return await response.text()
}
else {
return await response.text()
}
}
async function postWeChatUrl(request) {
// 自行修改企业id和秘钥(在url里面)以及应用id,推送人员, 你的cf worker址
// 以下为需要修改区域
// 企业id和秘钥
const url = "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=*************&corpsecret=********************"
// 应用id
var agentid = *******
// 你的cf地址,务必保证结尾含有"/""
var cf_worker = "https://********.workers.dev/"
// 设置推送用户,"@all"为全部人,多个用户用|链接,比如"A|B|C"
var touser = "@all"
// 以上为需要修改区域
const init = {
headers: {
"content-type": "application/json;charset=UTF-8",
},
}
// 发出get请求获得token
const response = await fetch(url, init)
const results = await gatherResponse(response)
var jsonObj = JSON.parse(results)
// 从cf worker请求提取发送内容
var url2 = new URL(request.url);
var form = url2.searchParams.get('form')
// var content = url2.searchParams.get('content')
// 解决推送内容含有&被截断的问题
// 解决#的问题
var reg = new RegExp( '%23' , "g" )
var content = decodeURI(request.url.replace(cf_worker + "?form=" + form + "&content=", "")).replace(reg, "#")
var key = jsonObj["access_token"]
var wechat_work_url = "https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=" + key;
switch(form)
{
// 测试通过
// content为要推送的内容,支持html格式
case "text":
if (!content)
return new Response('content内容为空,请重新发送!', {
status: 200
});
var template =
{
"touser": touser,
"msgtype": "text",
"agentid": agentid,
"text": {
"content": content
},
"safe": 0,
"enable_id_trans": 0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800
}
const init21 = {
body: JSON.stringify(template),
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
}
// 发送post请求
const response10 = await fetch(wechat_work_url, init21)
return response10
break;
// 测试通过
// 无用功能,需要上传微信服务器获得media_id
// 发送的图片只能是media_id,具体获得方式百度微信临时素材上传
// 素材只能保留三天
case "photo":
// content内容为media_id
if (!content)
return new Response('content内容为空,请重新发送!', {
status: 200
});
var template =
{
"touser" : touser,
"toall" : 0,
"msgtype" : "image",
"agentid" : agentid,
"image" : {
"media_id" : content
},
"safe":0
}
const init22 = {
body: JSON.stringify(template),
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
}
// 发送post请求
const response12 = await fetch(wechat_work_url, init22)
return response12
break;
// 测试通过
// 无用功能
// 同photo
case "video":
// content内容为media_id,title,描述
// 三个参数以分隔符|分开(切记你的内容里不要含有分割符号)
// content内容为media_id|title|description
if (!content)
return new Response('content内容为空,请重新发送!', {
status: 200
});
content_text = content.split("|")
var template =
{
"touser" : touser,
"toall" : 0,
"msgtype" : "video",
"agentid" : agentid,
"video" : {
"media_id" : content_text[0],
"title" : content_text[1],
"description" : content_text[2]
},
"safe":0
}
const init3 = {
body: JSON.stringify(template),
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
}
// 发送post请求
const response13 = await fetch(wechat_work_url, init3)
return response13
break;
// 没试过,理论上和video一样
// 没啥用
case "voice":
// content内容为media_id
if (!content)
return new Response('content内容为空,请重新发送!', {
status: 200
});
var template =
{
"touser" : touser,
"toall" : 0,
"msgtype" : "voice",
"agentid" : agentid,
"voice" : {
"media_id" : content
}
}
const init23 = {
body: JSON.stringify(template),
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
}
// 发送post请求
const response14 = await fetch(wechat_work_url, init23)
return response15
break;
// 测试通过
case "textcard":
// content内容为title|描述|链接,
// 参数以分隔符|隔开
// 描述内容支持html
if (!content)
return new Response('content内容为空,请重新发送!', {
status: 200
});
content_text = content.split("|")
var template =
{
"touser" : touser,
"toall" : 0,
"msgtype" : "textcard",
"agentid" : agentid,
"textcard" : {
"title" : content_text[0],
//描述内容支持html
"description" : content_text[1],
"url" : content_text[2],
// 微信端无用,直接删除
// "btntxt":"更多"
}
}
const init4 = {
body: JSON.stringify(template),
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
}
// 发送post请求
const response15 = await fetch(wechat_work_url, init4)
return response15
break;
// 测试通过
case "file":
// content内容为media_id
// 同photo,文件需要上传到微信服务器
if (!content)
return new Response('content内容为空,请重新发送!', {
status: 200
});
var template =
{
"touser" : touser,
"toall" : 0,
"msgtype" : "file",
"agentid" : agentid,
"file" : {
"media_id" : content
},
"safe":0,
"enable_duplicate_check": 0,
"duplicate_check_interval": 1800,
"enable_id_trans":0,
}
const init6 = {
body: JSON.stringify(template),
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
}
// 发送post请求
const response17 = await fetch(wechat_work_url, init6)
return response17
break;
case "markdown":
if (!content)
return new Response('content内容为空,请重新发送!', {
status: 200
});
var template =
{
"touser" : touser,
"toall" : 0,
"msgtype" : "markdown",
"agentid" : agentid,
"markdown": {
"content": content
}
}
const init7 = {
body: JSON.stringify(template),
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
}
// 发送post请求
const response18 = await fetch(wechat_work_url, init7)
return response18
break;
// 已调试成功通过!
// 注意四个参数要用连接符号|连接起来,
case "photo_text":
// content内容为连接符号连接的四个参数
// 四个参数分为title|描述|跳转链接|图片链接,
// 参数以分隔符|隔开
if (!content){
return new Response('content内容为空,请重新发送!', {
status: 200
});
}
// 根据分隔符分割内容,还原成四个参数
content_text = content.split("|")
var template =
{
"touser" : touser,
"toall" : 0,
"msgtype" : "news",
"agentid" : agentid,
"news" : {
"articles" : [
{
"title" : content_text[0],
"description" : content_text[1],
"url" : content_text[2],
"picurl" : content_text[3],
// btntxt在微信端无效,需要在企业微信才会显示,不建议使用
// "btntxt":"点击了解更多"
}
]
}
}
const init8 = {
body: JSON.stringify(template),
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
}
// 发送post请求
const response19 = await fetch(wechat_work_url, init8)
return response19
break;
default:
return new Response(form + '为不存在的格式,请重新发送!', {status: 200})
break
}
}