分享一个shell脚本,功能是下载当地天气信息,并生成含对应信息的桌面背景图片,把它作为墙纸。
本是我从网上下的,结果不能直接用(提供天气信息的地址我这连不上去),于是我修改了一番,可以用了。
这里把两个(修改前后的)都放上来。
这是我的修改后版本。附件是所用的图片。[code]#!/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的天气脚本启发。
#因为原有的查询地址无效,我就做了修改,使用了www.weather.com.cn。因为天气信息显示情况不同,所以我花了些时间修改sed和awk的语句。
#使用的天气图标仍为原有的,但是背景图片我替换成了我更喜欢的火狐背景
#alickee alick9188#163.com
#许可仍为GPLv3
#10/31/2009
#这儿是城市代码,须自己改,未赋值会自动查询。暂时看来没什么用了。
#由于更换了查询网站,这个代号就用不上了
Wid=54511
#地点拼音
place=beijing
#地点名称,后跟空格(用于匹配)
place_cn="北京 "
#天气图标的位置
Icondir="/home/alickee/Program/shell_script/icons"
#欲用作背景的图片
BackPic="$Icondir/background.jpg"
#最终输出的图片位置
OutPic="/dev/shm/wallpapertmp.png"
#壁纸路径(此为 OutPic 的副本)
Wallpaper="/dev/shm/wallpaper.png"
#是否在图片上绘制文字天气信息,yes/no
DrawText="yes"
#文字的字体,若不是中文字体则中文可能无法正常显示
Font="/usr/share/fonts/zh_CN/TrueType/zysong.ttf"
#文字的大小
FontSize=24
#文字的颜色
TxtColor="white"
#文字信息绘制的位置
TxtPosX=700
TxtPosY=350
#隔多大距离绘制下一行(此距离包括本行的宽度)
TxtYIncr=35
#天气图标绘制的位置
PicGeometry="+650+75"
#壁纸更换的时间间隔(默认 30 分钟)
ChangeTime="30m"
WeatherCN=("晴" "多云" "阴" "雨" "雷阵雨" "雾" "雪" "雨夹雪")
WeatherEN=("sun" "suncloud" "cloud" "rain" "storm" "fog" "snow" "snowrain")
GET_WEATHER() {
echo "获取天气中"
#将获取天气信息的地址修改了
WeatherTxt="`w3m -dump "http://www.weather.com.cn/${place}/index.shtml" \
| grep "${place_cn}" | head -n 1 `"
}
GEN_DRAW_TEXT() {
[ -z "${WeatherTxt}" ] && GET_WEATHER
if [ -z "${WeatherTxt}" ]; then
echo '未能获取天气 :( '
else
echo "${WeatherTxt}" | sed 's/[ ][ ]*/ /g' | awk '{print $1 " " $2 " " $3 "℃" "\n" $4 "风" $5 "\n降水" $6 " 湿度" $7}'
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}" | awk '{print $2}'`"
j=0; k=0
for i in ${WeatherCN[@]}; do
[ "${tmp//$i}" != "$tmp" ] && weathercn[$j]="$i" && index[$j]="$k" && ((j++))
((k++))
done
# ${#parameter}
# The length in characters of the value of parameter is substi-
# tuted. If parameter is * or @, the value substituted is the
# number of positional parameters. If parameter is an array name
# subscripted by * or @, the value substituted is the number of
# elements in the array.
#调试时输出weathercn数组元素的个数
#echo "weathercn num=" "${#weathercn[@]}"
[ "${#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
#因为生成的图片宽度变为原来的两倍,故再更改下大小
convert -resize 50%x100% /dev/shm/weathericon.png /dev/shm/weathericon.tmp.png
mv /dev/shm/weathericon.tmp.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
echo "站名 天气 气温 风向 风速 降水 湿度"
echo "$WeatherTxt"
GEN_WALLPAPWE
#下面一行显示通知区域小图标
#zenity --notification --window-icon=/usr/share/icons/gnome/48x48/filesystems/gnome-fs-bookmark.png --timeout=30 --text="${WeatherTxt}"
if [ -f "$OutPic" ];then
mv "$OutPic" "$Wallpaper"
#更换桌面背景
gconftool-2 -s /desktop/gnome/background/picture_filename --type=string "$Wallpaper"
fi
sleep "$ChangeTime"
done[/code]
随意多好 于 2012-10-18 09:42:43发表:
好东西啊,顶一个,楼主的严谨作风让人佩服
qxwyp 于 2011-11-28 20:18:16发表:
谢谢!
cmk789 于 2011-11-25 22:39:38发表:
不错的东西。
bogong 于 2010-02-26 16:16:28发表:
下载个东西 也要钱
sunhy1021 于 2009-11-18 15:43:42发表:
好东西!
flamingwolf 于 2009-11-18 11:01:16发表:
楼主的发帖内容和风格,
才是我们真正需要的!
赞一个
finding006 于 2009-11-16 23:52:24发表:
看上去很美^_^
yuchao668 于 2009-11-15 06:05:20发表:
shell 很有意思
sutovs 于 2009-11-01 09:22:46发表:
多谢分享
wangyu 于 2009-11-01 09:04:51发表:
(e:e2s谢谢啊,研究下
alick 于 2009-11-01 00:09:42发表:
这是原来的代码:[code]#!/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=56294
#天气图标的位置
Icondir="`dirname $0`/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"
#文字的大小
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/"`"
}
GEN_DRAW_TEXT() {
[ -z "${WeatherTxt}" ] && GET_WEATHER
if [ -z "${WeatherTxt}" ]; then
echo "未能获取天气 :("
else
echo "${WeatherTxt}"|sed -n "4p"|sed 's/\ .*$//'
echo "${WeatherTxt}"|sed -n "5,9p"
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 "5p"`"
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[/code]