卡卷网
当前位置:卡卷网 / 每日看点 / 正文

如何使用Obsidian软件?

作者:卡卷网发布时间:2024-12-25 01:17浏览数量:97次评论数量:0次

Obsidian 日记自动记录当前位置、天气和农历信息

如果您正在使用 Obsidian 来管理您的笔记和日记,那么您可能会想要一种自动化的方法来记录每日的基础信息,例如星期几、当前位置、天气和农历日期。本文将向您介绍如何利用 Obsidian 的 Templater 插件配合 JavaScript 脚本,实现每日基础情况的自动记录。


如何使用Obsidian软件?  第1张


前言

Templater 插件允许用户使用模板和脚本来自动生成笔记内容。通过配合 JavaScript 脚本,您可以让 Obsidian 自动为您的日记模板填充诸如当前天气、位置和农历日期等信息。

安装和配置 Templater 插件

在插件的设置中,指定您的模板文件夹位置,例如 /Template,并指定 JS 脚本存放路径,例如 /Archive/Scripts


如何使用Obsidian软件?  第2张


获取 API 密钥

为了获取实时的天气、位置和农历日期信息,我们需要使用相关的 API 服务。

  1. 高德地图 API(用于获取位置和天气):

访问 高德开放平台,注册并登录您的账户。 创建一个新的应用,申请 Web 服务 类型的 Key。 获取到 高德地图 API Key,请妥善保存。


如何使用Obsidian软件?  第3张


  1. 聚合数据 API(用于获取农历日期):

访问 聚合数据,注册并登录您的账户。 在 数据 API 中,搜索并申请 万年历 API。 获取到 聚合数据 API Key,请妥善保存。


如何使用Obsidian软件?  第4张


编写 JavaScript 脚本

在您的 Obsidian 库中,创建一个用于存放脚本的文件夹,例如/Archive/Scripts

  1. 创建 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)中。
  • 模板中还包含一个星期、标题和正文,您可以根据需要进行修改。

使用模板创建每日笔记

  1. 设置每日笔记模板:

如果您使用了 Obsidian 的 Daily Notes 插件,可以在插件设置中,将每日笔记模板设置为刚刚创建的 /Template/Daily Note.md 文件。


如何使用Obsidian软件?  第5张


  1. 创建新的每日笔记:

当新的一天开始时,使用 Daily Notes 插件创建今日的笔记。 笔记将自动使用模板,并调用脚本获取当天的基础信息。

  1. 查看结果:

打开今日的笔记,您将看到类似以下的内容:

--- 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软件?  第6张


结语

通过以上步骤,您已经成功地利用 Obsidian 的 Templater 插件和 JavaScript 脚本,实现了每日基础信息的自动记录。这个过程不仅提升了您的日记记录效率,还为之后的追溯和汇总提供了帮助。

Obsidian 的强大之处在于其高度的可定制性和扩展性。除了本文介绍的功能,您还可以根据自己的需求,进一步扩展脚本的功能,例如:

添加每日名言或格言: 从网上获取每日一句,增添正能量。 统计步数或健康数据: 如果您有相关的 API 或数据源,可以将它们整合到日记中。 记录待办事项: 自动生成当天的待办事项列表模板。

通过 dataview 展示位置发生改变的条目


如何使用Obsidian软件?  第7张


// 获取目标目录中的文件并按日期降序排列 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]) // 表数据 );

END

免责声明:本文由卡卷网编辑并发布,但不代表本站的观点和立场,只提供分享给大家。

卡卷网

卡卷网 主页 联系他吧

请记住:卡卷网 Www.Kajuan.Net

欢迎 发表评论:

请填写验证码