easter-egg · 彩蛋工坊插件
本插件为安知鱼内容管理平台提供丰富的彩蛋与互动功能,包括全站特效、键盘序列、日期触发、随机触发和隐藏页密码门等,内置90个预设,包括21款小游戏。插件由白夜维护,提供管理控制台和内置HTTP服务。彩蛋由插件下发的脚本渲染,内容为自包含的CSS/JS/HTML,支持多种触发方式,如日期窗、随机概率、键盘序列等。插件具有资源分层、管理员鉴权、公开接口按IP限流等安全特性。插件支持多种彩蛋类型,包括节日节庆、天气自然、氛围交互等,并提供管理控制台进行预设库管理、彩蛋增删改查、启停、触发统计和榜单审核等功能。此外,插件还提供详细的配置参数和快速开始指南,以帮助用户快速接入和使用。
本插件为安知鱼(Anheyu)内容管理平台提供彩蛋与互动能力:全站特效、键盘序列、日期触发、随机触发、隐藏页密码门,内置 90 个预设(含 21 款小游戏)。
维护者:白夜
插件类型:
eventhook(占位)+ 自带 HTTP 服务
1. 概述
彩蛋由插件下发给浏览器的脚本在运行时渲染,内容为自包含的 CSS/JS/HTML。插件负责存储彩蛋定义、按时间与优先级筛出当前生效项、下发引导脚本,并提供管理控制台。
插件 HTTP 服务默认监听
9803。管理控制台由插件自带的
console.js渲染,前台效果由一行bootstrap.js引导标签挂载。版本
2.2.3,types为["eventhook"],min_app_version为1.0.0。
2. 功能特性
分类 | 能力 |
|---|---|
彩蛋类型 |
|
内置预设 | 90 个,六类:节日节庆 20 / 天气自然 10 / 氛围交互 16 / 随机彩蛋 14 / 小游戏 21 / 隐藏页 9 |
小游戏 | 21 款,共用外壳:标题与分数栏、最高分持久化、 |
体验配置 |
|
调度 | 日期窗(支持跨年)+ 星期限制 + 优先级降序 + |
排行榜 | 用户名认领、昵称展示、一次性触发票据、得分上限与用时下限校验、可选先审后展示 |
管理控制台 | 预设库按分类分组并支持搜索、彩蛋增删改查、启停、触发统计、榜单审核 |
资源分层 | 固定名加载器( |
安全 | 管理员鉴权、公开接口按 IP 限流、隐藏页密钥与 HTML 不下发 |
3. 彩蛋类型与触发
| 触发条件 | 渲染方式 |
|---|---|---|
| 常驻, | 注入 |
| 当前 | 同上 |
| 每次页面加载按 | 同上 |
| 监听 | 命中后执行 |
|
| 全屏密码门覆盖层;提交 |
content.js 中创建的根元素需带 data-egg="<彩蛋ID>",引导脚本据此管理关闭与回收。同一份模板被复制成多枚彩蛋时,执行期间 window.__EGG_CURRENT__ 为当前彩蛋 ID。
4. 调度规则
规则 | 说明 |
|---|---|
启用 |
|
日期窗 | 当前 |
星期 |
|
排序 | 先按 |
上限 | 按 |
konami 与 random 类型只要通过时间窗即视为候选生效,下发给前端后由前端按序列或概率实际触发。
5. 环境要求
Anheyu(社区版或 PRO)开启插件系统。
插件端口对浏览器可达:经反向代理挂在站点子路径(如
/egg/),或使用独立子域。管理控制台需与站点同源,才能读到登录态。
6. 安装
后台进入「插件管理」。
上传安装包
easter-egg.zip(内含plugin.json与各平台二进制)。安装成功后状态变为「运行中」。升级同 ID 插件会保留既有配置与禁用状态。
安装包内
plugin.json必须位于压缩包根目录。
7. 快速开始
配置
egg_entry(可选):填插件对浏览器可达的公网入口,如https://你的域名/egg/。反代到插件端口:
location /egg/ { proxy_pass http://127.0.0.1:9803; }。把引导标签放进「设置 → 页面样式 → 底部 HTML」(见 §11.1)。
打开管理控制台,从预设库按分类添加彩蛋(见 §11.2)。
8. 配置参数参考
以下参数在 plugin.json 的 config_schema 中声明,由后台保存后以环境变量注入插件进程。
参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| number |
| 插件 HTTP 服务端口。仅内网可达,禁止公网暴露。 |
| string |
| 用于管理员校验的后端基地址。 |
| string |
| 一个"仅管理员可访问"的后端接口路径,返回 200 视为放行。 |
| string | 空 | 站点根地址,用于彩蛋文案中的链接拼接。 |
| string | 空 | 彩蛋定义与触发统计的落盘目录。留空则用插件安装目录之外、与 |
| string |
| 逗号分隔的预设 ID。列出的预设会在首次启动时写入数据目录,不覆盖同名彩蛋。全部 90 个可用 ID 见 §10,也可在控制台预设库按分类添加。 |
| number |
| 同一时刻最多下发的生效彩蛋数(按优先级降序截断), |
| number |
| 每来源 IP 每分钟允许的生效列表查询、触发上报与解锁次数, |
| number |
| 管理员"通过"结果缓存秒数, |
| string | 空 | 插件对浏览器可达的公网入口,如 |
| boolean |
| 是否在插件 HTTP 服务根路径托管独立控制台页。关闭后 |
| string | 空 | 监听地址。空 = 所有网卡;同机部署可填 |
9. 使用指南
9.1 添加彩蛋
在控制台「预设库」按分类点「+ 添加」,或「新建」手工填写。
字段 | 说明 |
|---|---|
| 显示名称 |
| 五选一,见 §3 |
| 按类型填 |
| 特效为 |
| 越大越优先,受 |
| 是否启用 |
预设物化与「从预设添加」都会写入 tpl_version;与当前模板版本不一致时控制台在该行显示「更新」,点击才覆盖旧内容。
9.2 体验设置
字段 | 取值 | 行为 |
|---|---|---|
|
| 触发后右下角出现「关闭彩蛋」胶囊,点击移除 |
|
| 触发前先弹确认卡:立即激活 / 暂不激活 / 不再触发 |
| 其他 | 不提供关闭入口 |
|
| 无日期窗彩蛋的抑制时长(小时), |
|
| 触发瞬间全屏礼花 + 顶部提示条,约 3.5 秒自毁; |
| 对象或空 | 开启排行榜,见 §9.3 |
保存时归一化:dismiss 只认 close 与 ask;cooldown_hours 夹到 0–8760;board.metric 非法回落 both;负的 max_score、min_duration_ms 归零。
9.3 排行榜
board 字段:metric 取 score 按得分降序 / time 按用时升序 / both 得分降序、同分比用时;max_score 为得分上限,min_duration_ms 为用时下限(毫秒),0 表示不限;review 为 true 时成绩先审后展示。
身份模型:用户名(3–20 位英文,每榜唯一,永不公开)+ 昵称(榜单展示)。首次提交即注册,服务端返回一次性认领密钥(仅存 sha256,明文只此一次);再次提交须带密钥。
密钥丢失时,用原用户名 + 原昵称不带密钥提交即视为找回,服务端换发新密钥,被替换的旧成绩归档进 board-history.json;昵称与记录不符则拒绝。
防作弊:服务端按 max_score、min_duration_ms 校验;成绩提交须带 POST /api/public/trigger 换发的一次性票据(30 分钟有效,校验失败不烧票,仅落库成功才核销);榜单每 IP 每分钟限 10 次。
游戏结算时调用 window.EGG_BOARD(eggId, {score, durationMs}):已认领则静默提交,否则弹注册表单。票据失效时前端自动换票重试一次。相关接口见 §12。
9.4 隐藏页
type 为 hidden-page 时,trigger.route 匹配当前路径即渲染全屏密码门。密码以 sha256(password) 十六进制存于 content.password_hash,空值表示无密码门。
GET /api/public/active-eggs 对隐藏页只下发 title 与 has_password 布尔,不含 password_hash 与 html;html 仅在 POST /api/public/unlock 校验通过后返回。
隐藏页需要配合框架「页面管理」建同名路由的自定义页面。
10. 内置预设
10.1 分类总览
分类 | 数量 | 触发方式 |
|---|---|---|
节日节庆 | 20 | 日期窗 |
天气自然 | 10 | 常驻 |
氛围交互 | 16 | 常驻 |
随机彩蛋 | 14 | 概率 / 常驻 |
小游戏 | 21 | 键盘序列 |
隐藏页 | 9 | 路由 + 密码门 |
合计 | 90 | — |
各类预设的 ID 与名称见下面各表;键盘序列与隐藏页入口汇总在第 17 章。
10.2 节日节庆(20)
ID | 名称 | 日期窗 |
|---|---|---|
| 圣诞 · 雪花飘落 |
|
| 跨年 · 倒计时 |
|
| 元宵 · 孔明灯 |
|
| 中秋 · 玉兔明月 |
|
| 端午 · 龙舟竞渡 |
|
| 万圣节 · 南瓜与蝙蝠 |
|
| 情人节 · 心动气球 |
|
| 七夕 · 星河鹊桥 |
|
| 国庆 · 红旗礼花 |
|
| 复活节 · 彩蛋寻宝 |
|
| 儿童节 · 纸飞机 |
|
| 愚人节 · 镜像世界 |
|
| 春节 · 爆竹与福字 |
|
| 冬至 · 饺子 |
|
| 清明 · 细雨柳枝 |
|
| 教师节 · 黑板 |
|
| 妇女节 · 花束 |
|
| 双十一 · 购物车 |
|
| 感恩节 · 火鸡 |
|
| 夏至 · 蝉鸣光斑 |
|
10.3 天气自然(10)
ID | 名称 |
|---|---|
| 樱花 · 落樱缤纷 |
| 秋日 · 枫叶纷飞 |
| 夜空 · 流星雨 |
| 天气 · 细雨绵绵 |
| 天气 · 雷雨夜 |
| 极夜 · 极光 |
| 夏夜 · 萤火虫 |
| 春日 · 蒲公英 |
| 海底 · 气泡 |
| 午后 · 光束尘埃 |
10.4 氛围交互(16)
ID | 名称 |
|---|---|
| 交互 · 星尘光标 |
| 交互 · 点击涟漪 |
| 阅读 · 聚光灯 |
| 极客 · 数字雨 |
| 故障 · 信号干扰 |
| 派对 · 迪斯科 |
| 怀旧 · DVD 弹跳 |
| 彩蛋 · 猫咪散步 |
| 打字机标题 |
| 阅读 · 顶部进度条 |
| 导航 · 浮动面包屑 |
| 氛围 · 边缘光晕 |
| 文字 · 波浪标题 |
| 文字 · 霓虹描边 |
| 复古 · CRT 显示器 |
| 音效 · 打字声 |
typewriter 归在氛围交互,类型为 random,概率 0.1%。
10.5 随机彩蛋(14)
ID | 名称 | 概率 |
|---|---|---|
| 随机 · 一句话 |
|
| 整蛊 · 快乐字体 |
|
| 整蛊 · 天旋地转 |
|
| 惊喜 · 贴纸雨 |
|
| 彩蛋 · 小黄鸭巡游 |
|
| 彩蛋 · 控制台留言 | 常驻 |
| 回忆 · 拍立得 |
|
| 整蛊 · 抬杠按钮 |
|
| 彩蛋 · 橡皮鸭 | 常驻 |
| 游戏 · 彩蛋猎人 |
|
| 彩蛋 · 读到底了 | 常驻 |
| 视觉 · 灰度模式 |
|
| 视觉 · 像素化 |
|
| 实用 · 本地天气 | 常驻 |
10.6 小游戏(21)
全部由键盘序列触发,按键表见第 17 章。榜单口径 score 按得分降序、time 按用时升序、both 为得分优先同分比用时。
ID | 游戏 | 触发 | 榜单 |
|---|---|---|---|
| 霓虹贪吃蛇 | 键盘序列 |
|
| 2048 | 键盘序列 |
|
| 记忆翻牌 | 键盘序列 |
|
| 反应速度 | 键盘序列 |
|
| 打地鼠 | 键盘序列 |
|
| 记忆灯序列 | 键盘序列 |
|
| 井字棋 | 键盘序列 |
|
| 数字华容道 | 键盘序列 |
|
| 猜数字 | 键盘序列 |
|
| 打字速度 | 键盘序列 |
|
| 瞄准训练 | 键盘序列 |
|
| 打砖块 | 键盘序列 |
|
| 乒乓 | 键盘序列 |
|
| 像素小鸟 | 键盘序列 |
|
| 俄罗斯方块 | 键盘序列 |
|
| 4x4 数独 | 键盘序列 |
|
| 8x8 扫雷 | 键盘序列 |
|
| 颜色辨识 | 键盘序列 |
|
| 30 秒心算 | 键盘序列 |
|
| 接水果 | 键盘序列 |
|
| 弹球掉槽 | 键盘序列 |
|
10.7 隐藏页(9)
路由列表见第 17 章。启用前需在框架「页面管理」中建同名路由页面,插件负责密码门与解锁后的内容。
ID | 名称 |
|---|---|
| 隐藏页 · 一封旧信 |
| 隐藏页 · 生日惊喜 |
| 隐藏页 · 藏宝图 |
| 隐藏页 · 演职员表 |
| 隐藏页 · 时光胶囊 |
| 隐藏页 · 代码雨房间 |
| 隐藏页 · 阅读清单 |
| 隐藏页 · 彩蛋地图 |
| 隐藏页 · 别处 |
11. 前端接入
11.1 引导标签
把下面一行粘到后台「设置 → 页面样式 → 底部 HTML」,该字段按 HTML 渲染:
HTML
<script src="https://你的入口/api/bootstrap.js"></script>
项 | 说明 |
|---|---|
| 固定名加载器, |
| 实现体,内容指纹命名, |
接口基址 |
|
「自定义 JavaScript」字段按 JS 源码执行,不能粘 <script> 标签。
11.2 管理控制台
方式一:后台「页面管理」新建页面,在「自定义 JS」里粘贴:
JS
(function () {
if (window.__EGG_CONSOLE_INJECTED__) return;
window.__EGG_CONSOLE_INJECTED__ = true;
var host = document.querySelector("article") || document.body;
host.style.minHeight = "0";
var hd = host.previousElementSibling;
if (hd && hd.tagName === "HEADER") hd.style.display = "none";
var s = document.createElement("script");
s.id = "egg-console-entry";
s.src = "https://你的入口/api/console.js";
host.appendChild(s);
})();
方式二:serve_ui 为 true(默认)时,直接访问插件入口根路径,如 https://你的域名/egg/,得到独立控制台页。
项 | 说明 |
|---|---|
作用域 | 样式挂在 |
接口基址 | 注入值 → 入口脚本 |
登录态 | 读取 |
同源 | 控制台页须与站点同源;异构源时先设 |
控制台功能:预设库(按分类分组 + 关键词搜索)、彩蛋增删改查、启停、按键序列录制、体验设置、触发统计、榜单审核。
12. HTTP API 参考
统一响应封装,业务成功以 code=200 判定:
JSON
{ "code": 200, "message": "ok", "data": { } }
方法 | 路径 | 鉴权 | 说明 |
|---|---|---|---|
GET |
| 否 | 健康检查,返回状态与 |
POST |
| 否 | 登录代理,透传后端 |
GET |
| 否 | 引导器加载器 |
GET |
| 否 | 引导器实现体 |
GET |
| 否 | 返回引导标签的绝对地址与代码片段 |
GET |
| 否 | 当前生效彩蛋列表,隐藏页已脱敏 |
POST |
| 否 | 上报触发,返回一次性票据 |
POST |
| 否 | 隐藏页密码校验 |
GET / POST |
| 否 | 榜单查询 / 成绩提交 |
GET / POST |
| 是 | 全部彩蛋(含未启用)/ 新增 |
GET / PUT / DELETE |
| 是 | 读取 / 更新 / 删除 |
POST |
| 是 | 启停,body |
GET |
| 是 | 榜单与历史成绩 |
POST |
| 是 | 审核通过 |
DELETE |
| 是 | 删除成绩 |
GET |
| 是 | 触发统计 |
GET |
| 是 | 预设完整模板数组(含 |
GET |
| 是 | 预设分组视图,含分类与数量 |
GET /api/presets/catalog 响应:
JSON
{
"total": 90,
"tpl_version": "2.1.0",
"categories": [{ "key": "festival", "label": "节日节庆", "count": 20 }],
"presets": [{ "id": "christmas-snow", "name": "圣诞 · 雪花飘落", "type": "date-trigger", "category": "festival", "has_board": false }]
}
13. 安全说明
管理接口走管理员鉴权:插件把请求的
Authorization透传到admin_check_path,HTTP 200 且响应体code为 200 才放行,401提示重新登录,其余返回403。公开接口按来源 IP 限流,响应带
Access-Control-Allow-Origin: *,只返回轻量与上报类载荷。隐藏页的
password_hash与html不下发到公开列表,html需密码校验通过才返回。content.js由引导脚本以new Function执行,属管理员可信内容,与站点「自定义 JavaScript」同级。本插件无对外部可控 URL 的出站请求。
14. 故障排查
现象 | 可能原因 | 处理 |
|---|---|---|
彩蛋不出现 | 未启用;日期窗未命中; | 检查彩蛋的 |
键盘序列没反应 | 焦点在输入框内(不响应);序列输入错误 | 点页面空白处再输入;对照 §10.6 的序列逐字符核对 |
隐藏页打不开 | 未建同路由的自定义页面;彩蛋不在生效列表 | 在「页面管理」建同名路由页面;确认 |
出现 | 把 | 该字段只接受 JS 源码;标签请放「底部 HTML」 |
榜单提交失败 | 票据过期(30 分钟);超过得分上限或低于用时下限; | 刷新页面重新触发换票;核对 |
控制台打不开 |
| 打开 |
15. 常见问题
Q:一个页面能同时生效几个彩蛋? A:受 max_active 限制,默认 3 个,按优先级降序截断。
Q:日期窗为什么会提前或延后一天生效? A:日期按 UTC 判定,与本地时区存在时差,跨时区时以 UTC 日期为准。
Q:同一款预设能加多次吗? A:能。预设库可重复添加,彩蛋 ID 会自动去重。
Q:改了预设内容,会覆盖我编辑过的彩蛋吗? A:物化时不覆盖同名彩蛋。模板版本变更后,控制台会在该行显示「更新」,需手动点击才覆盖。
Q:隐藏页的密码能找回吗? A:不能。密码以 sha256 存储,忘记后在控制台重新设置口令即可。
Q:关掉 serve_ui 后,前台效果会失效吗? A:不会。serve_ui 只控制插件根路径的独立控制台页,/api/bootstrap.js 与 /api/console.js 始终可取。
16. 限制与已知事项
日期窗按 UTC 判定,不跟随访客本地时区。
同一时刻下发的彩蛋数量受
max_active限制,超出的不会渲染。prefers-reduced-motion下部分动效降级:雪花只画一帧静态雪景,礼花降级为仅提示条。隐藏页需配合框架「页面管理」建同名路由的自定义页面,插件只提供密码门与内容。
排行榜的密钥找回以「原用户名 + 原昵称」为凭证,安全性低于密钥。
无限循环的
content.js不做卸载,彩蛋随页面存活。
17. 附录:触发速查
以下为站长自测用。序列取自各 gameSpec.Code,逗号分隔,按字符逐个输入,不区分大小写。
ID | 触发序列 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
隐藏页入口:
ID | 路由 | 预置口令 |
|---|---|---|
|
| 无 |
|
| 无 |
|
|
|
|
| 无 |
|
| 无 |
|
| 无 |
|
| 无 |
|
| 无 |
|
| 无 |
1234是预置示例口令。正式启用hidden-treasure前,请在管理控制台改成自己的口令。