少女
384 字
2 分钟
Deno Deploy部署Artitalk_SafeMode
2024-06-16

Artitalk自带SafeMode,但是需要使用Cloudflare Workers,在某些地区不方便使用

本人修改了原版的Workers脚本,并将其移植到了Deno Deploy

需要设置的环境变量:

APPID: 字符串

APPKEY: 字符串

SERVERDOMAIN: 当前Deno Deploy的域名,不带https://

ATCOMMENT: true或false

CORS: url1,url2,url3 (url之间用半角逗号隔开 且没有空格)

修改后的脚本如下

async function handleRequest(request: Request): Promise<Response> {
    const AppId: string = Deno.env.get('APPID')
    const AppKey: string = Deno.env.get('APPKEY')
    const ServerDomain: string = Deno.env.get('SERVERDOMAIN')
    const atComment: Boolean = Deno.env.get('ATCOMMENT') == 'true'
    const CORS: string[] = Deno.env.get('CORS').split(',')

    const url: URL = new URL(request.url)
    const urlObj: URL = new URL(url)
    const path: string = urlObj.href.substr(urlObj.origin.length)
    const classac: string = l(rp(path).split('/'))

    if (AppId == "" || AppKey == "") { return new Response('Artitalk-Safe异常: 您没有设定appid和appkey') }
    if (classac == "atComment" && !atComment) { return new Response('{"code":101,"error":"Artitalk-Safe: 评论功能未开启"}', { headers: { "content-type": "application/json;charset=utf-8" } }) }
    if (classac == "_File" || classac == "_Followee" || classac == "_Follower" || classac == "_Installation" || classac == "_Role") { return new Response('{"code":101,"error":"Artitalk-Safe: 操作是禁止的"}', { headers: { "content-type": "application/json;charset=utf-8" } }) }

    url.hostname = ServerDomain
    const reqHEDNew: Headers = new Headers(request.headers)
    if (reqHEDNew.get("X-LC-Id")) {
        reqHEDNew.set("X-LC-Id", AppId)
        reqHEDNew.set("X-LC-Key", AppKey)
    }
    if (reqHEDNew.get("x-lc-sign")) {
        reqHEDNew.delete("X-LC-Sign")
    }
    const reqNew: Request = new Request(request, { headers: reqHEDNew })
    const responsefetch: Response = await fetch(url.toString(), reqNew)
    const resHEDNew: Headers = new Headers(responsefetch.headers)
    
    var flag: Boolean = false
    for (let pair of request.headers.entries()) {
        if (pair[0] == 'referer') {
            for (let url of CORS) {
                if (pair[1].indexOf(url) != -1) {
                    resHEDNew.set("Access-Control-Allow-Origin", url.slice(0, -1))
                    flag = true
                    break
                }
            } break
        }
    }

    if (!flag){
        resHEDNew.delete("Access-Control-Allow-Origin")
    }

    const response: Response = new Response(responsefetch.body, { headers: resHEDNew })
    return response
}

function rp(p: string): string {
    return p.split("?")[0]
}

function l(p: string[]): string {
    return p[getJsonLength(p) - 1]
}

function getJsonLength(jsonData: string[]): number {
    var jsonLength = 0
    for (var _ in jsonData) {
        jsonLength++
    }
    return jsonLength
}

Deno.serve((req: Request) => {
    return handleRequest(req)
});
Deno Deploy部署Artitalk_SafeMode
https://onaniishoujo.github.io/posts/deno-deploy部署artitalk-safemode/
作者
オナニー少女
发布于
2024-06-16
许可协议
CC BY-NC-SA 4.0