twikoo-func 1.5.2 → 1.5.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +79 -22
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -91,7 +91,7 @@ exports.main = async (event, context) => {
|
|
|
91
91
|
res = await commentLike(event)
|
|
92
92
|
break
|
|
93
93
|
case 'COMMENT_SUBMIT':
|
|
94
|
-
res = await commentSubmit(event)
|
|
94
|
+
res = await commentSubmit(event, context)
|
|
95
95
|
break
|
|
96
96
|
case 'POST_SUBMIT':
|
|
97
97
|
res = await postSubmit(event.comment, context)
|
|
@@ -838,7 +838,7 @@ async function like (id, uid) {
|
|
|
838
838
|
* @param {String} event.pid 回复的 ID
|
|
839
839
|
* @param {String} event.rid 评论楼 ID
|
|
840
840
|
*/
|
|
841
|
-
async function commentSubmit (event) {
|
|
841
|
+
async function commentSubmit (event, context) {
|
|
842
842
|
const res = {}
|
|
843
843
|
// 参数校验
|
|
844
844
|
validate(event, ['url', 'ua', 'comment'])
|
|
@@ -852,7 +852,7 @@ async function commentSubmit (event) {
|
|
|
852
852
|
// 异步垃圾检测、发送评论通知
|
|
853
853
|
try {
|
|
854
854
|
await app.callFunction({
|
|
855
|
-
name:
|
|
855
|
+
name: context.function_name,
|
|
856
856
|
data: { event: 'POST_SUBMIT', comment }
|
|
857
857
|
}, { timeout: 300 }) // 设置较短的 timeout 来实现异步
|
|
858
858
|
} catch (e) {
|
|
@@ -1123,7 +1123,7 @@ async function parse (comment) {
|
|
|
1123
1123
|
comment: DOMPurify.sanitize(comment.comment, { FORBID_TAGS: ['style'], FORBID_ATTR: ['style'] }),
|
|
1124
1124
|
pid: comment.pid ? comment.pid : comment.rid,
|
|
1125
1125
|
rid: comment.rid,
|
|
1126
|
-
isSpam: isAdminUser ? false : preCheckSpam(comment
|
|
1126
|
+
isSpam: isAdminUser ? false : preCheckSpam(comment),
|
|
1127
1127
|
created: timestamp,
|
|
1128
1128
|
updated: timestamp
|
|
1129
1129
|
}
|
|
@@ -1171,7 +1171,7 @@ async function limitFilter () {
|
|
|
1171
1171
|
}
|
|
1172
1172
|
|
|
1173
1173
|
// 预垃圾评论检测
|
|
1174
|
-
function preCheckSpam (comment) {
|
|
1174
|
+
function preCheckSpam ({ comment, nick }) {
|
|
1175
1175
|
// 长度限制
|
|
1176
1176
|
let limitLength = parseInt(config.LIMIT_LENGTH)
|
|
1177
1177
|
if (Number.isNaN(limitLength)) limitLength = 500
|
|
@@ -1185,7 +1185,7 @@ function preCheckSpam (comment) {
|
|
|
1185
1185
|
} else if (config.FORBIDDEN_WORDS) {
|
|
1186
1186
|
// 违禁词检测
|
|
1187
1187
|
for (const forbiddenWord of config.FORBIDDEN_WORDS.split(',')) {
|
|
1188
|
-
if (comment.indexOf(forbiddenWord.trim()) !== -1) {
|
|
1188
|
+
if (comment.indexOf(forbiddenWord.trim()) !== -1 || nick.indexOf(forbiddenWord.trim()) !== -1) {
|
|
1189
1189
|
console.log('包含违禁词,直接标记为垃圾评论~')
|
|
1190
1190
|
return true
|
|
1191
1191
|
}
|
|
@@ -1396,9 +1396,9 @@ async function emailTest (event) {
|
|
|
1396
1396
|
const isAdminUser = await isAdmin()
|
|
1397
1397
|
if (isAdminUser) {
|
|
1398
1398
|
try {
|
|
1399
|
-
|
|
1400
|
-
|
|
1401
|
-
}
|
|
1399
|
+
// 邮件测试前清除 transporter,保证读取的是最新的配置
|
|
1400
|
+
transporter = null
|
|
1401
|
+
await initMailer({ throwErr: true })
|
|
1402
1402
|
const sendResult = await transporter.sendMail({
|
|
1403
1403
|
from: config.SENDER_EMAIL,
|
|
1404
1404
|
to: event.mail || config.BLOGGER_EMAIL || config.SENDER_EMAIL,
|
|
@@ -1420,21 +1420,16 @@ async function uploadImage (event) {
|
|
|
1420
1420
|
const { photo, fileName } = event
|
|
1421
1421
|
const res = {}
|
|
1422
1422
|
try {
|
|
1423
|
-
if (!config.IMAGE_CDN_TOKEN) {
|
|
1423
|
+
if (!config.IMAGE_CDN || !config.IMAGE_CDN_TOKEN) {
|
|
1424
1424
|
throw new Error('未配置图片上传服务')
|
|
1425
1425
|
}
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
}
|
|
1433
|
-
})
|
|
1434
|
-
if (uploadResult.data.code === 200) {
|
|
1435
|
-
res.data = uploadResult.data.data
|
|
1436
|
-
} else {
|
|
1437
|
-
throw new Error(uploadResult.data.msg)
|
|
1426
|
+
// tip: qcloud 图床走前端上传,其他图床走后端上传
|
|
1427
|
+
if (config.IMAGE_CDN === '7bu') {
|
|
1428
|
+
await uploadImageTo7Bu({ photo, fileName, config, res })
|
|
1429
|
+
} else if (config.IMAGE_CDN === 'smms') {
|
|
1430
|
+
await uploadImageToSmms({ photo, fileName, config, res })
|
|
1431
|
+
} else if (isUrl(config.IMAGE_CDN)) {
|
|
1432
|
+
await uploadImageToLskyPro({ photo, fileName, config, res })
|
|
1438
1433
|
}
|
|
1439
1434
|
} catch (e) {
|
|
1440
1435
|
console.error(e)
|
|
@@ -1444,6 +1439,64 @@ async function uploadImage (event) {
|
|
|
1444
1439
|
return res
|
|
1445
1440
|
}
|
|
1446
1441
|
|
|
1442
|
+
async function uploadImageTo7Bu ({ photo, fileName, config, res }) {
|
|
1443
|
+
// 去不图床旧版本 https://7bu.top
|
|
1444
|
+
// TODO: 2022 年 4 月 30 日后去不图床将会升级新版本,此处逻辑要同步更新
|
|
1445
|
+
const formData = new FormData()
|
|
1446
|
+
formData.append('image', base64UrlToReadStream(photo, fileName))
|
|
1447
|
+
const uploadResult = await axios.post('https://7bu.top/api/upload', formData, {
|
|
1448
|
+
headers: {
|
|
1449
|
+
...formData.getHeaders(),
|
|
1450
|
+
token: config.IMAGE_CDN_TOKEN
|
|
1451
|
+
}
|
|
1452
|
+
})
|
|
1453
|
+
if (uploadResult.data.code === 200) {
|
|
1454
|
+
res.data = uploadResult.data.data
|
|
1455
|
+
} else {
|
|
1456
|
+
throw new Error(uploadResult.data.msg)
|
|
1457
|
+
}
|
|
1458
|
+
}
|
|
1459
|
+
|
|
1460
|
+
async function uploadImageToSmms ({ photo, fileName, config, res }) {
|
|
1461
|
+
// SM.MS 图床 https://sm.ms
|
|
1462
|
+
const formData = new FormData()
|
|
1463
|
+
formData.append('smfile', base64UrlToReadStream(photo, fileName))
|
|
1464
|
+
const uploadResult = await axios.post('https://sm.ms/api/v2/upload', formData, {
|
|
1465
|
+
headers: {
|
|
1466
|
+
...formData.getHeaders(),
|
|
1467
|
+
Authorization: config.IMAGE_CDN_TOKEN
|
|
1468
|
+
}
|
|
1469
|
+
})
|
|
1470
|
+
if (uploadResult.data.success) {
|
|
1471
|
+
res.data = uploadResult.data.data
|
|
1472
|
+
} else {
|
|
1473
|
+
throw new Error(uploadResult.data.message)
|
|
1474
|
+
}
|
|
1475
|
+
}
|
|
1476
|
+
|
|
1477
|
+
async function uploadImageToLskyPro ({ photo, fileName, config, res }) {
|
|
1478
|
+
// 自定义兰空图床(v2)URL
|
|
1479
|
+
const formData = new FormData()
|
|
1480
|
+
formData.append('file', base64UrlToReadStream(photo, fileName))
|
|
1481
|
+
const url = `${config.IMAGE_CDN}/api/v1/upload`
|
|
1482
|
+
let token = config.IMAGE_CDN_TOKEN
|
|
1483
|
+
if (!token.startsWith('Bearer')) {
|
|
1484
|
+
token = `Bearer ${token}`
|
|
1485
|
+
}
|
|
1486
|
+
const uploadResult = await axios.post(url, formData, {
|
|
1487
|
+
headers: {
|
|
1488
|
+
...formData.getHeaders(),
|
|
1489
|
+
Authorization: token
|
|
1490
|
+
}
|
|
1491
|
+
})
|
|
1492
|
+
if (uploadResult.data.status) {
|
|
1493
|
+
res.data = uploadResult.data.data
|
|
1494
|
+
res.data.url = res.data.links.url
|
|
1495
|
+
} else {
|
|
1496
|
+
throw new Error(uploadResult.data.message)
|
|
1497
|
+
}
|
|
1498
|
+
}
|
|
1499
|
+
|
|
1447
1500
|
function base64UrlToReadStream (base64Url, fileName) {
|
|
1448
1501
|
const base64 = base64Url.split(';base64,').pop()
|
|
1449
1502
|
const path = `/tmp/${fileName}`
|
|
@@ -1451,6 +1504,10 @@ function base64UrlToReadStream (base64Url, fileName) {
|
|
|
1451
1504
|
return fs.createReadStream(path)
|
|
1452
1505
|
}
|
|
1453
1506
|
|
|
1507
|
+
function isUrl (s) {
|
|
1508
|
+
return /^http(s)?:\/\//.test(s)
|
|
1509
|
+
}
|
|
1510
|
+
|
|
1454
1511
|
function getAvatar (comment) {
|
|
1455
1512
|
if (comment.avatar) {
|
|
1456
1513
|
return comment.avatar
|
package/package.json
CHANGED