如何用Cloudflare worker自建短链接服务

短链接又称短网址、短码,意思就是形式上比较短的网址,可以通过将一个普通的冗长的网址缩短生成一个新的较短的网址,便于分享传播。

短链接主要应用场景如下:

短信发送 短信里用短链接,可以极大减少字符,现在很多营销短信都是用的短网址。

社群推广 很多社区或社交网站,会屏蔽长链接。微博字数限制,公众号关键字链接限制等,短网址可以缩短字符,规避掉这些限制。

微信防屏蔽 微信里有各种屏蔽,用短链接可以避免暴露原有地址关键字,规避屏蔽。

活码 短网址是固定的,可以通过修改原链接达到变更地址的作用,此时不用去修改固定的短网址,短网址就相当于一个中间层。主要用于替换更换链接成本较高的地方,比如生成好的二维码等。

搭建

这里利用cloudflare workers提供的服务,免费版本每日100000次请求,对个人使用而言完全足够。

  1const html404 = `<!DOCTYPE html>
  2<body>
  3  <h1>404 0.</h1>
  4  <p>0.</p>
  5</body>`
  6
  7// const statichtml = "https://raw.githubusercontent.com/1x000/zdzy/main/duanlnk/index.html"
  8
  9
 10async function randomString (len) {
 11    len = len || 6
 12    let $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'    /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
 13    let maxPos = $chars.length
 14    let result = ''
 15    for (i = 0; i < len; i++) {
 16        result += $chars.charAt(Math.floor(Math.random() * maxPos))
 17    }
 18    return result
 19}
 20async function checkURL (URL) {
 21    let str = URL
 22    let Expression = /http(s)?:\/\/([\w-]+\.)+[\w-]+(\/[\w- .\/?%&=]*)?/
 23    let objExp = new RegExp(Expression)
 24    return objExp.test(str) && str[0] === 'h'
 25}
 26async function save_url (URL, shortStr) {
 27    console.log("shortStr:", shortStr)
 28    let random_key
 29    if (!shortStr) {
 30        random_key = await randomString()
 31    } else {
 32        random_key = shortStr
 33    }
 34    let is_exist = await LINKS.get(random_key)
 35    console.log(is_exist)
 36    if (is_exist == null) {
 37        // 正常,直接放入
 38        let stat = await LINKS.put(random_key, URL)
 39        if (typeof (stat) === "undefined") return random_key
 40        else return stat
 41    } else if (!shortStr) {
 42        // 生成的random_key重复了,递归调用
 43        return save_url(URL, null)
 44    } else
 45        // 自定义的路径已经存在了
 46        return -1
 47
 48}
 49async function handleRequest (request) {
 50    console.log(request)
 51    if (request.method === "POST") {
 52        let req = await request.json()
 53        console.log(req["url"])
 54        if (!await checkURL(req["url"]))
 55            return new Response(`{"msg":"0"}`, { status: 400, headers: { "Content-Type": "application/json" } })
 56        let random_key = await save_url(req["url"], req["shortStr"])
 57        console.log(random_key)
 58        // 放成功了
 59        if (Object.prototype.toString.call(random_key) === "[object String]")
 60            return new Response(`{"data":{"shortUrl":"${random_key}"}}`, { status: 200, headers: { "Content-Type": "application/json" } })
 61        // 自定义的路径重复了
 62        else if (random_key === -1)
 63            return new Response(`{"msg":"0"}`, { status: 400, headers: { "Content-Type": "application/json" } })
 64        // 没测试k-v满了之后会怎么样,如果有错的话put时应该会有返回(猜测(懒
 65        else return new Response(`{"msg":"0"}`, { status: 500, headers: { "Content-Type": "application/json" } })
 66    }
 67    const requestURL = new URL(request.url)
 68    // todo 规范路径的'/'
 69    const path = requestURL.pathname.toString().substring(1);
 70    console.log(path)
 71    if (!path) {
 72
 73        const html = await fetch(statichtml)
 74
 75        return new Response(await html.text(), {
 76            headers: {
 77                "content-type": "text/html;charset=UTF-8",
 78            },
 79        })
 80    }
 81    const value = await LINKS.get(path)
 82    console.log(value)
 83
 84
 85    const location = value
 86    if (location) {
 87        return Response.redirect(location, 302)
 88
 89    }
 90    // If request not in kv, return 404
 91    return new Response(html404, {
 92        headers: {
 93            "content-type": "text/html;charset=UTF-8",
 94        },
 95        status: 404
 96    })
 97}
 98
 99
100
101addEventListener("fetch", async event => {
102    event.respondWith(handleRequest(event.request))
103})

解释

这段代码是一个可以用Cloudflare Workers和KV存储创建一个URL缩短服务的脚本。它允许用户输入一个长URL,然后得到一个可以重定向到原始URL的短URL。它还支持自定义短URL的路径。下面是一个如何使用这段代码的教程:

  1. 创建一个Cloudflare账户和一个Workers订阅。你可以使用免费计划,每天允许最多10万次请求。
  2. 在Workers控制台中创建一个KV命名空间,命名为LINKS。这个命名空间将用来存储短URL和长URL的映射关系。
  3. 在Workers控制台中创建一个Worker,将这段代码粘贴到编辑器中。你可以修改代码中的一些变量,比如html404和statichtml,来自定义404页面和首页的内容。
  4. 部署Worker,并选择一个域名,比如example.workers.dev。这个域名将作为你的URL缩短服务的地址。
  5. 访问你的域名,你应该看到一个简单的网页,有一个输入框和一个按钮。你可以在输入框中输入一个长URL,然后点击按钮,就会得到一个短URL。你也可以在按钮旁边的输入框中输入一个自定义的路径,来指定你想要的短URL。如果自定义的路径已经被占用了,你会收到一个错误提示。
  6. 你可以复制生成的短URL,并在浏览器中打开它,就会跳转到原始的长URL。你也可以分享这个短URL给其他人,让他们访问你想要分享的网页。

警告

如果你要公开使用的话其中的HTML注释一定要去掉,如果你需要私有化的话请注释,因为总有人会往里面放写非法链接,导致域名出事。

 

版权声明:本文内容采用 CC BY-NC-SA 4.0 协议许可,转载请注明
文章名称:如何用Cloudflare worker自建短链接服务
文章链接:https://www.baizi.net/sharing/196.html
文章链接:https://www.baizi.net/sharing/196.html
根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24小时内从您的设备中彻底删除下载内容,否则一切后果请您自行承担,如果您喜欢该程序,请购买注册正版以得到更好的服务。
联系方式(#替换成@):serverr#baizi.net

THE END
分享
二维码
海报
如何用Cloudflare worker自建短链接服务
短链接又称短网址、短码,意思就是形式上比较短的网址,可以通过将一个普通的冗长的网址缩短生成一个新的较短的网址,便于分享传播。 短链接主要应用场景如下……
<<上一篇
下一篇>>