hink - 只需 10 行代码的短链接系统

和大家分享一个最近做的小工具——hink,一个用不到 10 行代码实现的短链接系统。

这个工具利用 Git 和 Serverless 平台,实现了短链接生成和访问统计功能。

核心原理:Git 提交哈希值的妙用

hink 的核心思路很简单:用 Git 的空提交哈希值作为短链接的唯一标识符,把原始长链接存储在提交信息中。访问短链接时,系统通过 GitHub 的 .patch 文件接口读取提交信息,提取长链接并重定向。结合云平台的 WAF(Web 应用防火墙)分析面板,还能实现访问统计。

目前,这个方案已经在以下平台测试通过:

代码:极简实现

hink 的代码非常短小,核心逻辑只有几行。以下是针对不同平台的实现。

Cloudflare Workers / 阿里云 ESA 版本

const GIT_REPO = "https://github.com/ccbikai/hink"
export default {
  async fetch(request) {
    const { pathname } = new URL(request.url)
    const gitPatch = `${GIT_REPO}/commit${pathname}.patch`
    const patch = await fetch(gitPatch, { cf: { cacheEverything: true, cacheTtlByStatus: { '200-299': 86400 } }}).then(res => res.text())
    const url = pathname === '/' ? GIT_REPO : patch.match(/^Subject:\s*\[PATCH\](.*)$/m)?.[1]?.trim()
    return Response.redirect(url || GIT_REPO)
  }
}

腾讯云 EdgeOne 版本

const GIT_REPO = "https://github.com/ccbikai/hink"
addEventListener("fetch", async (event) => {
  const { pathname } = new URL(event.request.url)
  const gitPatch = `${GIT_REPO}/commit${pathname}.patch`
  const patch = await fetch(gitPatch).then(res => res.text())
  const url = pathname === '/' ? GIT_REPO : patch.match(/^Subject:\s*\[PATCH\](.*)$/m)?.[1]?.trim()
  event.respondWith(new Response(null, { status: 302, headers: { Location: url || GIT_REPO } }))
});

部署到 Serverless 平台后,绑定一个域名,就能拥有自己的短链接服务。

为什么做 hink?

短链接服务并不新鲜,市面上有很多工具。但 hink 的目标是探索一种极简且有趣的实现方式。利用 Git 提交哈希值,避免了数据库管理,借助 GitHub 实现存储,而云平台的 WAF 功能让访问统计变得简单。这对我来说是一次技术实验,用最少的代码解决实际问题。

演示效果:三大平台运行情况

我在 Cloudflare Workers、阿里云 ESA 和腾讯云 EdgeOne 上部署了 hink,并通过 WAF 面板查看访问统计。以下是各平台的运行截图:

Cloudflare Workers

Cloudflare

阿里云 ESA

Alibaba

腾讯云 EdgeOne

Tencent

项目地址

ccbikai/hink - GitHub