Waline配置--评论区头像
注:本文的前一大段部分均为转载(因为偷懒,所以很多图片没有自己放),后半部分自定义随机头像为本人原创:
前半部分原文请看:https://blog.uuanqin.top/p/1d248fa3/
公共头像服务简介
Gravatar
是WordPress 母公司 Automattic 推出的一个公共头像服务。你只需要去 Gravatar.com 注册账号绑定自己的域名邮箱,然后上传自己的头像。在逛博客评论的时候,邮箱填写您的域名邮箱,会默认输出你在 Gravatar 上传的头像。
Gravatar 可以说是较知名且应用较广泛的公共头像服务了。Wordpress、GitHub、OpenAI、Figma、Stack Overflow 等网站都在使用 Gravatar 服务。但是由于一些原因,Gravatar 在国内使用体验并不好。
Libravatar
(Libre Avatar) 是一个免费服务,也是一个开放规范,用于托管与电子邮件或 OpenID 地址绑定的个人图像。
Libravatar 受 Gravatar 启发,并提供了额外的功能:允许域名所有者为自己的组织托管图像。Libravatar API 的使用方式和 Gravatar 很像,在大多数情况下,从 Gravatar 迁移到 Libravatar 只需要改一下域名就行。
如果在 Libravatar 找不到头像怎么办?
- 如果是通过邮件地址获取不到头像,将重定向至图像链接参数指定的默认头像。例如链接
https://seccdn.libravatar.org/avatar/HASH?d=/static/nobody.jpg中,d参数指定了默认头像的位置。 - 如果是通过 MD5 哈希算法获取不到头像,Libravatar 将首先重定向到 Gravatar 试图获取头像。如果还找不到,就将重定向至图像链接参数指定的默认头像。
Cravatar
是中国认可的头像(China Recognized Avatar)的缩写,又名「初认头像」,是一款免费的公共头像服务。它具有更快的响应速度,且服务完全架设并运行在中国大陆境内。对于国内用户来说,它是一个 Gravatar 完美的替代品。
Cravatar 使用了三级头像匹配:Cravatar 头像 ->Gravatar 头像 ->QQ 头像,大约 70% 的访客都能得到准确的头像。
Cravatar 会对所有头像进行人工审核(也包括来自 Gravatar 和 QQ 的头像),所有包含暴恐、色情、政治等违反中国法律的内容都会被屏蔽,并返回默认头像。这一点可以分担一些国内站长的审核压力。
| 头像服务 | 获取头像的基本格式 | 匹配级别 |
|---|---|---|
| Gravatar | https://gravatar.com/avatar/HASH | Gravatar |
| Libravatar | https://seccdn.libravatar.org/avatar/HASH | Libravatar Gravatar |
| Cravatar | https://cravatar.cn/avatar/HASH https://cn.cravatar.com/avatar/HASH | Cravatar Gravatar QQ 头像 |
支持的参数:s,size:图像大小 d,default:默认头像
除了使用 d 或 default 参数可以指定自己设置的默认头像外,还可以使用服务内置的默认头像:
| 参数 | 简介 |
|---|---|
没有指定 d 参数 | 如果图像链接没有指定默认头像,那么将返回这个图像。 |
404 | 如果没有与电子邮件哈希关联的图像,则不加载任何图像,而是返回 HTTP 404 响应 |
mp | 一个简单的卡通风格的人物轮廓。 Libravatar 中还可以使用 mm。 |
identicon | 一个几何图案(随机生成) |
monsterid | 具有不同颜色、面孔的“怪物”(随机生成) |
wavatar | 具有不同特征和背景的人脸(随机生成) |
retro | 8 位色的像素人脸(随机生成) |
robohash | 具有不同颜色、面部的机器人(随机生成) |
pagan | 复古冒险游戏的角色(随机生成) |
Waline 配置头像服务
通过服务端环境变量配置
服务端中环境变量 GRAVATAR_STR 指定了获取头像的地址。
| 环境变量名称 | Waline 默认值 | 备注 |
|---|---|---|
GRAVATAR_STR | https://seccdn.libravatar.org/avatar/{{mail|md5}} | Gravatar 头像的地址,基于 nunjucks 语法。 |
可以看到 Waline 默认使用 Libravatar 提供的公共头像服务。修改这个值可以切换服务,或增加 d 参数修改默认头像。
下面将演示修改默认头像的方法(假设你使用 Vercel 部署服务端)。
打开 Vercel 中的 Waline 项目,选择 setting->Environment Variables:
我们通过 d 参数指定默认头像为「8 位色的像素人脸(随机生成)」。
点击 Save 后,重新部署 Waline 项目即可。
通过修改 index.js 文件更灵活地配置头像
通过修改 Vercel 对应的 Github 仓库下的 index.js 文件(或者 index.cjs)可以更灵活指定评论者的头像。具体使用详看接下来由 Waline 官方提供的例子。
假设你使用的头像服务不支持通过数字 QQ 邮箱获取头像,那么你可以通过以下方式增加此功能。
首先打开 Vercel 对应 Waline 项目的 Github 仓库,修改 index.js 文件,将以下内容添加合适位置:
/*此方法或传入一个 comment 对象,你可以通过 comment.mail 获取邮箱。若返回值为 string 类型,则会直接调用返回值作为头像地址,否则正常生成 MD5。*/async avatarUrl(comment) { const reg = new RegExp('(\\d+)@qq\\.com$', 'i'); const mail = comment.mail; if (reg.test(mail)) { const q = mail.replace(/@qq\.com/i, '').toLowerCase(); return 'https://q1.qlogo.cn/headimg_dl?dst_uin=' + q + '&spec=4'; } },自定义随机头像
首先你要自己找你喜欢的头像作为头像库,然后,在文件夹的地址栏输入
$nr = 1; Get-ChildItem -File | Sort-Object { $_.BaseName -replace '\D+','' -as [int] } | ForEach-Object { Rename-Item $_.FullName -NewName ("$nr" + $_.Extension); $nr++ }把图片变成数字序号排列,然后访问https://bulkresizephotos.com/zh
把图片都上传上去
- 模式:选择“宽度”。
- 宽度:输入
128(头像金标准)。 - 格式:选择 WebP。
- 质量:设为
75。
点击开始,下载后的压缩包里就是你需要的“极轻量”头像库了。单张图应该只有 3-5KB,加载速度起飞。
部署
将图片推送到 GitHub
- 在 GitHub 上新建一个公开仓库(Public Repository),名字可以叫
arknights-avatar。 - 本地处理好
1.webp到48.webp,并将文件夹重命名为img,然后全部上传到该仓库的根目录。 - 确认路径:确保你在浏览器访问
https://github.com/你的用户名/arknights-avatar/blob/main/1.webp能看到图片。 - 在本地电脑新建一个文件夹(命名为api)。
- 在
api目录下新建文件index.js,填入以下代码:
export default function handler(req, res) { // 安全检查:拦截无 UA 的爬虫或恶意脚本 if (!req.headers['user-agent']) { return res.status(403).send('Please use a browser to access.'); }
// 获取参数与配置信息 const { id } = req.query; const total = 58; const username = "用户名"; const repo = "仓库名";
// 确定种子:优先使用邮箱 HASH,无 HASH 则回退到访客 IP let seed = id; if (!seed) { const forwarded = req.headers['x-forwarded-for']; seed = forwarded ? forwarded.split(',')[0] : (req.socket.remoteAddress || "guest"); }
// 时间变量:按月刷新哈希结果 const date = new Date(); const timeVar = `${date.getFullYear()}-${date.getMonth() + 1}`; const finalSeed = seed + timeVar;
// 核心算法:Java 风格的字符串哈希实现 let hash = 0; for (let i = 0; i < finalSeed.length; i++) { hash = ((hash << 5) - hash) + finalSeed.charCodeAt(i); hash |= 0; }
// 计算图片序号 const num = (Math.abs(hash) % total) + 1;
/** * 图片分发策略 * 1. 仓库已设为 Private,直接使用 Vercel 本地路径。 * Vercel 会自动从连接的私有仓库中读取 /img 文件夹。 */ const imageUrl = `/img/${num}.webp`;
/** * 【备选:jsDelivr 加速方案】 * 如果以后仓库改回 Public,可以重新启用下方链接并注释掉上面的 imageUrl: * const imageUrl = `https://fastly.jsdelivr.net/gh/${username}/${repo}@main/img/${num}.webp`; */
// 缓存控制:防止浏览器过度缓存重定向结果 res.setHeader('Cache-Control', 'no-cache, no-store, must-revalidate');
// 执行 302 重定向 return res.redirect(302, imageUrl);}-
将这个文件夹也上传到 GitHub
-
登录 Vercel,
-
登录 Vercel 官网,点击 “Add New” -> “Project”。
在导入 Git 仓库列表里,找到你刚才创建的
avatar仓库,点击 “Import”。Project Name 随便起(比如
avatar-api),其他选项默认。点击 “Deploy”。这时候它会部署成功
-
部署完成后,你会得到一个 Vercel 域名(比如
avatar-api.vercel.app)。
这个域名/api
访问这个链接,如果能加载出图片,说明搭建成功
Waline 的服务端(比如 Vercel 的 Environment Variables)修改 GRAVATAR_STR:
变量名: GRAVATAR_STR 变量值: https://你的API域名/api?id={{mail|md5}}
支持与分享
如果这篇文章对你有帮助,欢迎分享给更多人或赞助支持!
凛w的后花园