分页: 1 / 3

天气墙纸脚本:wallther [已死,2012-8-4]

发表于 : 2009-05-11 23:02
xiooli
详情请见 http://joolix.com/2009/05/weather-wallpaper-wallther/

点此下载 (包含脚本及图标和壁纸素材)

看LinuxToy时发现了一个天气墙纸的程序http://linuxtoy.org/archives/weather-wallpaper.html,貌似依赖不少的Gnome组件,很不方便,于是就萌生了用bash脚本写一个相同功能的脚本的想法,经过几个小时的奋战终于搞定了,呵呵,主要是convert等处理图片的软件用得不熟。
这个东东可以自动去获取天气信息(你甚至都不用管城市代码,当然可能有些地方会不准),然后根据获得的天气找到对应的图标,然后将图标和天气情况的文字(是否绘制文字信息可选)合成到背景图片中去,然后将这个合成的图片设置为壁纸。
初次使用需要配置一些东西,主要就是字体,因为我用的雅黑你可能没有。
这里有一张生成的图片大家可以感受一下:
wallpaper.png
代码如下:

代码: 全选

#!/bin/bash
#Copyright (c) 2009 xiooli (xioooli[at]yahoo.com.cn, http://joolix.com)
#Name wallther
#License: GPLv3
#Version 20090511

#此脚本需要安装 w3m 和 imagemagick
#城市代码,留空可自动检测(自动检测不一定精确)
#城市代码可在 http://weather.265.com 上查询,是个5位的数字
#受bones7456和wenbob的天气脚本启发。

#这儿是城市代码,须自己改,未赋值会自动查询。
Wid=101280101
#天气图标的位置
pwd="`dirname $0`"
if [ "$pwd" = "." ]; then pwd="`pwd`"; fi
Icondir="$pwd/icons"
#欲用作背景的图片
BackPic="$Icondir/background.jpg"
#最终输出的图片位置
OutPic="/dev/shm/wallpapertmp.png"
#壁纸路径(此为 OutPic 的副本)
Wallpaper="/dev/shm/wallpaper.png"
#是否在图片上绘制文字天气信息,yes/no
DrawText="yes"
#文字的字体,若不是中文字体则中文可能无法正常显示
#Font="/usr/share/fonts/winfonts/msyh.ttf"
Font="/home/leros/.fonts/sthei.ttf"
#文字的大小
FontSize=24
#文字的颜色
TxtColor="white"
#文字信息绘制的位置
TxtPosX=700
TxtPosY=350
#隔多大距离绘制下一行(此距离包括本行的宽度)
TxtYIncr=35
#天气图标绘制的位置
PicGeometry="+650+80"
#壁纸更换的时间间隔(默认 30 分钟)
ChangeTime="30m"

WeatherCN=("晴" "多云" "阴" "雨" "雷阵雨" "雾" "雪" "雨夹雪")
WeatherEN=("sun" "suncloud" "cloud" "rain" "storm" "fog" "snow" "snowrain")

GET_WEATHER() {
	[ -z "${Wid}" ] && 
	if [ -f "/dev/shm/city" ] ;then
		Wid="$(cat /dev/shm/city)"
	else
		Wid="`wget -q -O - 'http://www.265.com/lookupcity'|awk -F "'" '{print $2}'`"
		echo ${Wid}>/dev/shm/city
	fi
	[ ! -z "${Wid}" ] && WeatherTxt="`w3m -dump "http://wap.weather.com.cn/wap/${Wid}/h24.shtml"`"
	
}

GEN_DRAW_TEXT() {
	[ -z "${WeatherTxt}" ] && GET_WEATHER
	if [ -z "${WeatherTxt}" ]; then
		echo "未能获取天气 :("
	else
		echo "${WeatherTxt}"|sed -n "5p"|sed 's/ .*$//'
		echo "${WeatherTxt}"|sed -n "6,10p"
	fi \
	|sed "s/^.*$/-draw \'text POSITION \"&\"\'/" \
	|while read line; do 
		echo "$line"|sed "s/POSITION/$TxtPosX,$TxtPosY/"
		((TxtPosY+=$TxtYIncr))
	done|tr "n" " "
}

GEN_WEATHER_ICON() {
	local tmp weathercn index 
	[ -z "${WeatherTxt}" ] && GET_WEATHER
	[ -z "${WeatherTxt}" ] || tmp="`echo "${WeatherTxt}"|sed -n "6p"`"
	j=0; k=0
	for i in ${WeatherCN[@]}; do
		[ "${tmp//$i}" != "$tmp" ] && weathercn[$j]="$i" && index[$j]="$k" && ((j++))
		((k++))
	done
	[ "${#weathercn[@]}" -eq 0 ] && Weather[0]="unknown"
	[ "${#weathercn[@]}" -eq 1 ] && Weather[0]="${WeatherEN[${index[0]}]}"
	[ "${#weathercn[@]}" -eq 2 ] && 
	if [ "`echo $tmp|grep "${weathercn[0]}转"`" ];then
		Weather[0]="${WeatherEN[${index[0]}]}"
		Weather[1]="${WeatherEN[${index[1]}]}"
	else
		Weather[0]="${WeatherEN[${index[1]}]}"
		Weather[1]="${WeatherEN[${index[0]}]}"
	fi
	[ "${#weathercn[@]}" -eq 3 ] && 
	{
		Weather[0]="${WeatherEN[${index[0]}]}"
		Weather[1]="${WeatherEN[${index[2]}]}"
	}
	if [ "${#Weather[@]}" -ge 2 ]; then
	   convert +append "$Icondir/${Weather[0]}.png" "$Icondir/${Weather[1]}.png" /dev/shm/weathericon.png
	else
	   ln -sf "$Icondir/${Weather[0]}.png" /dev/shm/weathericon.png
	fi
}

GEN_WALLPAPWE() {
	GEN_WEATHER_ICON
	[ -f $BackPic ] || BackPic="$Icondir/background.jpg"
	if [ "$DrawText" = "yes" ]; then
		draw="convert -font \"$Font\" -fill $TxtColor -pointsize $FontSize `GEN_DRAW_TEXT` \"$BackPic\" \"/dev/shm/backpictmp.png\""
		eval $draw
		composite -geometry "$PicGeometry" /dev/shm/weathericon.png /dev/shm/backpictmp.png "$OutPic"
	else
		composite -geometry "$PicGeometry" /dev/shm/weathericon.png "$BackPic" "$OutPic"	
	fi
}

while :; do
	GET_WEATHER
	[ "${WeatherTxt}" != "$tmp" ] && GEN_WALLPAPWE && tmp="${WeatherTxt}"
	if [ -f "$OutPic" ];then
		mv "$OutPic" "$Wallpaper"
		gconftool-2 -s /desktop/gnome/background/picture_filename --type=string "$Wallpaper"
	fi
	sleep "$ChangeTime"
done

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-11 23:05
adagio
杀花!
LZ吃了吧?
你的脚本太棒了,那个scrot截图爽死了,你还有啥更H的脚本我瞅瞅?
谢谢喔……
:em01

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-11 23:16
HuntXu
支持个~

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-11 23:18
xiooli
我很郁闷,俺用kde,写了这个脚本自己却不能用。。。 :em19

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-11 23:25
photor
先顶后用 :em09

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-11 23:30
xiooli
adagio 写了:杀花!
LZ吃了吧?
你的脚本太棒了,那个scrot截图爽死了,你还有啥更H的脚本我瞅瞅?
谢谢喔……
:em01
汗,我又不是卖摇头丸的,你爽个啥。。更爽的脚本去找阿姨要 :em06

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-11 23:34
hcym
xiooli 写了:我很郁闷,俺用kde,写了这个脚本自己却不能用。。。 :em19
知识和品味没关系撒

:em04

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-12 8:54
xiooli
hcym 写了:
xiooli 写了:我很郁闷,俺用kde,写了这个脚本自己却不能用。。。 :em19
知识和品味没关系撒

:em04
恩恩,看来得添加一个kde也能用的代码了。

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-12 9:02
eexpress
居然是复合图片,还这么长。下次写脚本前,先遵循下意见哦。
:em04

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-12 9:09
rainstone
不错,回去试试

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-12 9:10
xiooli
eexpress 写了:居然是复合图片,还这么长。下次写脚本前,先遵循下意见哦。
:em04
阿姨可有何好建议?

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-12 9:21
guiwen1158
photor 写了:先顶后用 :em09

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-12 9:37
momova
guiwen1158 写了:
photor 写了:先顶后用 :em09

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-12 10:22
eexpress
这样的事情,应该写一个最简单的窗口,只带一个Image 一个Label(反正都支持pango语法)。贴到桌面。而不是复合图片。和notify的结构差不多。用perl或者C。或者抄iDesk的源码,很小的一段。相当于作一个通用的桌面显示工具
C/C++的,你可以找斗篷男作。
perl的,类似这样的,很简单。改改就是。

代码: 全选

#my $image = Gtk2::Image->new_from_stock('gtk-dialog-authentication', 'dialog');
my $image = Gtk2::Image->new_from_file('/home/exp/媒体/d.png');
$image->show;
#$hbox->pack_start($image, FALSE, FALSE, 0);
$hbox->pack_start_defaults($image);

my $label = Gtk2::Label->new;
#$label->set_markup( "正在下载 <span size=\"large\" color=\"red\" weight=\"bold\">". $ARGV[0]. "</span>" );
$label->set_markup( $ARGV[0] );
$label->show;
#$hbox->pack_start($label, TRUE, TRUE, 0);
$hbox->pack_start_defaults($label);

Re: 天气墙纸脚本:wallther

发表于 : 2009-05-24 2:25
linuxleio
不错,很 好 很强大,研究下思路