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

sh/bash/dash/ksh/zsh等Shell脚本
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

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

#1

帖子 xiooli » 2009-05-11 23:02

详情请见 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
附件
wallther.tar.gz
(521.21 KiB) 已下载 205 次
头像
adagio
论坛版主
帖子: 22110
注册时间: 2008-02-17 23:47
来自: 美丽富饶的那啥星球

Re: 天气墙纸脚本:wallther

#2

帖子 adagio » 2009-05-11 23:05

杀花!
LZ吃了吧?
你的脚本太棒了,那个scrot截图爽死了,你还有啥更H的脚本我瞅瞅?
谢谢喔……
:em01
明天就换大三八!
——8核CPU、8G内存、8T硬盘……
8卡交火,80寸大屏放8个……
IPv8的光纤要8条……

---------------------------------------------------------------------------------
[图片版]新手当自强(续)FAQ
[新手进阶]挂载、fstab、调整linux分区
[图片版]E17桌面环境配置手把手
头像
HuntXu
帖子: 5776
注册时间: 2007-09-29 3:09

Re: 天气墙纸脚本:wallther

#3

帖子 HuntXu » 2009-05-11 23:16

支持个~
HUNT Unfortunately No Talent...
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: 天气墙纸脚本:wallther

#4

帖子 xiooli » 2009-05-11 23:18

我很郁闷,俺用kde,写了这个脚本自己却不能用。。。 :em19
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: 天气墙纸脚本:wallther

#6

帖子 xiooli » 2009-05-11 23:30

adagio 写了:杀花!
LZ吃了吧?
你的脚本太棒了,那个scrot截图爽死了,你还有啥更H的脚本我瞅瞅?
谢谢喔……
:em01
汗,我又不是卖摇头丸的,你爽个啥。。更爽的脚本去找阿姨要 :em06
头像
hcym
帖子: 15634
注册时间: 2007-05-06 2:46

Re: 天气墙纸脚本:wallther

#7

帖子 hcym » 2009-05-11 23:34

xiooli 写了:我很郁闷,俺用kde,写了这个脚本自己却不能用。。。 :em19
知识和品味没关系撒

:em04
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: 天气墙纸脚本:wallther

#8

帖子 xiooli » 2009-05-12 8:54

hcym 写了:
xiooli 写了:我很郁闷,俺用kde,写了这个脚本自己却不能用。。。 :em19
知识和品味没关系撒

:em04
恩恩,看来得添加一个kde也能用的代码了。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 天气墙纸脚本:wallther

#9

帖子 eexpress » 2009-05-12 9:02

居然是复合图片,还这么长。下次写脚本前,先遵循下意见哦。
:em04
● 鸣学
头像
rainstone
帖子: 441
注册时间: 2008-09-07 14:21
来自: 长沙

Re: 天气墙纸脚本:wallther

#10

帖子 rainstone » 2009-05-12 9:09

不错,回去试试
  • 8e3817551427c5412c735f5821b6e231f59b336112239bf8f5cb3f383eaa55d7
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: 天气墙纸脚本:wallther

#11

帖子 xiooli » 2009-05-12 9:10

eexpress 写了:居然是复合图片,还这么长。下次写脚本前,先遵循下意见哦。
:em04
阿姨可有何好建议?
头像
guiwen1158
帖子: 1078
注册时间: 2008-05-11 11:10
来自: 深圳
联系:

Re: 天气墙纸脚本:wallther

#12

帖子 guiwen1158 » 2009-05-12 9:21

photor 写了:先顶后用 :em09
头像
momova
帖子: 3381
注册时间: 2007-07-11 21:43
系统: archlinux
来自: 东江边

Re: 天气墙纸脚本:wallther

#13

帖子 momova » 2009-05-12 9:37

guiwen1158 写了:
photor 写了:先顶后用 :em09
我来了,我看见了,我征服了!
求勾搭,不管饭。
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: 天气墙纸脚本:wallther

#14

帖子 eexpress » 2009-05-12 10:22

这样的事情,应该写一个最简单的窗口,只带一个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);
● 鸣学
linuxleio
帖子: 11
注册时间: 2009-05-18 6:47

Re: 天气墙纸脚本:wallther

#15

帖子 linuxleio » 2009-05-24 2:25

不错,很 好 很强大,研究下思路
回复