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.
Files changed (2) hide show
  1. package/index.js +79 -22
  2. 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: 'twikoo',
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.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
- if (!transporter) {
1400
- await initMailer({ throwErr: true })
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
- const formData = new FormData()
1427
- formData.append('image', base64UrlToReadStream(photo, fileName))
1428
- const uploadResult = await axios.post('https://7bu.top/api/upload', formData, {
1429
- headers: {
1430
- ...formData.getHeaders(),
1431
- token: config.IMAGE_CDN_TOKEN
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "twikoo-func",
3
- "version": "1.5.2",
3
+ "version": "1.5.5",
4
4
  "description": "A simple comment system based on Tencent CloudBase (tcb).",
5
5
  "author": "imaegoo <hello@imaegoo.com> (https://github.com/imaegoo)",
6
6
  "license": "MIT",