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