日记天气代码(基于templater)

好久没来,之前曾发贴求助过这个问题(如何在日记里添加天气),得到好多大佬热心解答。现在有新的思路,专门开新贴分享让大家方便看到(在模板里添加以下内容即可):

<%* 
// 👇 日记标题行(自动生成“年 月 日 - 星期”格式,生成日记时仅显示标题,不显示这条注释)
tR += `${tp.file.title.slice(0,4)} 年 ${tp.file.title.slice(4,6).replace(/^0/, '')} 月 ${tp.file.title.slice(6,8).replace(/^0/, '')} 日 - {{date:dddd}}`;
-%>

<%*
// 👇 以下是“自动获取天气”的核心代码(Templater插件会自动执行这里的逻辑)
// 只需把定位坐标换成你所在城市的经纬度即可,其余部分无需更改

// 1. 三亚的定位坐标(固定值!经纬度是全球唯一的,确保天气数据精准)
const lat = 18.2207;  // 纬度(相当于地球的“横线坐标”)
const lon = 109.5101;  // 经度(相当于地球的“竖线坐标”)

// 2. 从文件名提取日期(和上面标题行的日期对应,给天气API传参用)
const fileName = tp.file.title.trim();  // 获取当前日记的文件名(比如“20251116-”)
const datePart = fileName.slice(0, 8);  // 截取文件名前8位(比如“20251116”,这是日历生成的日期)
const targetDate = `${datePart.slice(0,4)}-${datePart.slice(4,6)}-${datePart.slice(6,8)}`;  // 把“20251116”转成“2025-11-16”(天气API要求的日期格式)

// 3. 初始化天气提示(如果没获取到天气,就显示这句话)
let weatherText = "天气数据获取失败,请检查网络";

try {
  // 4. 调用免费的天气API(相当于向“天气数据库”发请求要数据)
  // 这个API是开源免费的,国内能访问,不用自己注册密钥
  const url = `https://archive-api.open-meteo.com/v1/archive?latitude=${lat}&longitude=${lon}&start_date=${targetDate}&end_date=${targetDate}&daily=weathercode,temperature_2m_max,temperature_2m_min&timezone=Asia%2FShanghai`;
  
  // 5. 发送网络请求(安卓端专用的请求方式,比其他方式兼容性好,不容易报错)
  const response = await new Promise((resolve, reject) => {
    const xhr = new XMLHttpRequest();  // 创建一个“请求工具”
    xhr.open('GET', url, true);  // 用“GET”方式向上面的API地址发请求
    xhr.timeout = 15000;  // 超时时间15秒(移动端网络可能慢,给足时间)
    // 请求成功(状态码200):把获取到的天气数据返回
    xhr.onload = () => xhr.status === 200 ? resolve(xhr.responseText) : reject();
    xhr.onerror = () => reject();  // 网络断了、连不上时,视为失败
    xhr.ontimeout = () => reject();  // 超过15秒没反应,视为超时失败
    xhr.send();  // 正式发送请求
  });

  // 6. 解析天气数据(API返回的是“JSON格式”,这里转成能看懂的内容)
  const data = JSON.parse(response);  // 把JSON字符串转成JavaScript能处理的“数据对象”
  const daily = data.daily;  // 提取“每日天气”数据(这是API返回的核心信息)

  // 7. 如果获取到了有效天气数据,就整理成我们要的格式
  if (daily) {
    // 天气代码映射表:API返回的是数字(比如0=晴天),这里转成中文
    const weatherMap = {
      0: "晴天", 1: "多云", 2: "晴转多云", 3: "阴天",
      45: "雾", 61: "小雨", 63: "中雨", 65: "大雨",
      80: "阵雨", 95: "雷阵雨"
    };
    // 根据API返回的数字,找到对应的中文天气(如果没匹配到,默认显示“多云”)
    const weather = weatherMap[daily.weathercode[0]] || "多云";
    // 拼接温度范围(最低温~最高温)
    const temp = `${daily.temperature_2m_min[0]}℃~${daily.temperature_2m_max[0]}℃`;
    // 最终显示的天气文本:“天气 温度”+ 分隔线 + 两空行(可以改成你想要的格式)
    weatherText = `${weather} ${temp}\n\n---\n\n`;
  } else {
    // 没有获取到每日数据时,保持格式一致(提示+分隔线+两空行)
    weatherText += "\n\n---\n\n";
  }
} catch (err) {
  // 网络错误、超时等情况,保持格式一致
  weatherText += "\n\n---\n\n";
}

// 8. 把天气文本插入到日记里(Templater的专用变量,tR就是“插入到文档”的意思)
tR += weatherText;
-%>
1 个赞

这个是必须要用的吗?
代码请求用代码块包裹起来,方便一键复制后尝试,选中后粘贴总有各种空格变样了
2026-05-26_173319

1 个赞

已作修改,看下能否正常了吗 :grinning: