萌芽表情包图库 · API 说明

纯静态站点(Cloudflare Pages)。 所有接口都是 GET,JSON 接口已开启 CORS,可被任意网页 / 脚本调用。

目录

1. 获取表情包清单

GET /memes.json (旧版兼容:/api/v1/memes,内部 _redirects 映射为同一份 JSON)

返回所有分类及文件相对路径;前端与脚本可用其拼接直链。

curl -sS ""

返回结构

{
  "generatedAt": "2026-05-19T13:01:45.229Z",
  "categories": [
    {
      "id": "白色小人",
      "name": "白色小人",
      "items": [
        { "file": "1.webp",  "path": "白色小人/1.webp"  },
        { "file": "2.webp",  "path": "白色小人/2.webp"  }
      ]
    }
  ]
}

字段说明

generatedAt
清单生成时间,ISO 8601 UTC
categories[].id
分类目录名,URL 中需编码
categories[].name
展示名(当前与 id 相同)
items[].file
文件名,含扩展名 .webp / .gif
items[].path
{分类}/{文件名},拼接成 /meme/{path} 即直链

站点根目录对应构建产物 dist/(本地从 public/ 同步而来);表情文件在 /meme/<分类>/,对应 URL:

GET /meme/<分类>/<文件名>.webp.gif

https://meme.smyhub.com/meme/%E7%99%BD%E8%89%B2%E5%B0%8F%E4%BA%BA/1.webp

中文或多段路径请使用编码后的 URL(浏览器会自动处理;图库「复制链接」按钮已帮你编好)。

响应头

由 Cloudflare 边缘缓存,Cache-Control: public, max-age=...;按需可直接 ?v=<时间戳> 绕过缓存。

3. CORS

/memes.json/api/v1/memes 已配置:

Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, HEAD, OPTIONS
Access-Control-Allow-Headers: Content-Type

图片资源 /meme/... 无 CORS 限制(普通 <img> / <a> 引用即可)。

4. 维护流程(仅项目维护者)

  1. 原图/<分类>/ 放入未编号素材;运行 python 转化.py,在 原图-已处理/ 生成编号 .webp / .gif 并限最长边(默认 250px)。默认保留 原图/ 源文件,清理可加 --delete-sources
  2. 动图 WebP 会在 python 转化.py 转换流程中转为 GIF。
  3. npm run build:生成 dist/(含 dist/memes.json)。请先把 原图-已处理/ 拷入 public/meme/ 再构建;构建脚本不会覆盖 public/meme/
  4. 上线(生产):项目在 Cloudflare 已连接 Git 时,由推送生产分支触发云端构建:npm run buildgit add/commit/push;仪表盘「构建命令」填 npm run build,「构建输出目录」填 distwrangler pages deploy dist 在 Git 项目里常显示为预览,属正常。

5. 客户端示例

JavaScript (浏览器 / Node 18+)

// 拉清单
const r = await fetch("https://meme.smyhub.com/memes.json");
const { categories } = await r.json();

// 随机抽一张
const cat = categories[Math.floor(Math.random() * categories.length)];
const it  = cat.items[Math.floor(Math.random() * cat.items.length)];
const url = `https://meme.smyhub.com/meme/${encodeURIComponent(cat.id)}/${encodeURIComponent(it.file)}`;
console.log(url);

Python

import json, random, urllib.parse, urllib.request

with urllib.request.urlopen("https://meme.smyhub.com/memes.json") as r:
    data = json.load(r)

cat = random.choice(data["categories"])
it  = random.choice(cat["items"])
url = f"https://meme.smyhub.com/meme/{urllib.parse.quote(cat['id'])}/{urllib.parse.quote(it['file'])}"
print(url)

Markdown / HTML 嵌入

![哈哈](https://meme.smyhub.com/meme/%E7%99%BD%E8%89%B2%E5%B0%8F%E4%BA%BA/1.webp)

<img src="https://meme.smyhub.com/meme/%E7%99%BD%E8%89%B2%E5%B0%8F%E4%BA%BA/1.webp"
     alt="哈哈" loading="lazy" width="240"
     style="max-width:240px;width:100%;height:auto" />