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
| const config = { no_ref: "off", //Control the HTTP referrer header, if you want to create an anonymous link that will hide the HTTP Referer header, please set to "on" ."off" theme: "", //Homepage theme, use the empty value for default theme. To use urlcool theme, please fill with "theme/urlcool" . cors: "on", //Allow Cross-origin resource sharing for API requests. password: "aaaaaaaaa", //password }
const html404 = `<!DOCTYPE html> <body> <h1>404 Not Found.</h1> </body>`
const html_noref = ` <!DOCTYPE html> <html>
<head> <title>Redirecting</title> <meta http-equiv="Refresh" content="1; url={Replace}" /> <meta name="referrer" content="no-referrer" /> </head>
<body> <p>Redirecting..<br /><a href="{Replace}">{Replace}</a></p> <script type="text/javascript"> /* <![CDATA[ */ setTimeout('window.location.replace( "{Replace}" + window.location.hash );', 1000 )
/* ]]> */ </script> </body>
</html> `
let response_header = { "content-type": "text/html;charset=UTF-8", }
if (config.cors == "on") { response_header = { "content-type": "text/html;charset=UTF-8", "Access-Control-Allow-Origin": "*", "Access-Control-Allow-Methods": "POST", } }
async function randomString(len) { len = len || 6; let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/ let maxPos = $chars.length; let result = ''; for (i = 0; i < len; i++) { result += $chars.charAt(Math.floor(Math.random() * maxPos)); } return result; } async function checkURL(URL) { let str = URL; let Expression = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/; let objExp = new RegExp(Expression); if (objExp.test(str) == true) { if (str[0] == 'h') return true; else return false; } else { return false; } } async function save_url(URL, KEY) { let random_key = KEY let is_exist = await LINKS.get(random_key) console.log(is_exist) if (is_exist == null) return await LINKS.put(random_key, URL), random_key else save_url(URL) } async function handleRequest(request) { console.log(request) if (request.method === "POST") { let req = await request.json() KEY = req["key"] || await randomString() console.log(req["url"])
if (req["password"] != config.password) { return new Response(`{"status":500,"key":": Error: Password Error!"}`, { status: 500 }) }
if (!await checkURL(req["url"])) { return new Response(`{"status":500,"key":": Error: Url illegal."}`, { headers: response_header, }) } let stat, random_key = await save_url(req["url"], KEY) console.log(stat) if (typeof(stat) == "undefined") { return new Response(`{"status":200,"key":"/` + random_key + `"}`, { headers: response_header, }) } else { return new Response(`{"status":200,"key":": Error:Reach the KV write limitation."}`, { headers: response_header, }) } } else if (request.method === "DELETE") { let req = await request.json() if (req["password"] != config.password) { return new Response(`{"status":500,"key":": Error: Password Error!"}`, { status: 500 }) }
const requestURL = new URL(request.url) const path = requestURL.pathname.split("/")[1] if (path == "") { return new Response(html404, { headers: { "content-type": "text/html;charset=UTF-8", }, status: 404 }) }
await LINKS.delete(path) return new Response(`{"status":200,"del":"/` + path + `"}`, { headers: response_header, })
}else if (request.method === "OPTIONS") { return new Response(``, { headers: response_header, })
}
const requestURL = new URL(request.url) const path = requestURL.pathname.split("/")[1] if (path == "") { return new Response(html404, { headers: { "content-type": "text/html;charset=UTF-8", }, status: 404 }) }
const value = await LINKS.get(path) if (value) { if (config.no_ref == "on") { no_ref = html_noref.replace(/{Replace}/gm, value) return new Response(no_ref, { headers: { "content-type": "text/html;charset=UTF-8", }, }) } else { return Response.redirect(value, 301) }
} // If request not in kv, return 404 return new Response(html404, { headers: { "content-type": "text/html;charset=UTF-8", }, status: 404 }) }
addEventListener("fetch", async event => { event.respondWith(handleRequest(event.request)) })
|