跳到主要内容

V2 模型如何防盗链

WordPress 后台 → Live2D 设置 → 基础设置 → API 方式 决定模型从哪里加载、防盗链由谁挡。本页只讲「自定义新版模型」(V2 / Cubism 4+)的两种方式:直链加载托管到本站

V1 模型不走这一页。 V1 模型本身就由插件本地 REST 接口(/wp-json/live2d/v1/model/*)发出,不需要再加一层防盗链。本页所有内容只针对 V2 模型。

选项 A:直链加载(适合已经在用对象存储 / CDN 的站长)

这种模式下插件不动你的 modelAPI,把它原封不动地交给浏览器去加载。防盗的事交给对象存储或 CDN 自己挡。常见三种做法(从简单到复杂):

1. 公共读 + Referer 白名单(最简单)

  • 阿里云 OSS:Bucket → 数据安全 → 防盗链,把你的网站域名加进白名单。
  • 腾讯云 COS:存储桶 → 安全管理 → 防盗链设置,操作类似。
  • 原理:浏览器加载模型时会带 Referer,不在白名单的来源直接 403。
  • 局限:稍微懂抓包的人能伪造 Referer 绕过。日常用够了。

2. 套一层自家 CDN,开 URL 鉴权

在 OSS 前面套阿里云 CDN / 腾讯云 CDN / Cloudflare,开启「URL 鉴权」或「Token 校验」,再把 modelAPI 填成带签名地址。这种比纯 Referer 严,但配置稍复杂。

3. 私有读 + 签名链接(最严格)

Bucket 设成私有,每次访问都带签名才能下载。这种模式不能直接在插件设置页里配置,需要懂 PHP 的人在主题 functions.php 里写代码动态生成签名 URL。本插件 不内置 任何具体云厂商 SDK,原因见 FAQ

选项 B:托管到本站(推荐 / 适合没法配防盗链的源)

选这个之后,模型文件会被保存到你自己的 WordPress 站点(wp-content/plugins/live-2d/model/{slug}/),并对外只露出一个加密过的临时签名 URL:

  • 访客 F12 看到的也是这个临时 URL,不会暴露源站地址
  • 每个文件有别名(hash 化路径),别人猜不到。
  • 2026-05 之后只支持站长手动触发下载或上传,不再有访客访问时的「自动懒下载」。

选了「托管到本站」之后表单怎么变

选这一项后,modelAPI 输入框会自动隐藏,系统会把它强制写成本站的 wp-content/plugins/live-2d/model/ 根地址。站长唯一需要填的就是 modelDir 列表,每行写一个 slug(= 子目录名),插件会按 {root}{slug}/{slug}.model3.json 的固定模板自动展开成完整的 manifest URL。

例如要加载 haru / Pio / shizuku 三个模型:

modelDir:
- haru
- Pio
- shizuku

插件会自动展开为:

https://your-site.com/wp-content/plugins/live-2d/model/haru/haru.model3.json
https://your-site.com/wp-content/plugins/live-2d/model/Pio/Pio.model3.json
https://your-site.com/wp-content/plugins/live-2d/model/shizuku/shizuku.model3.json

实际访客拿到的 URL 都是 /wp-json/live2d/v2/m/{token}/{alias}?e=&s= 这样的临时签名链路,源站再被改成 404 或防盗都不影响。

方式 1:从 URL 下载(模型已经有公网 URL)

  1. 把「API 方式」切到 自定义新版模型 · 托管到本站,保存。
  2. 页面下方会出现「模型托管」面板,默认在「从 URL 下载」tab。
  3. 在「模型源 URL」输入框填模型的 .model3.json 完整公网 URL(比如 https://example.com/haru/haru.model3.json),点「下载到本站」。
  4. 插件会从 URL 派生出 slug(比如 haru),立刻把它追加到上方 modelDir 列表,同时把整套模型文件入队,后台 cron 拉取到 model/haru/
  5. 所有 job 状态变成"已缓存"后,前台就走本地副本了。记得点页面底部「保存设置」,modelDir 才会写入数据库。

方式 2:上传文件夹(模型只在本地)

  1. 把「API 方式」切到 自定义新版模型 · 托管到本站,保存。
  2. 切到「模型托管」面板的「上传文件夹」tab,把整个模型目录(包含 .model3.json + .moc3 + 贴图 + 动作)拖到虚线框,或点击「选择文件夹」按钮选目录。
  3. 插件按相对路径串行上传到 model/{slug}/(slug 自动取你拖入的根目录名),进度条实时反映已上传字节。
  4. 上传完成后 slug 会自动追加到上方 modelDir 列表
  5. 顶部黄色横幅会显示当前服务器单文件上传上限(由 PHP upload_max_filesize 决定)。超过该上限的文件会被红色标记跳过,不会让 PHP 后台静默丢包。如果模型贴图普遍偏大,需要联系主机商或在 wp-config.php / .htaccess 调高 upload_max_filesizepost_max_size
  6. 上传完成后记得点页面底部「保存设置」,modelDir 才会写入数据库。

典型适用场景

  • 模型放在 GitHub Pages / GitHub Raw / jsDelivr。
  • 模型放在朋友的服务器,没法让对方加 Referer 白名单。
  • 购买了第三方付费模型,对方只给一个公开 URL,你不希望被白嫖。
  • 担心对象存储「按流量计费」账单失控。
  • 模型只在本地(没有任何公网 URL),想直接拖进去就完事。

FAQ

为什么插件不直接帮我接 OSS 私有读?

经常有人问「为啥不能让插件自己拿我的 OSS AccessKey 去签名转发?」三个原因:

  1. AccessKey 不能存数据库。 WordPress 的设置项是明文存的,万一数据库泄漏(被黑、备份外泄、共享主机出事),你的整个 OSS Bucket 就全没了,比模型被盗严重得多。
  2. 每家云的签名算法都不一样。 阿里云、腾讯云、AWS、Cloudflare R2、MinIO 各搞一套。做完一家就有人提"加 XX 云支持",没完没了。
  3. 真要用的人不需要插件帮忙。 能搞定 OSS 私有读的站长,自己写几行 PHP 比点设置页方便得多,也更安全(凭据可以走环境变量,不进数据库)。

想自己改代码接 OSS 签名链接?

目前插件没有提供专门的钩子给你拦截这个流程。如果实在想改,只能 fork 仓库,去 src/live2d-V2Api.php 里改 get_asset() / stream_local() 这两个函数,让它在命中你的私有 OSS 路径时返回一个 302 跳转到 OSS 预签名地址。

如果以后用这个功能的人多了,会考虑加一个正式的 live2d_v2_resolve_alias 钩子,但插件本身永远不会内置任何具体云厂商的 SDK

如果你真打算这么干,请务必:

  • 用最小权限的子账号(只给「读取对象」权限,限定到具体 Bucket / 目录)。
  • 千万不要把 SecretKey 直接写进 WordPress 设置项里,用环境变量或专门的密钥管理服务。
  • 对插件的 V2 防盗链 REST 路径加上 Referer 校验(在 wp-config.php 中显式开启,参考 live2d-V2Api.php 注释)。