用wttr查阅天气

查看天气的核心命令:

curl "wttr.in/福州?n&lang=zh-cn"

输出福州最近三天的白天和晚上天气。(可换成你想要的城市)

问题:wttr网站连接较慢,需要时间,而且不一定能连上。

解决:后台运行脚本weather.sh,每半小时下载一次天气到日志文件,而且如果下载不成功则重复,最多重复3次。

问题:天气单词翻译不完全,有些是未翻译的英文。

解决:写perl程序transweather.pl,用正则表达式截取英文天气词组,译成中文。

问题:显示不够美观。

解决:用DispWeather输出日志文件(调用transweather.pl翻译天气),输出时修饰下。

天气显示脚本:

--------weather.sh--------

#!/bin/bash
# 通过wttr显示天气

#读取天气
#curl -s 禁止输出信息

#每半小时下载一次天气,结果写入到weather.log
LogFile=~/LOG/weather.log
while true; do
	WeRes=$(curl -s --max-time 3 "wttr.in/福州?n&lang=zh-cn")
	#如果成功返回,则输出文本到日志文件供查看。查看时用less -R确保能正确处理ANSI彩色
	if [ $? -eq 0 ]; then
		echo -e "\033[1;35m$(date)\033[0m" > $LogFile
		#将天气输入到日志文件
		echo -e "$WeRes" >> $LogFile
	fi
	sleep 30m
done

----------------

--------transweather.pl--------

#!/usr/bin/perl
#将天气文件中的英文天气翻译为中文
use strict;
use warnings;

#将每段英文天气词组翻译为中文天气,并在后面添加合适数目的空格,使长度相等
sub repl
{
my ($old_text) = @_;
my $text = $old_text;

#翻译后置的nearby
$text =~ s/^(.*) ne[a-z]*$/附近$1/;

#定义替换字符串
my @old_subs = (", ", "rain shower", "clear", "sunny", "partly ", "cloudy", "light ", "rain", "patchy ", "moderate ", "drizzle");
my @new_subs = ("转", "阵雨", "晴朗", "晴", "局部", "多云", "小", "雨", "零星小", "中", "毛毛雨");

# 替换并添加空格(认为全部替换成汉字,每个汉字长度为3,所以要/3*2,变成长度为2)
for (my $i = 0; $i < @old_subs; $i++) {
    $text =~ s/$old_subs[$i]/$new_subs[$i]/ig;
}

if ($text ne $old_text) {
my $total_length_diff = length($old_text) - length($text)/3*2;

# 在末尾添加足够的空格以达到原始长度(如果有必要的话)
$text .= ' ' x ($total_length_diff > 0 ? $total_length_diff : 0);
}

return $text;
}

#从控制台读入收信信息
my $str='';
while(defined(my $line = <STDIN>)){
    $str = $str . $line;
}

#unicode模式下将省略号替换为空格,以免匹配出错
$str =~ s/…/ /ug;
#搜索天气词汇并替换
$str =~ s/[A-Z,][A-Za-z ]*[a-z]/repl($&)/ge;
print $str;

----------------

--------DispWeather--------

#!/bin/bash

#显示天气



LOGFILE=~/LOG/weather.log

#显示头部

head -n 2 $LOGFILE | sed "s/:: /:\x1b[1;32m/"

#显示翻译后的天气(去掉尾部)

tail -n +3 $LOGFILE | head -n -3 | transweather.pl

----------------

在xfce4的启动执行脚本中写入:

#每半小时查看一次天气

nohup weather.sh &> /dev/null &

环境变量设置:

# less默认行为:支持ANSI彩色,搜索忽略大小写

export LESS="-i -R"

在面板中添加一项"查看天气",内容为:

bash -ic 'echo -ne "\033]0;天气\007" && DispWeather | less'

最后输出(因为用了less,所以可以按Page Up和Page Down翻页):

请注意论坛会自动把英文引号变成弯引号,因此您现在给出的代码其实都是无法执行的。

为获得更好的阅读体验,请把代码、命令放到代码块内。

多谢多谢,我马上改。

wttr 的具体使用方法可参考本文: