Twikoo 是一款轻量级的开源评论系统,支持 Markdown、表情包、图片上传、邮件通知等功能。本文基于 Twikoo 管理面板源码(TkAdminConfig.vue)及 i18n 国际化文件,整理了所有配置项的实际含义和用法。
一、Twikoo 简介
什么是 Twikoo
Twikoo 是一款轻量级开源评论系统,基于 Node.js 开发,支持 Markdown、代码高亮、表情包、图片上传(支持多种图床)、邮件/IM 通知等功能。
Twikoo vs 其他评论系统
| 特性 | Twikoo | Valine | Artalk |
|---|---|---|---|
| 数据库 | MongoDB | LeanCloud (免费版有限制) | MySQL/SQLite |
| 部署难度 | 简单 | 简单 | 较复杂 |
| 邮件通知 | 支持(配置 SMTP) | 支持(需 LeanCloud) | 支持 |
| 管理面板 | 有,功能完善 | 无 | 有 |
| 免费额度 | 腾讯云/Vercel 免费 | LeanCloud 国际版有限制 | 自建无限制 |
| 反垃圾 | Akismet / 腾讯云 | Akismet | 无内置 |
| 图床支持 | 多种图床 | 无 | 支持 |
Twikoo 的优势
- 部署灵活:支持 Vercel、腾讯云、Railway、Docker 等多种部署方式
- 配置丰富:7 大配置模块,覆盖评论系统的方方面面
- 界面美观:默认主题简洁,支持自定义背景
- 隐私友好:可选显示 UA、IP 属地等信息
- 迁移方便:支持从 Artalk、Disqus、Valine 导入评论
二、进入管理面板
普通入口
在博客页面任意位置快速点击三次,会弹出管理面板登录框。
隐藏入口
如果开启了「隐藏管理面板」(HIDE_ADMIN_CRYPT),常规点击不会触发登录框,需要访问:
https://你的Vercel地址/?twikoo=你的暗号登录方式
- 腾讯云环境:需要使用私钥文件登录(私钥在腾讯云云开发控制台 → 环境 → 权限设置中可获取)
- Vercel 环境:直接输入
TWIKOO_SECRET环境变量的值
忘记密码怎么办?
- 腾讯云:前往云开发控制台,删除 config 记录,重新设置。
- Vercel:前往 MongoDB Atlas,编辑 configs 集合,删除
ADMIN_PASS字段,然后去管理面板重新设置密码。
三、快速上手
方式一:使用公共版本(无需部署)
如果不想自己部署,可以直接使用公共的 Twikoo 服务:
// 在博客中引入 Twikoo<script src="https://cdn.jsdelivr.net/npm/twikoo@1.6.41/twikoo.all.min.js"></script>
// 初始化<div id="twikoo"></div><script> tk.init({ envId: 'https://twikoo.vercel.app', // 公共版本地址 el: '#twikoo', });</script>公共版本功能完整,但建议生产环境还是自己部署。
方式二:Vercel 部署(推荐)
- 申请 MongoDB Atlas,创建免费集群,获取连接字符串
- 在vercel中登陆账号后进行一键部署:
- 部署后,在 Vercel 的twikoo环境变量中添加
MONGODB_URI - 进入 Settings → Deployment Protection,设置 Vercel Authentication 为 Disabled(关键步骤,否则邮件无法发送)
- 选择Redeploy(重新部署)
- 访问正确的域名地址,确认显示「Twikoo 云函数运行正常」
方式三:腾讯云部署
适合国内访问,腾讯云有免费额度:
- 开通腾讯云开发 CloudBase
- 创建云函数环境
- 下载 Twikoo 源码,上传到云函数
- 配置环境变量
MONGODB_URI、TWIKOO_SECRET
四、管理面板配置项详解
管理面板共分为 7 个分类。以下所有配置项均在管理面板中填写(非环境变量)。
4.1 通用设置
| 配置项 | 说明 | 示例值 |
|---|---|---|
SITE_NAME | 网站名称 | 虹墨空间站 |
SITE_URL | 网站地址 | https://www.imaegoo.com |
CORS_ALLOW_ORIGIN | CORS 安全域名。格式:https://blog.example.com;多域名用 , 分隔。如不了解 CORS,请留空 | https://www.imaegoo.com |
BLOGGER_NICK | 博主的昵称 | iMaeGoo |
BLOGGER_EMAIL | 博主的邮箱地址,用于邮件通知、博主标识 | 12345@qq.com |
COMMENT_PAGE_SIZE | 评论列表分页大小 | 8 |
MASTER_TAG | 博主标识自定义文字,默认为”博主” | 站长 |
COMMENT_BG_IMG | 评论框自定义背景图片 URL 地址 | (可选) |
GRAVATAR_CDN | 自定义头像 CDN 地址 | sdn.geekzu.org |
DEFAULT_GRAVATAR | 默认的头像显示样式 | mp |
COMMENT_PLACEHOLDER | 评论框提示信息,可用 <br> 换行 | (可选) |
SHOW_ORDER | 评论排序下拉框 | true |
SHOW_DISLIKE | 评论点踩按钮 | true |
DISPLAYED_FIELDS | 界面上展示的输入框 | nick,mail,link |
REQUIRED_FIELDS | 评论必填信息。nick,mail,link=全必填,none=全选填 | nick,mail |
HIDE_ADMIN_CRYPT | 隐藏管理面板入口暗号。留空则不隐藏 | admin |
QQ_API_KEY | QQ 昵称 API 密钥,用于获取 QQ 昵称 | (参考下文链接) |
QQ_API_KEY获取地址:https://api.nsuuu.com/admin/key
4.2 插件设置
图床服务(IMAGE_SERVICE)
| 配置项值 | 图床名称 | 备注 |
|---|---|---|
| (留空) | 禁用图片上传 | |
qcloud | 腾讯云 | 腾讯云环境自带 |
7bu | 去不图床 | 无免费套餐 |
see | S.EE 图床 | 有免费套餐 |
lskypro | 兰空图床 | 需配合 IMAGE_CDN_URL |
piclist | PicList | 需配合 IMAGE_CDN_URL |
easyimage | EasyImage 2.0 | 需配合 IMAGE_CDN_URL |
chevereto | Chevereto | 需配合 IMAGE_CDN_URL |
s3 | S3/R2/MinIO | 需配置下方 S3 相关项 |
自定义图床配置(IMAGE_SERVICE 设为 lskypro / piclist / easyimage / s3 时需要填写)
| 配置项 | 说明 |
|---|---|
IMAGE_CDN_URL | 图床的 URL |
IMAGE_CDN_TOKEN | 图床 token(qcloud 图床无需设置) |
S3 对象存储配置(IMAGE_SERVICE 设为 s3 时显示)
| 配置项 | 说明 | 示例值 |
|---|---|---|
S3_REGION | S3 存储区域。使用兼容 S3 的服务(如 Cloudflare R2、MinIO)时可填任意值 | us-east-1 |
S3_BUCKET | S3 存储桶名称 | my-bucket |
S3_ACCESS_KEY_ID | Access Key ID | (必填) |
S3_SECRET_ACCESS_KEY | Secret Access Key | (必填) |
S3_ENDPOINT | S3 自定义 Endpoint,使用 Cloudflare R2、MinIO 等兼容 S3 的服务时填写 | https://xxx.r2.cloudflarestorage.com |
S3_CDN_URL | S3 图片访问域名(CDN 域名)。留空则使用默认 S3/Endpoint URL | (可选) |
S3_PATH_PREFIX | S3 图片存储路径前缀。留空则存储在根目录 | images/twikoo |
NSFW 图片鉴黄
| 配置项 | 说明 | 示例值 |
|---|---|---|
NSFW_API_URL | NSFW 图片检测 API 地址。免费服务:nsfw.xnet.ren、nsfw.qixz.cn | (可选) |
NSFW_THRESHOLD | NSFW 检测阈值(0-1),当检测分数高于此值时拒绝上传 | 0.5 |
其他插件配置
| 配置项 | 说明 | 默认值 |
|---|---|---|
SHOW_EMOTION | 启用插入表情功能 | true |
EMOTION_CDN | 表情 CDN,英文逗号分隔。默认为:https://owo.imaegoo.com/owo.json | (可选) |
SHOW_IMAGE | 启用插入图片功能 | true |
HIGHLIGHT | 启用代码高亮功能。如果主题和代码高亮有冲突,请设为 false | true |
HIGHLIGHT_THEME | 代码高亮主题。如主题有冲突,请设为 none | none |
HIGHLIGHT_PLUGIN | 代码高亮插件。设为 none 则不添加任何插件 | none |
LIGHTBOX | 使用简易图片点击放大效果 | false |
代码高亮主题可选值:
default、coy、dark、funky、okaidia、solarizedlight、tomorrow、twilight。访问 https://prmatchr.com 可预览主题效果。代码高亮插件可选值:
showLanguage(展示代码语言)、copyButton(展示代码拷贝按钮)。可同时设置多个。
4.3 隐私设置
| 配置项 | 说明 | 默认值 |
|---|---|---|
SHOW_UA | 是否显示用户系统和浏览器 | true |
SHOW_REGION | 是否显示用户 IP 属地到省(可能不准确,不支持 IPv6) | false |
4.4 反垃圾设置
| 配置项 | 说明 | 示例值 |
|---|---|---|
AKISMET_KEY | Akismet 反垃圾评论 API Key。设为 MANUAL_REVIEW 开启人工审核,留空不使用反垃圾 | 8651783edxxx |
QCLOUD_SECRET_ID | 腾讯云 SecretId(付费,内容安全)。同时设置腾讯云和 Akismet 时,只有腾讯云会生效 | (必填) |
QCLOUD_SECRET_KEY | 腾讯云 SecretKey | (必填) |
QCLOUD_CMS_BIZTYPE | 腾讯云内容安全 Biztype 名称,用于垃圾评论策略。可以自定义垃圾拦截规则 | (可选) |
LIMIT_PER_MINUTE | 单个 IP 发言频率限制(条/10分钟),0 为无限制 | 5 |
LIMIT_PER_MINUTE_ALL | 全站发言频率限制(条/10分钟),0 为无限制 | 5 |
LIMIT_LENGTH | 评论长度限制,0 为无限制 | 100 |
FORBIDDEN_WORDS | 违禁词配置,包含违禁词的内容会直接标记为垃圾评论。英文逗号分隔 | 快递,空包 |
BLOCKED_WORDS | 屏蔽词配置,包含屏蔽词的内容会直接评论失败。英文逗号分隔 | 快递,空包 |
NOTIFY_SPAM | 垃圾评论是否发送通知 | false |
Akismet 注册地址:https://akismet.com
人工审核设置:将
AKISMET_KEY设置为MANUAL_REVIEW即可开启人工审核模式。
4.5 验证码设置
| 配置项 | 说明 |
|---|---|
CAPTCHA_PROVIDER | 人机验证码提供商。可选:无、Cloudflare Turnstile、极验 Geetest |
Cloudflare Turnstile 配置
| 配置项 | 说明 | 示例值 |
|---|---|---|
TURNSTILE_SITE_KEY | Turnstile 验证码的站点密钥 | 0x4AAAAAAAPLTtpBr_xxx |
TURNSTILE_SECRET_KEY | Turnstile 验证码的密钥 | 0x4AAAAAAAPLTmBm6gxxx |
Turnstile 申请地址:https://dash.cloudflare.com/?to=/:account/turnstile
极验 Geetest 配置
| 配置项 | 说明 | 示例值 |
|---|---|---|
GEETEST_CAPTCHA_ID | 极验验证码的 Captcha ID | (必填) |
GEETEST_CAPTCHA_KEY | 极验验证码的 Captcha Key | (必填) |
极验 Geetest 申请地址:https://console.geetest.com/sensbot/management
4.6 即时通知设置(IM)
| 配置项 | 说明 |
|---|---|
PUSHOO_CHANNEL | 即时消息推送平台名称 |
PUSHOO_TOKEN | 即时消息推送 token |
SC_MAIL_NOTIFY | 是否同时通过 IM 和邮件 2 种方式通知博主。默认只通过 IM 通知 |
IM 通知渠道:
qmsg、serverchan、pushplus、pushplushxtrip、dingtalk、wecom、bark、gocqhttp、atri、pushdeer、igot、telegram、feishu等Pushoo 配置参考:https://pushoo.js.org
4.7 邮件通知设置
| 配置项 | 说明 | 示例值 |
|---|---|---|
SENDER_EMAIL | 邮件通知邮箱地址。必须和 SMTP_USER 保持一致 | blog@imaegoo.com |
SENDER_NAME | 邮件通知标题 | 虹墨空间站评论提醒 |
SMTP_SERVICE | 邮件通知邮箱服务商 | QQ |
SMTP_HOST | 自定义 SMTP 服务器地址。如已配置 SMTP_SERVICE,此项请留空 | (可选) |
SMTP_PORT | 自定义 SMTP 端口。如已配置 SMTP_SERVICE,此项请留空 | 465 |
SMTP_SECURE | 是否使用 TLS。请填写 true 或 false | true |
SMTP_USER | 邮件通知邮箱用户名 | blog@imaegoo.com |
SMTP_PASS | 邮件通知邮箱密码。QQ、163 邮箱请填写授权码 | (必填) |
MAIL_SUBJECT | 访客收到回复的邮件标题,留空则使用默认主题 | (可选) |
MAIL_SUBJECT_ADMIN | 博主收到新评论通知的邮件标题,留空则使用默认主题 | (可选) |
MAIL_TEMPLATE | 访客收到回复的邮件模板,留空则使用默认模板 | (可选) |
MAIL_TEMPLATE_ADMIN | 博主收到新评论通知的邮件模板,留空则使用默认模板 | (可选) |
支持的 SMTP 服务商:
126、163、1und1、AOL、DebugMail、DynectEmail、FastMail、GandiMail、Gmail、Godaddy、Hotmail、Maildev、Mailgun、Mailjet、Mandrill、Naver、Outlook365、Postmark、QQex、SES、SendCloud、SendGrid、SendPulse、SendinBlue、Sparkpost、Yahoo、Yandex、Zoho、iCloud、qiye.aliyun等邮件模板可用字段:
${SITE_URL}、${SITE_NAME}、${PARENT_NICK}、${PARENT_COMMENT}、${NICK}、${COMMENT}、${POST_URL}、${IMG}、${PARENT_IMG}Vercel 部署提示:如果邮件测试正常但实际收不到通知,请进入 Vercel 云函数管理 → Settings → Deployment Protection,将 Vercel Authentication 设置为 Disabled。
五、评论管理功能
在管理面板的「评论管理」页面,可以进行以下操作:
| 操作 | 说明 |
|---|---|
| 查看 | 查看评论详情 |
| 隐藏/显示 | 控制评论的可见性 |
| 删除 | 删除评论(确认后不可恢复) |
| 置顶/取消置顶 | 将评论置顶或取消置顶 |
| 搜索 | 可按昵称、邮箱、网址、IP、评论正文、文章地址搜索 |
搜索支持模糊匹配,可以搜索评论正文内容或文章地址路径。
六、数据导入导出
导出评论
在管理面板可以导出全部评论数据为 JSON 文件。
如果评论较多、导出失败或缺失数据,建议连接 MongoDB 数据库手动导出。
导入评论
支持从以下评论系统导入数据:
| 系统 | 导出格式 | 文件名 |
|---|---|---|
| Artalk | JSON | comments.data.json |
| Disqus | XML | [网站名称]-[导出时间]-all.xml |
| Valine | JSON | Comment.json |
导入前建议备份 comment 数据库。
迁移注意事项
- 迁移前建议备份现有数据
- 评论的
uid会重新生成,原有评论链接可能失效 - 评论的创建时间会保留,但审核状态会重置
- 如果迁移失败率高,建议手动连接 MongoDB 导出后转换格式
七、与博客主题集成
在 Twikoo 管理面板获取 envId
部署成功后,在 Twikoo 管理面板的「关于」页面可以查看环境 ID(envId),格式如:https://your-twikoo.vercel.app
Mizuki 主题配置
在 src/config.ts 中修改 commentConfig:
export const commentConfig: CommentConfig = { enable: true, twikoo: { envId: 'https://your-twikoo.vercel.app', // 你的 Twikoo 地址 lang: 'zh-CN', // 语言 },};静态页面引入
如果博客不使用主题支持,可以手动在页面中引入:
<!-- 引入 Twikoo --><script src="https://cdn.jsdelivr.net/npm/twikoo@1.6.41/twikoo.all.min.js"></script>
<!-- 评论区域 --><div id="twikoo"></div>
<!-- 初始化 --><script> tk.init({ envId: 'https://your-twikoo.vercel.app', el: '#twikoo', });</script>禁用单篇文章评论
在文章 frontmatter 中添加:
---comment: false---八、博主身份标识
当访客的邮箱与 BLOGGER_EMAIL 配置的邮箱一致时,评论会自动显示博主标识。
配置方法
在 Twikoo 管理面板设置 BLOGGER_EMAIL:
| 配置项 | 说明 |
|---|---|
BLOGGER_EMAIL | 博主的邮箱地址,用于博主标识 |
BLOGGER_NICK | 博主的昵称(可选) |
MASTER_TAG | 博主标识文字,默认为”博主” |
显示效果
配置后,访客使用与博主相同的邮箱评论时,会自动显示博主标识(如红色”博主”标签),便于读者识别官方回复。
九、表情包自定义
默认表情包
Twikoo 默认使用 OwO 表情包,托管在 https://owo.imaegoo.com/owo.json。
自定义表情 CDN
在管理面板配置 EMOTION_CDN:
| 配置项 | 说明 |
|---|---|
EMOTION_CDN | 表情 CDN 地址,多个用英文逗号分隔 |
自定义表情包格式
表情包需要是一个 JSON 文件,包含表情分类和对应的 URL:
{ "items": [ { "type": "image", "container": [ { "title": "表情名称", "icon": "https://example.com/emoji/normal.png", "src": "https://example.com/emoji/normal.png" } ] } ]}公开表情包列表
- OwO 官方:
https://owo.imaegoo.com/owo.json - Twikoo 原生:
https://cdn.jsdelivr.net/npm/twikoo@1.6.31/resource/owo.json
十、安全加固
1. 设置管理面板暗号
开启 HIDE_ADMIN_CRYPT 后,常规点击不会触发登录框,需要通过 ?twikoo=暗号 才能访问登录页面。
2. 配置 CORS 安全域名
设置 CORS_ALLOW_ORIGIN 为你的博客域名,防止其他网站调用你的评论接口:
https://your-blog.com多个域名用逗号分隔:
https://blog.com,https://www.blog.com3. 限制发言频率
| 配置项 | 说明 | 建议值 |
|---|---|---|
LIMIT_PER_MINUTE | 单 IP 发言频率 | 5-10 |
LIMIT_PER_MINUTE_ALL | 全站发言频率 | 20-50 |
LIMIT_LENGTH | 评论长度限制 | 500-1000 |
4. 配置反垃圾
- 免费方案:设置
AKISMET_KEY为MANUAL_REVIEW,开启人工审核 - 付费方案:配置腾讯云内容安全
QCLOUD_SECRET_ID/SECRET_KEY
5. 违禁词防护
| 配置项 | 效果 | 适用场景 |
|---|---|---|
FORBIDDEN_WORDS | 标记为垃圾评论,可恢复 | 广告、低质内容 |
BLOCKED_WORDS | 直接评论失败 | 敏感词、政治内容 |
6. 定期备份评论数据
在管理面板「导出」功能可以导出全部评论为 JSON,建议定期备份:
管理面板 → 评论管理 → 导出 → 导出评论十一、常见问题
Q: 如何修改/重置管理员密码?
- 腾讯云:前往云开发控制台,删除 config 记录,重新设置。
- Vercel:前往 MongoDB Atlas,编辑 configs 集合,删除
ADMIN_PASS字段,然后去管理面板重新设置密码。
Q: 忘记隐藏入口暗号怎么办?
在页面打开浏览器开发者工具(F12),Network 标签,刷新页面,搜索 HIDE_ADMIN_CRYPT,在返回结果中可找到暗号。
Q: 收不到邮件通知?
- 确认已设置
Vercel Authentication为 Disabled - 邮件配置有约 10 分钟缓存
- 博主自己评论不会收到通知,请注销后用其他邮箱测试
- 使用国外邮件服务商,避免被判定为垃圾邮件
Q: 评论失败或管理面板进不去?
打开浏览器 Console 查看错误:
| 错误 | 解决方法 |
|---|---|
ERR_BLOCKED_BY_CLIENT | 禁用去广告插件 |
ERR_CONNECTION_CLOSED | 检查网络能否访问 Vercel |
CORS policy | 确认 envId 以 https:// 开头 |
AUTH_INVALID_CUSTOM_LOGIN_TICKET | 删除数据库 config 重新配置私钥 |
Q: 如何开启人工审核?
将 AKISMET_KEY 设置为 MANUAL_REVIEW 即可开启人工审核模式。所有评论会被标记为待审核状态,需要在管理面板手动审核通过后才能显示。
Q: 违禁词和屏蔽词有什么区别?
- 违禁词(FORBIDDEN_WORDS):包含违禁词的内容会直接标记为垃圾评论(可在管理面板手动恢复)
- 屏蔽词(BLOCKED_WORDS):包含屏蔽词的内容会直接评论失败,用户无法提交
十二、官方资源
| 资源 | 链接 |
|---|---|
| 官方文档 | https://twikoo.js.org |
| GitHub | https://github.com/twikoojs/twikoo |
| QQ 交流群 | 1080829142 |
| 版本更新 | https://twikoo.js.org/update.html |
| Pushoo 说明 | https://pushoo.js.org |
部分信息可能已经过时









