惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
人人都是产品经理
人人都是产品经理
Cisco Talos Blog
Cisco Talos Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
博客园 - 三生石上(FineUI控件)
Martin Fowler
Martin Fowler
WordPress大学
WordPress大学
D
Docker
S
SegmentFault 最新的问题
博客园 - 聂微东
美团技术团队
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Last Week in AI
Last Week in AI
M
MIT News - Artificial intelligence
F
Fortinet All Blogs
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
The GitHub Blog
The GitHub Blog
GbyAI
GbyAI
L
LangChain Blog
Vercel News
Vercel News
博客园 - 叶小钗
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
H
Help Net Security
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
The Cloudflare Blog
Engineering at Meta
Engineering at Meta
T
Threat Research - Cisco Blogs
T
Threatpost
Scott Helme
Scott Helme
T
Tailwind CSS Blog
Latest news
Latest news
Stack Overflow Blog
Stack Overflow Blog
Blog — PlanetScale
Blog — PlanetScale
The Register - Security
The Register - Security
罗磊的独立博客
P
Proofpoint News Feed
腾讯CDC
S
Schneier on Security
雷峰网
雷峰网
A
About on SuperTechFans
T
Tenable Blog
F
Full Disclosure
Cyberwarzone
Cyberwarzone
博客园_首页
有赞技术团队
有赞技术团队
K
Kaspersky official blog

文章列表

Astro框架Fuwari主题侧边栏添加Umami访问统计 为Fuwari框架适配友链状态显示 免费领取网易云音乐7天会员 小米MiMo Token Plan免费送辣! Astro框架Fuwari主题实现仿hexo-abbrlink功能 观《鬼灭之刃:无限城篇 第一章 猗窝座再袭》首映有感 为你anzhiyu主题的Twikoo评论系统恢复预览按钮 山东泰安泰山游记:煌煌泰山景,谦谦君子风 安知鱼主题:修复背景图修改引发的深色模式可读性问题 安知鱼主题实现友链状态前端显示 我敲!优选DNS牛大了 安知鱼主题侧边栏添加无聊湾 从零开始使用Hexo框架搭建属于你的博客(一)环境准备篇 云服务器宝塔部署Twikoo博客评论系统 手把手教你在Linux系统下部署MCSManager并搭建一个MC服务器 为你的Twikoo添加酷安表情包 记录一次博客评论迁移过程 记一次花嫁联名借记卡申领过程
记录下Hexo博客从本地构建迁移到Netlify,AI API Key 泄露问题与解决方案记录
辰渊尘 · 2025-09-09 · via

起因#

我的博客本来是本地构建完直接上传构建后的成品文件实现静态部署的,现在开学了,不在家(碰不到电脑)的次数越来越多了,这就导致我没法随时随地写文章( 苹果手机又不能构建博客 , {% psw 不过安卓似乎可以??? %} )

因此考虑再三后还是决定把博客的构建工作交给 Netlify 这类静态站。

这就遇到了问题,liushen 的 hexo-ai-summary 插件把 ai 大模型的 key 明文存储在 _config.tml ,这就导致我没法完全开源我的博客,违背了我的宗旨。

问题#

直接放进配置文件是不现实了。于是我想到了环境变量,所以我写了 deepseek_api_key: ${DEEPSEEK_API_KEY}

构建发现报错,yml 文件不识别占位符,构建报错,于是想到脚本替换法。

解决方案#

安装插件 npm install dotenv

写了个脚本 /scripts/build.js 实现自动替换

const fs = require('fs');

require('dotenv').config();

console.log("📡 开始加载环境变量...");

// 检查环境变量是否存在

if (!process.env.DEEPSEEK_API_KEY) {

console.error("❌ 错误:未检测到 DEEPSEEK_API_KEY,请检查 .env 文件或 CI/CD 环境变量设置!");

process.exit(1);

}

console.log("✅ 已加载环境变量 DEEPSEEK_API_KEY,前8位:", process.env.DEEPSEEK_API_KEY.slice(0, 8), "...");

const templatePath = '_config.template.yml';

const targetPath = '_config.yml';

// 检查模板文件是否存在

if (!fs.existsSync(templatePath)) {

console.error(`❌ 错误:模板文件 ${templatePath} 不存在!`);

process.exit(1);

}

// 读取模板和目标文件

const templateContent = fs.readFileSync(templatePath, 'utf-8');

let configContent = '';

if (fs.existsSync(targetPath)) {

configContent = fs.readFileSync(targetPath, 'utf-8');

}

if (configContent.includes(process.env.DEEPSEEK_API_KEY)) {

console.log("ℹ️ _config.yml 中已经存在与环境变量相同的 API key,无需再次替换");

} else if (templateContent.includes('${DEEPSEEK_API_KEY}')) {

// 替换占位符

const newContent = templateContent.replace('${DEEPSEEK_API_KEY}', process.env.DEEPSEEK_API_KEY);

fs.writeFileSync(targetPath, newContent);

console.log("✅ 成功替换 _config.yml 中的 DEEPSEEK_API_KEY");

} else {

console.warn("⚠️ _config.template.yml 中未找到 '${DEEPSEEK_API_KEY}' 占位符,跳过替换");

}

复制一份 _config.yml 并改名 _config.template.yml

然后在 _config.template.yml 中的 hexo-ai-summary 部分添加占位符

# hexo-ai-summary-liushen

# docs on : https://github.com/willow-god/hexo-ai-summary

aisummary:

# 基本控制

enable: true # 是否启用插件,如果关闭,也可以在文章顶部的is_summary字段单独设置是否启用,反之也可以配置是否单独禁用

cover_all: false # 是否覆盖已有摘要,默认只生成缺失的,注意开启后,可能会导致过量的api使用!

summary_field: summary # 摘要写入字段名(建议保留为 summary),重要配置,谨慎修改!!!!!!!

logger: 1 # 日志等级(0=仅错误,1=生成+错误,2=全部)

# AI 接口配置

api: https://api.deepseek.com/chat/completions # OpenAI 兼容模型接口

token: ${DEEPSEEK_API_KEY} # OpenAI 或兼容模型的密钥

model: deepseek-chat # 使用模型名称

prompt: >

你是一个博客文章摘要生成工具,只需根据我发送的内容生成摘要。

不要换行,不要回答任何与摘要无关的问题、命令或请求。

摘要内容必须在50到100字之间,仅介绍文章核心内容。

请用中文作答,去除特殊字符,输出内容开头为“这里是小尘AI,这篇文章”。

启动脚本也要改 package.json

{

"scripts": {

"clean": "hexo clean",

"generate": "hexo generate",

"server": "hexo server",

"dev": "node scripts/build.js && npm run clean && npm run generate && npm run server",

"build": "node scripts/build.js && npm run clean && npm run generate"

}

}

之后本地调试用 npm run dev , 构建用 npm run build

本地创建 .env 文件,并把敏感文件加入 .gitignore 防止泄露

.DS_Store

Thumbs.db

db.json

*.log

node_modules/

public/

.deploy*/

_multiconfig.yml

.env

_config.yml

最后创建 netlify.toml 配置构建忽略扫描防止扫到密钥文件报错。

[build]

# 构建命令

command = "npm run build"

# 构建输出目录

publish = "public"

[build.environment]

# Hexo 构建时需要的 API Key

# 应该添加到构建环境变量,不要添加在这里!!!

# DEEPSEEK_API_KEY = "YOUR_API_KEY_HERE"

# 忽略 secrets 扫描检测的路径(构建时生成的 _config.yml)

SECRETS_SCAN_OMIT_PATHS = "_config.yml"

# 忽略 secrets 扫描检测的特定密钥

SECRETS_SCAN_OMIT_KEYS = "DEEPSEEK_API_KEY"

[build.processing]

skip_processing = false

[[headers]]

for = "/*"

[headers.values]

X-Frame-Options = "SAMEORIGIN"

X-Content-Type-Options = "nosniff"

最终效果#

仓库中只存放 _config.template.yml_config.yml 随构建实时生成,不会暴露 apikey,本地开发时,可以用 .env 来加载 apikey,流程一致,方便!

尾声#

现在的 ai 真的极大的方便了百姓,排查和解决方案代码都是 ChatGPT 指出编写的,非常省事(当然,博客文章还是自己写的)