wttr.in 一个 Python 实现的命令行查看天气工具-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

wttr.in 一个 Python 实现的命令行查看天气工具

huc_逆天 2020-05-21 19:12:17 853

wttr.in是面向控制台的天气预报服务,它支持各种信息表示方法,例如用于控制台HTTP客户端(curl,httpie或wget)的面向终端的ANSI序列,用于Web浏览器的HTML或用于图形查看器的PNG。

wttr.in使用wego进行可视化,并使用各种数据源获取天气预报信息。

您可以在此处查看它的运行情况:wttr.in

用法

您可以从外壳或Web浏览器访问服务,如下所示:

$ curl wttr.in
Weather for City: Paris, France

     \   /     Clear
      .-.      10 – 11 °C  
   ― (   ) ―   ↑ 11 km/h  
      `-’      10 km  
     /   \     0.0 mm  

这是您所在位置的实际天气报告(直播!):

天气预报

(这不是您的实际位置-GitHub的CDN用您自己的IP地址隐藏了您的真实IP地址,但它仍然是您所用语言的实时天气报告。)

或在PowerShell中:

(Invoke-WebRequest http://wttr.in).Content

是否想获取特定位置的天气信息?您可以像这样在请求中将所需位置添加到URL:

$ curl wttr.in/London
$ curl wttr.in/Moscow

如果省略位置名称,则将基于IP地址获取当前位置的报告。

使用三字母机场代码以获取特定机场的天气信息:

$ 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到这样的URL 来覆盖此行为:

$ curl wttr.in/Amsterdam?u
$ curl wttr.in/Amsterdam?m

支持的输出格式和视图

wttr.in当前支持五种输出格式:

  • 终端的ANSI;
  • 终端和脚本的纯文本;
  • 浏览器的HTML;
  • 图形查看器的PNG;
  • 脚本和API的JSON。

根据用户代理字符串选择ANSI和HTML格式。可以通过.png在查询末尾添加PNG格式来强制使用:

$ wget wttr.in/Paris.png

您可以像在URL中一样使用所有具有PNG格式的选项,但必须使用_而不是?和来分隔它们&

$ wget wttr.in/Paris_0tqp_lang=fr.png

PNG格式的有用选项:

  • t为了透明(transparency=150);
  • 自定义透明度级别的透明度= 0..255。

当使用天气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页面中,该小部件将当前或所选位置的天气状况显示在HTML页面中。看起来是这样的:wttr-switcher-example或在现实世界的网站上:https : //feuerwehr-eisolzried.de/

嵌入式wttr.in示例在feuerwehr-eisolzried.de

单行输出

对于单行输出格式,请指定其他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,
    h    Humidity,
    t    Temperature,
    w    Wind,
    l    Location,
    m    Moonphase ,
    M    Moonday,
    p    precipitation (mm),
    o    Probability of Precipitation,
    P    pressure (hPa),

    D    Dawn*,
    S    Sunrise*,
    z    Zenith*,
    s    Sunset*,
    d    Dusk*.

(times are shown in the local timezone)

因此,这两个调用是相同的:

    $ curl wttr.in/London?format=3
    London: ⛅️ +7⁰C
    $ curl wttr.in/London?format="%l:+%c+%t"
    London: ⛅️ +7⁰C

请记住,在使用时中tmux.conf,你有逃跑%%,即写有%%代替%

在自动查询服务的程序(例如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 ..."

tmux状态栏中的wttr.in

要在终端中查看表情符号,您需要:

  1. 终端支持表情符号(已添加到开罗1.15.8中);
  2. 支持表情符号的字体。

对于Emoji字体,我们建议使用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

数据丰富的输出格式

在视图数据下可用的实验数据丰富的输出格式中,还可以v2使用许多其他天气和天文信息:

  • 整天的温度和气温变化预测;
  • 今天和以后三天的月相;
  • 当前的天气状况,温度,湿度,风速和方向,压力;
  • 时区;
  • 所选地点的黎明,日出,中午,日落,黄昏时间;
  • 所选位置的精确地理坐标。
  $ curl v2.wttr.in/München

要么

  $ curl wttr.in/München?format=v2

数据到达输出格式

(此模式是实验性的,目前存在一些局限性:

  • 它仅适用于终端;
  • 仅支持英语)。

当前,您需要对某些终端进行一些调整,以获得最佳的可视化效果。

URXVT

根据您的配置,您可能会执行所有步骤,也可能仅执行几个步骤。目前,URXVT不支持与表情符号相关的字体,但是使用Font-Symbola可以获得几乎相同的效果。因此.Xresources,将以下行添加到您的文件中:

    xft:symbola:size=10:minspace=False

您可以首选字体之后添加它,它只会在需要时显示。然后,如果您发现或感觉到有间距问题,请添加以下内容:URxvt.letterSpace: 0 由于某种原因,URXVT有时会停止正确确定单词间距,因此我们需要以这种方式强制使用。

结果应如下所示:

URXVT表情符号线

JSON输出

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"
    }
],
...

月相

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

国际化和本地化

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种语言,支持的语言数量也在不断增长。

对wttr.in的各种语言查询

Windows用户

当前存在两个与Windows相关的问题,这些问题使本页上找到的示例无法按预期正常工作。在Microsoft解决问题之前,有一些解决方法。为了避免这两个问题,您可以使用外壳程序,例如bashLinuxWindows子系统(WSL)上,或继续阅读以获取替代解决方案。

输出中的垃圾字符

当前Win32版本的限制curl。在解决Win32 curl问题并将其在将来的Windows版本中推出之前,建议您改用Powershell的Invoke-Web-Request命令:

  • (Invoke-WebRequest http://wttr.in).Content

对角风向字符丢失或加倍

第二个问题是关于某些Windows终端应用程序(例如默认conhost.exe使用)的对角箭头标志符号的宽度。在撰写本文时ConEmu.exe,,ConEmu64.exe并且在ConEmu之上构建的终端应用程序(例如Cmder(cmder.exe))默认情况下使用这些双倍宽字形。所有这些程序的结果都是相同的,某些风向缺少字符或输出中的表损坏或两者兼有。某些第三方终端应用程序已解决了风向标志符号问题,但此修复方法取决于您使用的字体和终端应用程序。在终端应用程序中显示对角风向标志符号的一种方法是使用Windows终端,该终端当前在Microsoft Store中可用。Windows Terminal当前是预览版本,将在以后的版本中作为默认的终端应用程序推出。如果使用Windows Terminal后输出仍然偏斜,请尝试最大化终端窗口。您可以显示对角线风向另一种方法是利用正向和反向斜线换出存在问题的字符如图所示这里

安装

要安装该应用程序:

  1. 安装外部依赖项
  2. 安装服务使用的Python依赖项
  3. 配置IP2Location(可选)
  4. 获取WorldWeatherOnline API并配置wego
  5. 配置wttr.in
  6. 配置HTTP前端服务

安装外部依赖项

wttr.in具有以下外部依赖性:

安装golang之后,请安装wego

$ go get -u github.com/schachmat/wego
$ go install github.com/schachmat/wego

安装Python依赖项

Python需求:

  • Flask
  • geoip2
  • geopy
  • requests
  • gevent

如果要以PNG文件形式获取天气报告,则还需要安装:

  • PIL
  • pyte (>=0.6)
  • necessary fonts

您可以使用安装大多数工具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/)下载。

配置IP2Location(可选)

如果要将IP2location服务用于GeoLite2未涵盖的IP地址,则必须获取该服务的API密钥,然后将其保存到~/.ip2location.key文件中:

$ echo 'YOUR_IP2LOCATION_KEY' > ~/.ip2location.key

如果您没有此文件,该服务将被静默跳过(这不是一个大问题,因为MaxMind数据库非常不错)。

获取WorldWeatherOnline密钥并配置wego

要获取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"
}

中的City参数将~/.wegorc被忽略。

配置wttr.in

配置以下环境变量,这些变量定义了本地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"

配置HTTP前端服务

建议您还配置用于访问服务的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;
    }
}
Python
分享到
取消 提交回答
全部回答(1)
  • huc_逆天
    2020-05-22 09:55:16

    欢迎大家分享哦~

    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程