如何使用Obsidian软件?
作者:卡卷网发布时间:2024-12-25 01:17浏览数量:97次评论数量:0次
Obsidian 日记自动记录当前位置、天气和农历信息
如果您正在使用 Obsidian 来管理您的笔记和日记,那么您可能会想要一种自动化的方法来记录每日的基础信息,例如星期几、当前位置、天气和农历日期。本文将向您介绍如何利用 Obsidian 的 Templater 插件配合 JavaScript 脚本,实现每日基础情况的自动记录。
前言
Templater 插件允许用户使用模板和脚本来自动生成笔记内容。通过配合 JavaScript 脚本,您可以让 Obsidian 自动为您的日记模板填充诸如当前天气、位置和农历日期等信息。
安装和配置 Templater 插件
在插件的设置中,指定您的模板文件夹位置,例如 /Template,并指定 JS 脚本存放路径,例如 /Archive/Scripts
获取 API 密钥
为了获取实时的天气、位置和农历日期信息,我们需要使用相关的 API 服务。
- 高德地图 API(用于获取位置和天气):
访问 高德开放平台,注册并登录您的账户。 创建一个新的应用,申请 Web 服务 类型的 Key。 获取到 高德地图 API Key,请妥善保存。
- 聚合数据 API(用于获取农历日期):
访问 聚合数据,注册并登录您的账户。 在 数据 API 中,搜索并申请 万年历 API。 获取到 聚合数据 API Key,请妥善保存。
编写 JavaScript 脚本
在您的 Obsidian 库中,创建一个用于存放脚本的文件夹,例如/Archive/Scripts
- 创建 getDiaryMeta.js 脚本
在 /Archive/Scripts 文件夹中,创建一个名为 getDiaryMeta.js 的文件,并将以下代码粘贴进去
// getDiaryMeta.js
/**
* 获取日记元数据,包括位置、天气和农历日期
* 需要配置高德地图 API 和聚合数据 API 的密钥
*/
module.exports = async (tp, config = {}) => {
// 高德地图 API 配置
const gaodeApiKey = "YOUR_AMAP_API_KEY"; // 替换为您的高德地图 API 密钥
// 聚合数据 API 配置(用于农历日期)
const juheApiKey = "YOUR_JUHE_API_KEY"; // 替换为您的聚合数据 API 密钥
// 从配置中解构可能的值
let { location: inputLocation = "", adcode: inputAdcode = "", weather: inputWeather = "" } = config;
// 初始化元数据变量
let location = inputLocation;
let adcode = inputAdcode;
let weather = inputWeather;
let lunarDate = "无法获取农历日期";
// 获取 IP 地址地理位置,除非已经有 location 值
if (!location) {
try {
const geoURL = `https://restapi.amap.com/v3/ip?key=${gaodeApiKey}&output=json`;
const geoResponse = await fetch(geoURL);
const geoData = await geoResponse.json();
console.log("Geolocation API Response:", geoData); // 调试日志
if (geoData.status === "1") {
location = `${geoData.province}${geoData.city}`; // 输出结果为:浙江省温州市
adcode = geoData.adcode; // 使用 adcode 替代 citycode
} else {
location = "无法获取位置";
console.log(`位置获取失败:${geoData.info}`);
}
} catch (error) {
console.error("位置获取失败:", error);
location = "无法获取位置";
}
} else {
console.log("已提供位置,跳过IP地理位置获取。");
}
// 如果 adcode 没有值,但有 location,则通过地理编码 API 获取 adcode
if (!adcode && location && location !== "无法获取位置") {
try {
const geocodeURL = `https://restapi.amap.com/v3/geocode/geo?key=${gaodeApiKey}&address=${encodeURIComponent(location)}`;
const geocodeResponse = await fetch(geocodeURL);
const geocodeData = await geocodeResponse.json();
console.log("Geocode API Response:", geocodeData); // 调试日志
if (geocodeData.status === "1" && geocodeData.geocodes && geocodeData.geocodes.length > 0) {
adcode = geocodeData.geocodes[0].adcode;
console.log(`通过 location 获取到的 adcode: ${adcode}`);
} else {
console.log(`通过 location 获取 adcode 失败:${geocodeData.info}`);
}
} catch (error) {
console.error("通过 location 获取 adcode 失败:", error);
}
}
// 获取天气情况(使用 高德地图天气 API),除非已经有 weather 值
if (adcode) {
if (!weather) { // 仅当 weather 为空时才获取天气
try {
const weatherURL = `https://restapi.amap.com/v3/weather/weatherInfo?key=${gaodeApiKey}&city=${adcode}&extensions=all&output=json`;
const weatherResponse = await fetch(weatherURL);
const weatherData = await weatherResponse.json();
console.log("Weather API Response:", weatherData); // 调试日志
if (weatherData.status === "1" && weatherData.forecasts && weatherData.forecasts.length > 0) {
const forecast = weatherData.forecasts[0];
const { dayweather, nightweather, daytemp, nighttemp } = forecast.casts[0];
weather = `${dayweather}/${nightweather}, ${nighttemp}~${daytemp}℃`;
} else {
weather = "无法获取天气信息";
console.log(`天气获取失败:${weatherData.info}`);
}
} catch (error) {
console.error("天气获取失败:", error);
weather = "获取失败";
}
} else {
console.log("已提供天气信息,跳过天气API调用。");
}
} else {
console.log("未提供 adcode,跳过天气获取。");
}
// 获取农历日期(使用聚合数据 API)
try {
let apiDate = tp.date.now("YYYY-MM-DD");
const lunarURL = `http://v.juhe.cn/calendar/day?date=${apiDate}&key=${juheApiKey}`;
const res = await request({
url: lunarURL,
method: "GET",
});
let JsonData = JSON.parse(res);
let lunarData = JsonData.result; // 根据API文档调整层级
console.log("Lunar API Response:", lunarData); // 调试日志
if (JsonData.error_code === 0 && lunarData) {
lunarDate = lunarData.data.lunar || "无法获取农历日期"; // 根据API文档调整字段
} else {
lunarDate = "获取失败";
console.log(`农历日期获取失败:${lunarData.reason || '未知原因'}`);
}
} catch (error) {
console.error("农历日期获取失败:", error);
lunarDate = "获取失败";
}
return {
location,
weather,
lunarDate
};
};
注意:
- 将
YOUR_AMAP_API_KEY
替换为您的 高德地图 API Key。 - 将
YOUR_JUHE_API_KEY
替换为您的 聚合数据 API Key。
Templater 模板
在您的模板文件夹(例如 /Templates)中,创建一个新的模板文件,例如 Daily Note.md,并添加以下内容:
<%*
const config = {
location: "", // 当前指定地理位置,会根据该位置获取对应天气。不指定则根据当前IP地址自动获取地址位置和天气信息。
adcode: "", // 若指定adcode,优先根据adcode获取该地理编码对应的天气
weather: ""
};
const meta = await tp.user.getDiaryMeta(tp, config);
%>---
tags:
- Topic/DailyNote
title: <% tp.file.title %>
type:
- Daily Note
date: <% tp.date.now("YYYY-MM-DD") %>
created_time: <% tp.file.creation_date("YYYY-MM-DD HH:mm:ss") %>
modify_time: <% tp.file.last_modified_date("YYYY-MM-DD HH:mm:ss") %>
lunar_calendar: <% meta.lunarDate %>
week: <% tp.file.creation_date("dddd") %>
location: <% meta.location %>
weather: <% meta.weather %>
%>
health:
events:
aliases:
- Daily Note - <% tp.date.now("YYYY-MM-DD") %>
---
# Daily Note - <% tp.date.now("YYYY-MM-DD") %>
说明:
- 模板使用了 Templater 的脚本功能,调用了 getDiaryMeta.js 脚本。
- 将获取到的 lunar_calendar、location 和 weather 信息插入到笔记的前置字段(YAML Front Matter)中。
- 模板中还包含一个星期、标题和正文,您可以根据需要进行修改。
使用模板创建每日笔记
- 设置每日笔记模板:
如果您使用了 Obsidian 的 Daily Notes 插件,可以在插件设置中,将每日笔记模板设置为刚刚创建的 /Template/Daily Note.md
文件。
- 创建新的每日笔记:
当新的一天开始时,使用 Daily Notes 插件创建今日的笔记。 笔记将自动使用模板,并调用脚本获取当天的基础信息。
- 查看结果:
打开今日的笔记,您将看到类似以下的内容:
---
tags:
- Topic/DailyNote
title: 2024-12-21
type:
- Daily Note
date: 2024-12-21
created_time: 2024-12-21 08:21:04
modify_time: 2024-12-21 09:07:23
lunar_calendar: 十一月廿一
week: 星期六
location: 浙江省瑞安市
weather: 晴/晴, 2~14℃
health:
events:
aliases:
- Daily Note - 2024-12-21
---
常见问题及解决方法
- 获取不到天气或位置信息:
检查您的网络连接,确保可以访问外部 API。 确认您的 API Key 有效,且没有超过调用限制。 确保 Templater、日记插件配置正确,且模板文件和 JS 文件存放路径正确。
- 农历日期显示为 " 获取失败 ":
可能是聚合数据的 API 请求失败,检查您的 API Key 和配额。通过 Ctrl+Shift+i
检查控制台输出
结语
通过以上步骤,您已经成功地利用 Obsidian 的 Templater 插件和 JavaScript 脚本,实现了每日基础信息的自动记录。这个过程不仅提升了您的日记记录效率,还为之后的追溯和汇总提供了帮助。
Obsidian 的强大之处在于其高度的可定制性和扩展性。除了本文介绍的功能,您还可以根据自己的需求,进一步扩展脚本的功能,例如:
添加每日名言或格言: 从网上获取每日一句,增添正能量。 统计步数或健康数据: 如果您有相关的 API 或数据源,可以将它们整合到日记中。 记录待办事项: 自动生成当天的待办事项列表模板。
通过 dataview 展示位置发生改变的条目
// 获取目标目录中的文件并按日期降序排列
let pages = dv.pages('"Archive/Notes"')
.where(p => p.location) // 只保留有 location 字段的记录
.sort(p => p.date, 'desc'); // 按日期降序排列
// 初始化一个结果数组和上一个记录的 location
let result = [];
let lastLocation = null;
// 遍历记录,当 location 与上一条不同时才记录
for (let page of pages) {
if (page.location !== lastLocation) {
result.push(page);
lastLocation = page.location;
}
}
// 渲染表格
dv.table(
["File", "Location"], // 表头
result.slice(0, 5).map(p => [p.file.link, p.location]) // 表数据
);
免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。
- 上一篇:如何系统学习 MySQL?
- 下一篇:依赖注入 和 new 一个实例有什么区别吗?
相关推荐

你 发表评论:
欢迎