那堆“免费”二维码生成器的套路,我算是领教够了。想给页面嵌个QR码,点进一个网站,填完网址,被告知要注册。注册完,让你创建API密钥。密钥转天就过期了。最离谱的是,生成的二维码跳转的不是你填的URL,而是一个短链接——点进去先跳他们自家的追踪页,广告糊脸,再跳回你真实地址。要是短链服务哪天挂了或者限流,你的码当场变废纸。更别说有些“永久有效”的码,半年后自动失效,连个通知都没有。
一个静态的二维码,本来只是一张位图,凭什么非要我交个人信息?它根本不该需要账户,也不该往服务器打任何汇报。所以,我干脆自己造了一个——QRKit。一个开放的、不需要API Key的免费二维码和条形码工具,直接把API暴露在公网上。用法就一行img标签:
就这。返回一张图,CORS全开,能嵌在任何网页或从后端直接curl拉取。支持SVG、自定义配色、更高的纠错等级,参数也就那几个:data(必填)、size、format(png或svg)、ecc(L/M/Q/H)、dark前景色、light背景色、margin、download。完整文档挂在qrkit.tools/api上。
关键的不同在于——你的数据是直接编码进二维码矩阵里的,没有中间重定向环节。这意味着:你填的是什么,扫出来的就是什么,没有第三方跳转;码不会过期,只要数据不变,这个码永远能用;没有任何追踪,不会有人统计你在哪个城市扫了这个码。不收集数据,不插广告,这才是二维码本该有的诚实默认状态,也是整个项目存在的唯一理由。
整套服务跑在Cloudflare免费套餐上:Pages加Pages Functions。为了做到这一点,我做了四个技术裁量,让自己稳稳躲在免费额度里。
第一,只算矩阵,不管渲染。多数二维码库会拖进Node的canvas或系统字体渲染器,这些在边缘Worker里根本打包不了。我拿qrcode的核心逻辑,让它只吐出模块矩阵,然后自己手写上层的SVG和PNG渲染器。零原生依赖,在边缘运行时干净打包。
第二,手搓零依赖的PNG编码器。PNG输出那条路,我一个外库都没引,直接手动把矩阵格子转成像素,再按PNG规范拼出文件头、IHDR、IDAT、IEND这些分块。这样一来,整个bundle小得可怜,完全压在工作线程的CPU预算线下面。当然,特别大尺寸的码,我建议直接取SVG——它分辨率无关,生成成本极低。
第三,用合批KV写来处理“已生成二维码计数”。页面上有个实时计数器,如果傻乎乎每次请求都写一次KV,免费额度每天1000次写入瞬间就会爆。我的做法是:每个隔离实例先把计数缓在内存里,最多每一分钟往KV冲刷一次,而读取时把还未落盘的增量也加上,让前端数字依然看上去实时跳动。这个数字算尽力精确,不吹不装,足够满足一下好奇心,也不会把账单打穿。
第四,靠WAF的免费速率限制规则做防滥用。Pages Functions不原生支持Workers的ratelimit绑定,所以我在边缘加了一条Cloudflare免费套餐里自带的WAF速率规则,按IP限流。不写一行代码,不产生一分钱额外开销。
API上没有广告,整个站没有任何埋点,只一个人维护。如果觉得好用,页面上有个“请我喝杯咖啡”的入口,这就是整个商业模式。与其植入那些让我自己都恶心的暗黑模式,我倒情愿让它干干净净地免费。反正二维码只是数据的一张位图,本来就不该收过路费。
热门跟贴