把 1,077 张塔菲表情做成可爱图库:采集、优化与备份教程

我想做一个打开就能挑表情的小站:不用注册,能区分动图和静态图,喜欢的先收藏,下载后直接发到聊天里。于是有了 塔菲喵图库。这篇介绍它的数据整理方式、网页优化和备份恢复,方便以后继续扩充,而不是把图片堆成一个下载目录。

塔菲喵图库首页:粉色贴纸拼贴和表情统计
当前版本的真实首页。非官方、非商业粉丝整理,素材版权归原作者。

先看看它能做什么

截至 2026 年 10 月 14 日,图库整理了 1,077 张表情:706 张动图、371 张静态图,来自 16 个合集。可以按类型、合集、标题和标签筛选,预览后下载 GIF、PNG 或原文件;收藏记录只保存在自己的浏览器。网易云播放器需要点击才载入,不会自动播放。

来源包括最初的五个 Telegram 表情包、TaffySticker 的公开整理,以及 B 站的两个公开图文合集。QQ、微信和部分微博粉丝创作,是通过这些公开整理包收录的,不是登录他人的 QQ 或微信去读取聊天记录。微博引路帖尚未独立批量导入,不能把“有一个来源链接”当成“已经抓取完成”。

一、用公开接口采集,先把原文件留下来

Telegram 表情包不需要把整段聊天爬下来。先从公开的 TaffySticker 整理页发现包名,再用 getStickerSet 取包内贴纸信息,使用 getFile 下载对应文件。这里不调用 getUpdates,也不修改既有机器人的 webhook,避免影响其他 Bot 服务。

B 站部分来自 塔菲 2.0 表情分享 和 百枚表情合集。提取公开图片地址后,只允许 B 站图片域名和固定的 /bfs/ 路径,限制文件大小,少量并行下载;遇到失败做退避重试,而不是无限刷请求。

采集后,每张素材都记录来源、作者信息(来源可提供时)、格式、尺寸、文件名和稳定 ID。原文件独立保存,展示用的转换结果不覆盖原件。当前是批准来源后的批次采集,不是全天候监测整个互联网;“全部平台、全部素材都抓完了”也不是这个版本的承诺。

二、去重和检查:做了图像处理,但不是 AI 看图

第一层按文件的 SHA-256 去重。第二层把静态图解码为 RGBA,比较尺寸和像素哈希,识别“文件编码不同、像素却完全相同”的重复图。本次扩展排除了 6 张重复素材,同时保留来源关联,避免收藏链接因为去重失效。

动图有时第一帧完全透明,直接拿第一帧做缩略图会得到空白卡片。构建过程检查透明像素比例与图像熵,再从后续帧中挑一个可见的画面。本次修复了 4 张这类缩略图。

现在的检索是标题、标签、emoji 和合集名称的文本匹配。部分情绪标签由 emoji 规则补充,再做人工抽查。它没有 CLIP 向量索引、OCR 全文识别或人物视觉分类;不能输入一张图,就自动找到所有相似表情。像素去重也不能识别裁剪、加字或换色后的“近似图”。这些是可以继续做的方向,不是已经实现的功能。

三、原画、预览、聊天兼容版分开

  • 原文件:保留下载到的 WebM、WebP、JPEG、PNG 或 GIF,不重新压缩。
  • 缩略图:生成约 256px 的 WebP,列表先加载它。
  • 动态预览:优先使用轻量 WebM,避免同时加载几十个大 GIF。
  • 聊天下载:提供 GIF 或静态 PNG。GIF 转换版最多 20fps、256 色,过大时再缩小;它是兼容版,不是“完全无损原画”。

FFmpeg 的 GIF 转换使用 palettegen/paletteuse 调色板与透明度设置,Pillow 负责静态图和缩略图。想保留质量,就下载“原版”;想直接发聊天工具,就选 GIF/PNG。两种需求不能用同一个“无损”标签混淆。

四、网页为什么不用复杂后端

这类只读图库适合 HTML、CSS、原生 JavaScript 加一个 catalog.json。目录约 600KB,一次载入后,搜索和筛选在浏览器内完成,不必每输入一个字就请求服务器。搜索做 160ms 防抖,列表每次展示 48 张,继续浏览再增量加载。

IntersectionObserver 只让进入可视区域的动画播放,离开就暂停;切到后台标签页也停止动画。系统要求减少动态效果时,默认暂停。这比一次塞入 706 张动图更省流量,也更适合手机。收藏使用 localStorage,不需要用户数据库;清理浏览器数据会丢失本地收藏,换设备也不会自动同步。

五、腾讯云只转发,不存一整个图库

当前访问路径是:浏览器 → 腾讯云 HTTPS → Cloudflare Pages HTTPS → 返回内容。Caddy 将请求流式转发到固定的 Pages 源站,校验上游 TLS,只允许 GET/HEAD,删除发往上游的 Cookie 和 Authorization。不是允许填写任意 URL 的开放代理。

腾讯云没有存放图库图片、没有磁盘缓存,也没有为它运行图片数据库。全部展示媒体约 2.6GB,仍由 Cloudflare Pages 托管。Caddy 的证书和配置是很小的正常运行文件,流式传输会使用少量内存缓冲,不等于“零内存消耗”。服务器重置时,原始图库不会随之丢失。

taffy.bismih.cn {
  encode zstd gzip
  @read method GET HEAD
  handle @read {
    reverse_proxy https://bismih-taffy-media.pages.dev {
      header_up Host bismih-taffy-media.pages.dev
      header_up -Cookie
      header_up -Authorization
      transport http {
        tls_server_name bismih-taffy-media.pages.dev
        response_header_timeout 10s
      }
    }
  }
  respond 405
}

要使用自己的域名,还需要有效 HTTPS 证书和正确 DNS;不要关闭 TLS 校验来“解决”证书问题。上面的代理模式参考 Caddy 官方文档,没有安装磁盘缓存插件。

实测改善多少?

切换前,从我的物理网络禁用本机代理,用相同文件交替测了两轮。下面是总下载时间的平均值,包含建立连接与传输,不是纯带宽测速。

样本直接访问 Cloudflare经过腾讯云
目录 JSON,约 600KB9.26 秒1.25 秒
缩略图,约 23KB1.80 秒0.69 秒
WebM,约 245KB2.52 秒1.85 秒

目录和小图有明显改善,动图有波动:第一轮腾讯云更慢,第二轮更快。这是一个网络、两轮、小样本的结果,不代表所有运营商都能获得同样提升,也不是宣称腾讯云必然比 Cloudflare 快。实际收益应继续看自己的手机与 Wi-Fi。Cloudflare 原入口和 GitHub 备用站都保留,切换失败不必重新采集。

六、两个独立平台备份,原件比转换版重要

主存储是 Cloudflare Pages;第二份是 GitHub Pages 备用图库,代码和恢复资料在 公开仓库。备用站保留全部 1,077 张素材的原文件、缩略图、静态 PNG 和轻量预览,约 342MiB;图片加载失败时会尝试备用地址。

不是把 2.6GB 都塞进 GitHub Pages:它的发布站点上限为 1GB。大体积、可再生成的 GIF 兼容文件没有全部放进备用站;主站下载失败时,可以退回到备用原文件,扩展名也跟着原格式改变,不能把 WebM 假装成 GIF。

backup-manifest.json 保存每个镜像文件的字节数与 SHA-256。备份验收检查了原件齐全性,并对主、备站的目录、缩略图和原文件进行了远程哈希抽查。独立平台不能消除版权移除或服务限额风险,所以保留原件和恢复脚本比盲目上传到十个匿名图床更可靠。目前没有启用需要账号密钥的第三方图床自动上传,也没有借用网上泄露的 API Key。

恢复成自己的静态图库

安装 Python、Pillow、requests 和 FFmpeg 后,从公开镜像重建。备份中的原件路径已记录在元数据里。兼容 GIF 的重新编码会花时间,原件本身不需要重新采集。

git clone https://github.com/lizi-learn/taffy-sticker-gallery.git
cd taffy-sticker-gallery
mkdir -p dist collection/originals media-host
cp index.html app.js style.css favicon.svg catalog.json dist/
cp restore-metadata/items.json collection/items.json
cp -a media/. collection/originals/
cp -a media media-host/
python3 tools/build_catalog.py
python3 tools/check_catalog.py

重建后,把 dist 的前端文件和 media-host/media 一起部署到自己的静态托管,修改目录里的 assetBase 为自己的媒体地址。仓库没有账号凭据;重新采集 Telegram 需要你自己的 Bot token,不能把带 token 的 API URL 放进公开 JSON、日志或前端。

最后:把可爱存久一点,也保留边界

这个版本的采集、去重、预览、筛选、下载和双平台原件备份已经串起来了。它不是 AI 识图产品,也不是所有平台的实时爬虫。下一步如果要加以图搜图、定期更新或收藏同步,可以在稳定 ID 和来源记录的基础上继续做。

网站不要求登录,也不上传收藏记录。但访问服务器、图床和主动打开的网易云播放器,仍会产生正常的网络请求;不能把“没有账号系统”说成“互联网完全看不到访问”。素材只用于非商业粉丝交流,来源公开不代表取得商用授权;权利人可以通过站长公开博客留言提出更正或移除请求。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇