效果:每天点一下,自动生成带 日期、农历、时间、位置、天气、温度、每日一言 的日记,并套好一套「记事 + 对账 + 新知 + 心情 + 明天」的六栏模板。 适用:Obsidian 桌面版(Windows / macOS / Linux 均可)。需要联网。
一、先装上两个插件
-
打开 Obsidian → 设置 → 第三方插件 → 关闭「安全模式」。
-
浏览 → 搜索并安装 Templater(作者 SilentVoid),装完启用。
核心「日记」插件是 Obsidian 自带的,不用装,待会直接配置。
二、建好目录结构
在你的库根目录,建下面两级文件夹(名字照抄,后面配置要对应):
你的库/ ├── 01-每日一志/ ← 日记成品都放这 ├── 06-Templater/ ← 模板仓库 │ └── Daily.md ← 日记模板(下一步创建) └── 07-Scripts/ ← 脚本文件夹 └── weather.js ← 天气脚本(下一步创建)
数字前缀是为了让目录按你的习惯排序,可改,但后面配置要跟着改。
三、配置核心「日记」插件
设置 → 日记(Daily notes),填三项:
| 设置项 | 填什么 |
|---|---|
| 新建文件位置 | 留空 |
| 日期格式 | 01-每日一志/YYYY/YYYY-MM/YYYY-MM-DD -ddd |
| 模板文件位置 | 06-Templater/Daily |
-
YYYY/YYYY-MM会自动建「年 / 月」两级子文件夹。 -
ddd是星期,文件名会变成2026-10-15 -周四这种。 -
这条插件只负责按命名建文件、把模板原文塞进去,真正的「填数据」是下一步 Templater 干的。
四、配置 Templater(最容易出错的一步)
设置 → Templater,逐项设置:
| 设置项 | 填什么 | 说明 |
|---|---|---|
| Template folder location | 06-Templater |
模板仓库 |
| User Scripts folder | 07-Scripts |
这个文件夹里的每个 .js 会变成 tp.user.文件名 函数 |
| Trigger Templater on new file creation | Folder templates | 新建文件时自动渲染模板 |
| Command timeout | 15(秒) | 脚本要请求 4 个接口,5 秒偏紧,调大 |
在 Folder Templates 区域点「Add new」,填:
-
folder:
01-每日一志 -
template:
06-Templater/Daily.md
⚠️ 坑:Templater 大版本升级后,「Trigger on new file creation」会被重置成
none。症状是新建日记后满屏模板代码(<% ... %>原样躺着)。以后升级完插件,先来这里看一眼开关还在不在。
五、放天气脚本 weather.js
打开 07-Scripts/weather.js,整文件替换为下面内容:
async function WeatherScript() {
// ⚠️ 把下面三个 key 换成你自己在对应平台申请的(见下方「申请三个 Key」)
const tencentKey = '你的腾讯位置服务KEY';
const gaodeKey = '你的高德开放平台KEY';
const juheKey = '你的聚合数据KEY';
// 1. IP 定位(腾讯位置服务)→ 拿到行政区划码 adcode
const ipResp = await fetch('https://apis.map.qq.com/ws/location/v1/ip?key=' + tencentKey);
const ipData = await ipResp.json();
const adcode = ipData.result.ad_info.adcode;
// 2. 天气查询(高德开放平台,extensions=all 取全天)
const weatherResp = await fetch('https://restapi.amap.com/v3/weather/weatherInfo?key=' + gaodeKey + '&city=' + adcode + '&extensions=all');
const weatherData = await weatherResp.json();
const cast = weatherData.forecasts[0].casts[0];
// 3. 农历查询(聚合数据万年历)
const now = new Date();
const dateStr = now.getFullYear() + '-' + (now.getMonth() + 1) + '-' + now.getDate();
const lunarResp = await fetch('https://v.juhe.cn/calendar/day?date=' + dateStr + '&key=' + juheKey);
const lunarData = await lunarResp.json();
const lunar = lunarData.result.data;
return {
位置: ipData.result.ad_info.province + '-' + ipData.result.ad_info.city + '-' + ipData.result.ad_info.district,
天气: '🌅' + cast.dayweather + ' / 🌃' + cast.nightweather,
温度: '🌅' + cast.daytemp_float + '℃ / 🌃' + cast.nighttemp_float + '℃',
农历: lunar.lunarYear + '年' + lunar.lunar
};
}
module.exports = WeatherScript;
脚本逻辑:① 腾讯 IP 定位拿 adcode → ② 用 adcode 查高德天气 → ③ 查聚合农历 → ④ return 一个带中文字段名的对象(位置 / 天气 / 温度 / 农历),模板照着取。
申请三个 Key(都免费,个人额度够用)
| 服务 | 申请地址 | 怎么建 key |
|---|---|---|
| 腾讯位置服务 | https://lbs.qq.com | 控制台 → 我的应用 → 创建应用 → 添加 key → 勾选 WebServiceAPI |
| 高德开放平台 | https://lbs.amap.com | 应用管理 → 创建应用 → 添加 key → 服务平台选 Web服务 |
| 聚合数据 | https://www.juhe.cn | 实名认证后 → 我的 API → 申请「万年历/日历」接口 → 拿到 key |
把拿到的三个 key 分别贴进 weather.js 对应的三个变量里,保存。
六、写日记模板 Daily.md
打开 06-Templater/Daily.md,整文件替换为:
<%* const w = await tp.user.weather(); %>🌻日期🌻 : <% tp.file.creation_date("YYYY-MM-DD dddd") %>
🧧农历🧧 : <% w.农历 %>
⌚️时间⌚️ : <% tp.file.creation_date("HH:mm:ss") %>
🌍位置🌍 : <% w.位置 %>
☁️天气☁️ : <% w.天气 %>
🌡️温度🌡️:<% w.温度 %>
***
<%*
let 一言 = ''
let 来源 = ''
let 作者 = ''
await fetch('https://v1.hitokoto.cn/?c=d&c=h&c=i&c=j&c=k&c=f&c=g')
.then(response => response.json())
.then(data => {
一言 = data.hitokoto
来源 = data.from
作者 = data.from_who === null ? '佚名' : data.from_who
})
-%>
>[!note] 一言
><font color="#ABCD00" size=4.8><% 一言 %> —— 《<% 来源 %>》 · <% 作者 %></font>
***
# 📋 一句话总结今天
*
***
# 📝 记事 · 一事一条,只记发生了什么
🌅 **早晨:**
🌤️ **上午:**
🌞 **中午:**
🌆 **下午:**
🌙 **晚上:**
***
# 🔁 今日对账 · 每天至少一行,不许空
* **今天哪件事想回看**:
* **我怎么处理的 / 现在看**:
* **下次第一步**(一个动作,别写"我要注意"):
***
# 💡 今日新知 · 积玉碎金
*
***
# 🌡️ 心情 · 感受与碎碎念
*
***
# ➡️ 明天
*
***
模板里两种标签:
-
<%* ... %>:只跑 JS,不往文件输出字(第一行先调脚本拿到w存着,后面复用)。 -
<% ... %>:把表达式结果写进文件。 -
tp.user.weather()就是运行07-Scripts/weather.js——函数名由文件名决定(weather.js →tp.user.weather),前面必须await等网络。 -
一言用的是 hitokoto 公开 API,无需 key。
七、测试
-
命令面板(Ctrl/Cmd + P)→ 搜「打开今日日记」→ 回车。
-
等 3~5 秒(脚本要串行请求几个接口,正常)。
-
看到日期、农历、位置、天气、温度、一言都填好了,模板六栏也在,就成功了。
如果某篇日记之前建坏了(满屏代码),打开它 → 命令面板 → Templater: Replace templates in the active file 补渲染即可。
八、日常怎么填这套模板
生成完直接写,重点是「对账」这栏——它不是逼你每天找错,是逼你每天停一下、挑一件事回看:
| 栏 | 记什么 | 能空吗 |
|---|---|---|
| 📋 一句话 | 今天一句话锚点,允许写「平常一天」 | 必填 |
| 📝 记事 | 只记事实,按五个时段分段 | 可空 |
| 🔁 今日对账 | 挑一件事:我怎么处理的 → 下次怎么改 | 不许空 |
| 💡 新知 | 今天听到/看到/读到的,出处用 —— 标 |
可空 |
| 🌡️ 心情 | 感受,只写不评判 | 可空 |
| ➡️ 明天 | 明天计划,用普通列表,不打勾 | 可空 |
对账栏的兜底:平淡日子真想不出要改的,就写「今天没什么要改的」——这是判断,不是感受,允许。这栏的身份证是「下次第一步」,而且得是从今天某件事长出来的改进,不是明天的待办(待办去「明天」栏写)。
九、常见问题排查
| 症状 | 原因 | 解决 |
|---|---|---|
新建日记全是 <% ... %> 模板代码 |
Templater 触发被关(升级重置) | 设置里把 Trigger on new file creation 开成 Folder templates;已建的用 Replace templates 命令补 |
报 Templater Error: Timeout |
超时太短 | Command timeout 调到 15 秒 |
| 农历/天气某项报错 | 对应 API key 过期或超额 | 把接口 URL(带 key)粘浏览器打开,看返回的 status / error_code 判断,去平台换 key |
| 位置不对 | IP 定位受代理/VPN/运营商影响 | 关代理重试,或接受偶尔漂移 |
| 一言没出现 | hitokoto 偶发抽风 | 重跑一次 Replace templates 命令 |




