@@ -91,7 +91,7 @@ exports.main = async (event, context) => {
9191 res = await commentLike ( event )
9292 break
9393 case 'COMMENT_SUBMIT' :
94- res = await commentSubmit ( event )
94+ res = await commentSubmit ( event , context )
9595 break
9696 case 'POST_SUBMIT' :
9797 res = await postSubmit ( event . comment , context )
@@ -838,7 +838,7 @@ async function like (id, uid) {
838838 * @param {String } event.pid 回复的 ID
839839 * @param {String } event.rid 评论楼 ID
840840 */
841- async function commentSubmit ( event ) {
841+ async function commentSubmit ( event , context ) {
842842 const res = { }
843843 // 参数校验
844844 validate ( event , [ 'url' , 'ua' , 'comment' ] )
@@ -852,7 +852,7 @@ async function commentSubmit (event) {
852852 // 异步垃圾检测、发送评论通知
853853 try {
854854 await app . callFunction ( {
855- name : 'twikoo' ,
855+ name : context . function_name ,
856856 data : { event : 'POST_SUBMIT' , comment }
857857 } , { timeout : 300 } ) // 设置较短的 timeout 来实现异步
858858 } catch ( e ) {
@@ -1396,9 +1396,9 @@ async function emailTest (event) {
13961396 const isAdminUser = await isAdmin ( )
13971397 if ( isAdminUser ) {
13981398 try {
1399- if ( ! transporter ) {
1400- await initMailer ( { throwErr : true } )
1401- }
1399+ // 邮件测试前清除 transporter,保证读取的是最新的配置
1400+ transporter = null
1401+ await initMailer ( { throwErr : true } )
14021402 const sendResult = await transporter . sendMail ( {
14031403 from : config . SENDER_EMAIL ,
14041404 to : event . mail || config . BLOGGER_EMAIL || config . SENDER_EMAIL ,
@@ -1420,21 +1420,16 @@ async function uploadImage (event) {
14201420 const { photo, fileName } = event
14211421 const res = { }
14221422 try {
1423- if ( ! config . IMAGE_CDN_TOKEN ) {
1423+ if ( ! config . IMAGE_CDN || ! config . IMAGE_CDN_TOKEN ) {
14241424 throw new Error ( '未配置图片上传服务' )
14251425 }
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 } )
14381433 }
14391434 } catch ( e ) {
14401435 console . error ( e )
@@ -1444,13 +1439,75 @@ async function uploadImage (event) {
14441439 return res
14451440}
14461441
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+
14471500function base64UrlToReadStream ( base64Url , fileName ) {
14481501 const base64 = base64Url . split ( ';base64,' ) . pop ( )
14491502 const path = `/tmp/${ fileName } `
14501503 fs . writeFileSync ( path , base64 , { encoding : 'base64' } )
14511504 return fs . createReadStream ( path )
14521505}
14531506
1507+ function isUrl ( s ) {
1508+ return / ^ h t t p ( s ) ? : \/ \/ / . test ( s )
1509+ }
1510+
14541511function getAvatar ( comment ) {
14551512 if ( comment . avatar ) {
14561513 return comment . avatar
0 commit comments