如何从 shell 获取当前温度?

How to get the current temperature from the shell?

我想仅使用 public APIs 从 Linux shell 检索我所在位置的当前温度;不需要订阅或使用 API 提供商创建凭据。

该解决方案要求您将这些工具安装到您的 Linux OS:

  • curl,向 URL 发送 GET 请求。
  • jq,查询由 curl 请求编辑的 JSON 对象 return。

TL;DR,这是最后的 command-line:

curl -s -L "$(curl -s -L "https://api.weather.gov/points/$(curl -s -L "https://nominatim.openstreetmap.org/search.php?q=$(curl -s -L ipinfo.io | jq -r '"\(.city),\(.region)"')&polygon_geojson=1&format=jsonv2" | jq -r '"\(.[0].lat),\(.[0].lon)"')" | jq -r '.properties.forecastHourly')" | jq -r '.properties.periods[0].temperature'

分解:

(...代表上一步的命令。)

  1. 向 ipinfo.io 发送请求,以根据您的 public ip 查看有关您的位置的详细信息:
curl -s -L ipinfo.io
  1. 解析ipinfo.io请求的结果得到城市和region/state:
... | jq -r '"\(.city),\(.region)"'
  1. 将您使用 jq 创建的城市和州字符串添加到对 OpenStreetMap 的 curl 调用中:
curl -s -L "https://nominatim.openstreetmap.org/search.php?q=$(...)&polygon_geojson=1&format=jsonv2"
  1. 将来自 OpenStreetMap 的响应解析为“纬度、经度”字符串:
... | jq -r '"\(.[0].lat),\(.[0].lon)"'
  1. 将纬度和经度添加到 url 以请求 weather.gov:
curl -s -L "https://api.weather.gov/points/$(...)"
  1. 解析出 url 到 hourl 年的天气预报:
... | jq -r '.properties.forecastHourly'
  1. 对 hourly 预测进行 curl 调用 url:
curl -s -L "$(...)"
  1. 最后一步:从 JSON 响应中提取温度 属性:
... | jq -r '.properties.periods[0].temperature'

就这么简单。

P.S.

正如 David 所指出的,对 ipinfo.io 的调用实际上会 return 纬度和经度,因此命令的 OpenStreetMap 部分可以完全省略,例如:

curl -s -L "$(curl -s -L "https://api.weather.gov/points/$(curl -s -L ipinfo.io | jq -r '"(.loc)"')" | jq -r '.properties.forecastHourly')" | jq -r '.properties.periods[0].temperature'