wttr.in —查看curl
的正确方法!
wttr.in 是一种面向控制台的天气预报服务,支持各种信息表示方法,例如用于控制台 HTTP 客户端(curl、httpie 或 wget)的面向终端的 ANSI 序列、用于 Web 浏览器的 HTML 或用于图形查看器的 PNG。
wttr.in最初是一个小项目,是 wego 的包装器,旨在展示面向控制台的服务的强大功能,后来成为流行的天气预报服务,每天处理数千万条查询。
您可以在此处看到它正在运行:wttr.in。
文档 |用途 |一行输出|数据丰富的输出格式|地图查看 |输出格式 |月相|国际化|安装
您可以从 shell 或 Web 浏览器访问该服务,如下所示:
$ curl wttr.in
Weather for City: Paris, France
/ Clear
.-. 10 – 11 °C
― ( ) ― ↑ 11 km/h
`-’ 10 km
/ 0.0 mm
以下是天气预报示例:
或者在 PowerShell 中:
Invoke-RestMethod https: // wttr.in
想要获取特定地点的天气信息吗?您可以将所需的位置添加到请求中的 URL,如下所示:
$ curl wttr.in/London
$ curl wttr.in/Moscow
$ curl wttr.in/Salt+Lake+City
如果省略位置名称,您将根据您的 IP 地址获得当前位置的报告。
使用 3 个字母的机场代码来获取某个机场的天气信息:
$ curl wttr.in/muc # Weather for IATA: muc, Munich International Airport, Germany
$ curl wttr.in/ham # Weather for IATA: ham, Hamburg Airport, Germany
假设您想要获取城镇或城市以外的地理位置的天气 - 可能是城市中的景点、山脉名称或某个特殊位置。在名称之前添加字符~
以在检索天气之前查找该特殊位置名称:
$ curl wttr.in/~Vostok+Station
$ curl wttr.in/~Eiffel+Tower
$ curl wttr.in/~Kilimanjaro
对于这些示例,您将在天气预报输出下方看到一行,显示查找位置的地理位置结果:
Location: Vostok Station, станция Восток, AAT, Antarctica [-78.4642714,106.8364678]
Location: Tour Eiffel, 5, Avenue Anatole France, Gros-Caillou, 7e, Paris, Île-de-France, 75007, France [48.8582602,2.29449905432]
Location: Kilimanjaro, Northern, Tanzania [-3.4762789,37.3872648]
您还可以使用 IP 地址(直接)或域名(以@
前缀)来指定位置:
$ curl wttr.in/@github.com
$ curl wttr.in/@msu.ru
要在线获取详细信息,您可以访问 /:help 页面:
$ curl wttr.in/:help
默认情况下,美国的查询使用 USCS 单位,而世界其他地区的查询则使用公制单位。您可以通过将?u
、 ?m
或?M
添加到 URL 来覆盖此行为,如下所示:
$ curl wttr.in/Amsterdam?u # USCS (used by default in US)
$ curl wttr.in/Amsterdam?m # metric (SI) (used by default everywhere except US)
$ curl wttr.in/Amsterdam?M # metric (SI), but show wind speed in m/s
如果要传递多个选项,请在单字母选项中不使用分隔符来编写它们,并使用&
作为带有值的长选项的分隔符:
$ curl 'wttr.in/Amsterdam?m2&lang=nl'
它大致相当于 GNU CLI 语法的-m2 --lang nl
。
wttr.in 目前支持五种输出格式:
ANSI 和 HTML 格式是根据用户代理字符串选择的。
要强制使用纯文本,这会禁用颜色:
$ curl wttr.in/?T
要将输出限制为标准控制台字体(例如 Consolas 和 Lucida Console)中可用的字形:
$ curl wttr.in/?d
可以通过在查询末尾添加.png
来强制使用 PNG 格式:
$ wget wttr.in/Paris.png
您可以像在 URL 中一样使用 PNG 格式的所有选项,但必须用_
而不是?
分隔它们。和&
:
$ wget wttr.in/Paris_0tqp_lang=fr.png
PNG 格式的有用选项:
t
表示透明度( transparency=150
);当天气 PNG 用于将天气数据添加到图片中时,透明度是一个有用的功能:
$ convert source.jpg <( curl wttr.in/Oymyakon_tqp0.png ) -geometry +50+50 -composite target.jpg
在这个例子中:
source.jpg
- 源文件;target.jpg
- 目标文件;Oymyakon
- 地点名称;tqp0
- 选项(推荐)。您可以使用 wttr-switcher 将一个特殊的 wttr.in 小部件嵌入到 HTML 页面中,该小部件显示当前或选定位置的天气状况。这就是它的样子:wttr-switcher-example 或在现实世界的网站上:https://feuerwehr-eisolzried.de/。
一行输出格式可以方便地用于在不同程序的状态栏中显示天气信息,例如tmux 、 weechat等。
对于一行输出格式,指定附加 URL 参数format
:
$ curl wttr.in/Nuremberg?format=3
Nuremberg: ? +11⁰C
可用的预配置格式:1、2、3、4 和使用百分比表示法的自定义格式(见下文)。
您可以指定用:
分隔的多个位置(用于重复查询):
$ curl wttr.in/Nuremberg:Hamburg:Berlin?format=3
Nuremberg: ? +11⁰C
或者一次处理所有这些查询:
$ curl -s 'wttr.in/{Nuremberg,Hamburg,Berlin}?format=3'
Nuremberg: ? +11⁰C
Hamburg: ? +8⁰C
Berlin: ? +8⁰C
要指定您自己的自定义输出格式,请使用特殊的%
表示法:
c Weather condition,
C Weather condition textual name,
x Weather condition, plain-text symbol,
h Humidity,
t Temperature (Actual),
f Temperature (Feels Like),
w Wind,
l Location,
m Moon phase ????????,
M Moon day,
p Precipitation (mm/3 hours),
P Pressure (hPa),
u UV index (1-12),
D Dawn*,
S Sunrise*,
z Zenith*,
s Sunset*,
d Dusk*,
T Current time*,
Z Local timezone.
(*times are shown in the local timezone)
所以,这两个调用是相同的:
$ curl wttr.in/London?format=3
London: ⛅️ +7⁰C
$ curl wttr.in/London?format="%l:+%c+%tn"
London: ⛅️ +7⁰C
在tmux.conf
中使用时,必须用%
转义%
,即写%%
而不是%
。
当使用 % 表示法时,输出默认不包含换行符,但当使用预配置格式( 1
、 2
、 3
等)时,输出确实包含换行符。要在使用 % 表示法时在输出中包含新行,请在从 shell 执行查询时使用 'n' 和单引号。
在自动查询服务的程序中(例如 tmux),最好使用一些合理的更新间隔。在 tmux 中,您可以使用status-interval
进行配置。
如果在查询中指定了多个, :
分隔的位置,请将更新周期指定为附加查询参数period=
:
set -g status-interval 60
WEATHER='#(curl -s wttr.in/London:Stockholm:Moscow?format="%%l:+%%c%%20%%t%%60%%w&period=60")'
set -g status-right "$WEATHER ..."
要嵌入到 IRC (WeeChat) 客户端的现有状态栏:
/alias add wttr /exec -pipe "/mute /set plugins.var.wttr" url:wttr.in/Montreal?format=%l:+%c+%f+%h+%p+%P+%m+%w+%S+%s;/wait 3 /item refresh wttr
/trigger add wttr timer 60000;0;0 "" "" "/wttr"
/item add wttr "" "${plugins.var.wttr}"
/eval /set weechat.bar.status.items ${weechat.bar.status.items},spacer,wttr
/eval /set weechat.startup.command_after_plugins ${weechat.startup.command_after_plugins};/wttr
/wttr
康基使用示例:
${texeci 1800 curl wttr.in/kyiv_0pq_lang=uk.png
| convert - -transparent black $HOME/.config/conky/out.png}
${image $HOME/.config/conky/out.png -p 0,0}
IRC 集成示例:
要在终端中查看表情符号,您需要:
对于表情符号字体,我们推荐Noto Color Emoji ,一个不错的替代选择是Emoji One字体;它们都支持所有必要的表情符号符号。
字体配置:
$ cat ~/.config/fontconfig/fonts.conf
<? xml version = " 1.0 " encoding = " UTF-8 " ?>
<! DOCTYPE fontconfig SYSTEM "fonts.dtd">
< fontconfig >
< alias >
< family >serif</ family >
< prefer >
< family >Noto Color Emoji</ family >
</ prefer >
</ alias >
< alias >
< family >sans-serif</ family >
< prefer >
< family >Noto Color Emoji</ family >
</ prefer >
</ alias >
< alias >
< family >monospace</ family >
< prefer >
< family >Noto Color Emoji</ family >
</ prefer >
</ alias >
</ fontconfig >
(要应用配置,请运行fc-cache -f -v
)。
在某些情况下, tmux
和终端对某些 emoji 字符的理解可能会有所不同,这可能会导致类似于 #579 中描述的奇怪效果。
在视图代码v2
下可用的实验数据丰富的输出格式中,可以使用许多附加天气和天文信息:
$ curl v2.wttr.in/München
或者
$ curl wttr.in/München?format=v2
或者,如果您更喜欢 Nerd Fonts 而不是 Emoji、 v2d
(白天)或v2n
(夜间):
$ curl v2d.wttr.in/München
(该模式是实验性的,目前有几个限制:
目前,您需要对某些终端进行一些调整,以获得最佳的可视化效果。
根据您的配置,您可能会执行所有步骤,或仅执行其中几个步骤。 URXVT 目前不支持表情符号相关字体,但我们可以使用Font-Symbola获得几乎相同的效果。因此,将以下行添加到您的.Xresources
文件中:
xft:symbola:size=10:minspace=False
您可以将其添加到您喜欢的字体之后,它只会在需要时显示。然后,如果您看到或感觉遇到间距问题,请添加以下内容: URxvt.letterSpace: 0
出于某种原因,URXVT 有时会停止确定正确的单词间距,我们需要以这种方式强制执行。
结果应该是这样的:
在视图代码v3
下可用的实验地图视图中,提供了有关地理区域的天气信息:
$ curl v3.wttr.in/Bayern.sxl
或者直接在浏览器中:
地图视图目前支持三种格式:
具有内联图像协议支持的终端:
⟶详细文章:终端中的图像
终端 | 环境 | 图片支持 | 协议 |
---|---|---|---|
乌斯特姆 | X11 | 是的 | 西塞尔 |
多术语 | X11 | 是的 | 西塞尔 |
猫咪 | X11 | 是的 | 猫咪 |
韦兹特姆 | X11 | 是的 | 国际投资计划 |
暗瓦 | X11 | 是的 | 西塞尔 |
耶克斯尔 | X11 | 是的 | 西塞尔 |
GNOME 终端 | X11 | 进行中 | 西塞尔 |
活泼 | X11 | 进行中 | 西塞尔 |
脚 | 韦兰 | 是的 | 西塞尔 |
多姆术语 | 网络 | 是的 | 西塞尔 |
亚夫特 | FB | 是的 | 西塞尔 |
iTerm2 | Mac OS X | 是的 | 国际投资计划 |
薄荷味 | 视窗 | 是的 | 西塞尔 |
Windows 终端 | 视窗 | 进行中 | 西塞尔 |
登录 | 视窗 | 是的 | 西塞尔 |
JSON 格式是一种通过易于解析的格式提供对wttr.in数据的访问的功能,无需用户创建复杂的脚本来重新解释 wttr.in 的图形输出。
要获取 JSON 格式的信息,请使用以下语法:
$ curl wttr.in/Detroit?format=j1
这将以 JSON 格式获取有关底特律地区的信息。 j1 格式代码用于允许对 JSON 输出使用其他布局。
结果将如下所示:
{
"current_condition" : [
{
"FeelsLikeC" : " 25 " ,
"FeelsLikeF" : " 76 " ,
"cloudcover" : " 100 " ,
"humidity" : " 76 " ,
"observation_time" : " 04:08 PM " ,
"precipMM" : " 0.2 " ,
"pressure" : " 1019 " ,
"temp_C" : " 22 " ,
"temp_F" : " 72 " ,
"uvIndex" : 5 ,
"visibility" : " 16 " ,
"weatherCode" : " 122 " ,
"weatherDesc" : [
{
"value" : " Overcast "
}
],
"weatherIconUrl" : [
{
"value" : " "
}
],
"winddir16Point" : " NNE " ,
"winddirDegree" : " 20 " ,
"windspeedKmph" : " 7 " ,
"windspeedMiles" : " 4 "
}
],
...
除了weatherCode
之外,大多数值都是不言自明的。 weatherCode
是一个枚举,您可以在 WorldWeatherOnline 网站或 wttr.in 源代码中找到它。
Prometheus Metrics 格式是一项功能,通过易于解析的格式为监控系统提供对wttr.in数据的访问,而不需要用户创建复杂的脚本来重新解释 wttr.in 的图形输出。
要获取 Prometheus 格式的信息,请使用以下语法:
$ curl wttr.in/Detroit?format=p1
这将以 Prometheus Metrics 格式获取有关底特律地区的信息。 p1
格式代码用于允许使用 Prometheus Metrics 输出的其他布局。
Prometheus 的可能配置如下所示:
- job_name : ' wttr_in_detroit '
static_configs :
- targets : ['wttr.in']
metrics_path : ' /Detroit '
params :
format : ['p1']
结果将如下所示:
# HELP temperature_feels_like_celsius Feels Like Temperature in Celsius
temperature_feels_like_celsius{forecast="current"} 7
# HELP temperature_feels_like_fahrenheit Feels Like Temperature in Fahrenheit
temperature_feels_like_fahrenheit{forecast="current"} 45
[truncated]
...
wttr.in 还可用于检查月相。此示例显示如何在全输出模式下查看当前月相:
$ curl wttr.in/Moon
通过添加@YYYY-MM-DD
获取特定日期的月相:
$ curl wttr.in/Moon@2016-12-25
月相信息使用pyphoon作为后端。
要在在线模式下获取月相信息,请使用%m
:
$ curl wttr.in/London?format=%m
?
请记住,月相的 Unicode 表示形式有两个注意事项:
对于某些字体,表示形式?
是不明确的,因为它看起来几乎是阴影的或几乎是亮的,具体取决于您的终端是处于浅色模式还是深色模式。依靠像noto-fonts
这样的彩色字体可以解决这个问题。
代表?
也是含糊不清的,因为它在北半球意味着“最后一个季度”,但在南半球意味着“第一季度”。这在热带地区也毫无意义。这是 Unicode 意识到的限制。但wttr.in
尚未解决这个问题。
相应的跟踪问题请参见 #247、#364,pyphoon 参见 pyphoon#1。欢迎任何帮助。
wttr.in 支持多语言位置名称,可以用世界上任何语言指定(这可能令人惊讶,但世界上许多位置没有英文名称)。
查询字符串应以 Unicode 指定(十六进制编码或非十六进制编码)。查询字符串中的空格必须替换为+
:
$ curl wttr.in/станция+Восток
Weather report: станция Восток
Overcast
.--. -65 – -47 °C
.-( ). ↑ 23 km/h
(___.__)__) 15 km
0.0 mm
用于输出的语言(位置名称除外)不依赖于输入语言,它是英语(默认情况下)或在中指定的浏览器的首选语言(如果查询是从浏览器发出的)查询标头( Accept-Language
)。
使用控制台客户端时,可以使用如下命令行选项显式设置语言:
curl -H "Accept-Language: fr" wttr.in
http GET wttr.in Accept-Language:ru
可以使用lang
选项强制首选语言:
$ curl wttr.in/Berlin?lang=de
第三个选项是使用查询中使用的 DNS 名称选择语言:
$ curl de.wttr.in/Berlin
wttr.in 目前已翻译成 54 种语言,并且支持的语言数量正在不断增长。
请参阅 /:translation 了解有关翻译过程的更多信息、查看支持的语言和贡献者列表,或者了解如何帮助将 wttr.in 翻译成您的语言。
要安装该应用程序:
wttr.in 具有以下外部依赖项:
安装 golang 后,安装wego
:
go install github.com/schachmat/wego@latest
Python 要求:
如果您想获取 PNG 文件形式的天气报告,您还需要安装:
您可以使用pip
安装其中大部分。
有些Python包使用LLVM,所以先安装它:
apt-get install llvm-7 llvm-7-dev
如果使用virtualenv
:
virtualenv -p python3 ve
ve/bin/pip3 install -r requirements.txt
ve/bin/python3 bin/srv.py
此外,您还需要安装 geoip2 数据库。您可以使用免费数据库 GeoLite2,可以从 (http://dev.maxmind.com/geoip/geoip2/geolite2/) 下载。
如果您想对 GeoLite2 未覆盖的 IP 地址使用 IP2location 服务,您必须获取该服务的 API 密钥,然后保存到~/.ip2location.key
文件中:
$ echo 'YOUR_IP2LOCATION_KEY' > ~/.ip2location.key
如果你没有这个文件,该服务将被默默地跳过(这不是一个大问题,因为MaxMind数据库相当不错)。
/root/.wegorc
/root/.ip2location.key (optional)
/app/airports.dat
/app/GeoLite2-City.mmdb
要获取 WorldWeatherOnline API 密钥,您必须在此处注册:
https://developer.worldweatheronline.com/auth/register
获得 WorldWeatherOnline 密钥后,您可以将其保存到 WWO 密钥文件中: ~/.wwo.key
另外,您必须在wego
配置中指定密钥:
$ cat ~/.wegorc
{
"APIKey" : " 00XXXXXXXXXXXXXXXXXXXXXXXXXXX " ,
"City" : " London " ,
"Numdays" : 3 ,
"Imperial" : false ,
"Lang" : " en "
}
~/.wegorc
中的City
参数被忽略。
配置以下环境变量,定义本地wttr.in
安装、GeoLite 数据库和wego
安装的路径。例如:
export WTTR_MYDIR= " /home/igor/wttr.in "
export WTTR_GEOLITE= " /home/igor/wttr.in/GeoLite2-City.mmdb "
export WTTR_WEGO= " /home/igor/go/bin/wego "
export WTTR_LISTEN_HOST= " 0.0.0.0 "
export WTTR_LISTEN_PORT= " 8002 "
建议您还配置将用于访问该服务的 Web 服务器:
server {
listen [::]:80;
server_name wttr.in *.wttr.in;
access_log /var/log/nginx/wttr.in-access.log main ;
error_log /var/log/nginx/wttr.in-error.log;
location / {
proxy_pass http://127.0.0.1:8002;
proxy_set_header Host $host ;
proxy_set_header X-Real-IP $remote_addr ;
proxy_set_header X-Forwarded-For $remote_addr ;
client_max_body_size 10m ;
client_body_buffer_size 128k ;
proxy_connect_timeout 90 ;
proxy_send_timeout 90 ;
proxy_read_timeout 90 ;
proxy_buffer_size 4k ;
proxy_buffers 4 32k ;
proxy_busy_buffers_size 64k ;
proxy_temp_file_write_size 64k ;
expires off ;
}
}