Show HN:ShadowCat – 通过浏览器中的二维码传输文件
摘要
ShadowCat 是一个离线单文件HTML页面,用于通过二维码在设备间传输数据,适用于摄像头和浏览器功能正常但无线电损坏的老款手机。
查看缓存全文
缓存时间: 2026/05/22 12:23
unprovable/ShadowCat 来源:https://github.com/unprovable/ShadowCat
ShadowCat
一个完全离线、单文件 HTML 页面,通过二维码在两台设备之间传输数据——专为那些无线功能(BLE、NFC 等)已损坏,但摄像头和浏览器仍能工作的旧手机设计。
选项卡
- 生成 — 将文本编码为单个二维码。
- 扫描 — 通过摄像头解码单个二维码。
- 发送文件 — 选择文件,设置分块大小 / 帧率 / 纠错等级,点击开始。以所选帧率无限循环播放 [文件头, 数据块1…数据块N]。支持暂停 / 继续 / 停止。
- 从…开始 — 从指定的帧索引开始循环;之后正常向前播放并回到文件头。
- 显示帧 + 显示 / − / + — 静态显示某一帧,用于重新发送丢失的特定数据块。显示的帧序号与接收端缺失块网格中的序号一致(0 表示文件头)。
- 接收文件 — 启动摄像头对准发送端。文件头自动检测,进度条填充,缺失块网格显示尚未到达的块。传输完成后验证文件的 CRC 并显示下载按钮。
协议
- 文件头:
QRX1|H|||| - 数据块:
QRX1|D||(序号从 1 开始) - Base64 字母表中不含
|,因此直接使用split('|')解析。 - 接收端按索引追踪数据块,忽略重复块,并通过 CRC 去重文件头。
旧手机实用提示
- 摄像头需要 HTTPS 或 localhost——
file://无法获取getUserMedia权限。可使用python3 -m http.server 8000提供服务,然后通过局域网访问http://<IP>:8000/qrcode.html。iOS Safari 跨设备访问还需要 HTTPS——局域网环境下可使用caddy或自签名证书。 - 如果某一帧渲染失败(“code length overflow”),请减小数据块大小或降低纠错等级。
- 每块 500 字符 × 3 fps ≈ 1.1 KB/s(Base64 编码)≈ 0.83 KB/s(原始数据)。一个 100 KB 的文件每轮循环约需 2 分钟;接收端通常需要 1–2 轮循环。
- 如果旧设备解码困难:降低帧率,将纠错等级提升至 Q,将数据块缩小到约 300 字符——这样生成的二维码更小、密度更低。
相似文章
@QingQ77: 两台都不能上网的设备间倒文件太麻烦,干脆让发送端把文件编码成一组动态二维码,接收端对着屏幕扫一遍就能收下来。 https://github.com/deedy/qr-data-transfer…
QRFerry is an open-source browser-based tool that transfers files between two offline devices by encoding data as a live animated QR stream, using RaptorQ fountain coding and WebAssembly.
Show HN: Kage – 将任意网站快照为单个二进制文件,支持离线浏览
Kage 是一个 Go 工具,它通过无头 Chrome 渲染页面、快照 DOM 并剥离 JavaScript,将网站克隆为可离线访问的文件夹。它输出静态 HTML 文件,无需网络即可浏览。
Decimen Optical Transfer:喷泉码二维码文件传输
Decimen Optical Transfer 是一个开源网页应用,通过动画二维码和喷泉码在设备之间发送文件,只需屏幕和摄像头,无需网络连接。它支持最大 64 MB 的文件,作为 PWA 可离线使用,传输速率约为 130 KB/s。
Show HN:TrueType 字体中的二维码渲染器
一款 TrueType 字体,利用 OpenType 规则从括号内的文本直接内联渲染二维码,无需单独生成图片。
Show HN:让PDF看起来像扫描件(通过命令行工具或浏览器中的WebAssembly)
一款命令行工具和基于浏览器的工具,使用Go和WebAssembly,将PDF转换为仅包含图像的PDF,并模拟扫描效果,如倾斜、灰度、噪点和JPEG伪影。