为什么我在 Firefox 扩展中使用 wttr.in 而不是 OpenWeatherMap

发布: (2026年5月4日 GMT+8 06:42)
4 分钟阅读
原文: Dev.to

Source: Dev.to

请提供您希望翻译的完整文本内容,我将按照要求保留源链接、格式和代码块,仅翻译正文部分为简体中文。

API 选项对比

服务费用API 密钥数据格式典型用途
OpenWeatherMap免费套餐:每天 1,000 次调用需要JSON通用
wttr.in免费,无需密钥不需要JSON, ASCII art, PNG终端 / curl 使用
WeatherAPI.com免费套餐(限制不同)需要JSON类似于 OWM
Open-Meteo完全免费,无需密钥不需要JSON按坐标的天气预报
National Weather Service (仅美国)免费,无需密钥不需要JSON仅美国

摩擦差异

OpenWeatherMap 要求用户:

  1. 创建账户
  2. 生成 API 密钥
  3. 将密钥粘贴到扩展设置中
  4. 等待密钥激活(可能需要数小时)

wttr.in 只需要城市名称。去除这些步骤可显著提升从安装到活跃用户的转化率。

代码示例

wttr.in 请求(JavaScript)

// wttr.in request
const url = `https://wttr.in/${encodeURIComponent(city)}?format=j1`;

OpenWeatherMap 请求(JavaScript)

// OpenWeatherMap request
const url = `https://api.openweathermap.org/data/2.5/forecast?q=${encodeURIComponent(city)}&appid=${userApiKey}&units=metric`;

更简洁的代码意味着更少的错误。

wttr.in 示例响应

{
  "current_condition": [
    {
      "temp_C": "18",
      "weatherDesc": [{ "value": "Partly cloudy" }],
      "humidity": "65",
      "windspeedKmph": "20"
    }
  ],
  "weather": [
    {
      "date": "2024-01-15",
      "hourly": [{ "tempC": "15", "...": "..." }],
      "maxtempC": "22",
      "mintempC": "12"
    }
  ]
}

一次请求提供当前条件以及 3 天预报。

可靠性考虑

  • 单一开发者项目 – 可能会宕机或在没有 SLA 的情况下施加速率限制。
  • 速率限制 – 每 IP 限制可能会阻止高流量场景(例如,公司 NAT)。
  • 数据来源 – wttr.in 从多个提供商聚合;不同地区的质量各异。
  • 无付费层 – 不能提升限制或获得保证。

何时选择每项服务

情况推荐的 API
需要商业可靠性保证OpenWeatherMap(或其他付费服务)
需要坐标或偏远地区的天气Open-Meteo
需要小时精度且技术用户可以接受 API 密钥OpenWeatherMap / WeatherAPI.com
想要零摩擦设置的面向消费者的工具wttr.in
侧项目或个人工具,非关键显示wttr.in

对 wttr.in 的激进缓存

因为 wttr.in 没有付费层,我实现了客户端缓存以降低请求频率:

const CACHE_DURATION = 30 * 60 * 1000; // 30 minutes

async function fetchWeather(city) {
  const cacheKey = `weather_${city}`;
  const cached = await browser.storage.local.get(cacheKey);

  if (cached[cacheKey]) {
    const { data, timestamp } = cached[cacheKey];
    if (Date.now() - timestamp < CACHE_DURATION) {
      return data; // Return cached data
    }
  }

  // Fetch fresh data
  const resp = await fetch(`https://wttr.in/${encodeURIComponent(city)}?format=j1`);
  const data = await resp.json();

  // Cache it
  await browser.storage.local.set({
    [cacheKey]: { data, timestamp: Date.now() }
  });

  return data;
}

这将 API 调用限制为 每位用户每 30 分钟一次,而不是在每次打开新标签页时都请求。

结论

Weather & Clock Dashboard 目前使用 wttr.in,能够很好地满足目标受众的需求。如果在大规模使用时出现可靠性问题,我计划将 OpenWeatherMap 添加为备用或主要选项。

在 Firefox 上安装扩展 – 源代码可在 GitHub 上获取。

0 浏览
Back to Blog

相关文章

阅读更多 »

自己制作框架,有什么建议吗?

《Making my own framework》的封面图片。有什么建议吗?https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fde...