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 ;
}
}