天气预报DIY

各种窗口管理器和美化相关
wenbob
帖子: 21
注册时间: 2008-02-25 11:21

天气预报DIY

#1

帖子 wenbob » 2008-11-05 12:04

感谢 xiooli 的265网站代码,我又做了修改,现在的代码不再使用临时文件,而且可以自动获取自己城市的代码了(有误差,估计是用纯真ip库推算的)

[color=#FF0000天气网的WAP页面偶尔会出现问题,因此本帖的脚本有时失效,我在12楼补充了一个新脚本,适应更好一些。[/color]

Screenlets里面自带的天气预报插件不好用,很多城市都没有,于是自己动手做了一个简单的。

首先就是要启动output插件。这个插件的作用是定时的执行一个命令,并把结果显示出来。可以设置命令、显示的宽度和高度等,刚好适合DIY。

然后就是得准备一个能够显示天气的脚本了。代码如下

代码: 全选

#!/bin/bash

# weather script
#Copyright (c) 2008 wenbob (wenbob[at]gmail.com)
#License: GPLv3
#version 20081109

# disable cwcolor
export NOCOLOR=1

get_weather()
{
    url="http://wap.weather.com.cn/wap/$1/h$2/"
    # wget -e "http_proxy=http://user:passwd@192.168.0.1:8080" -O $city.txt $url
    # Select useful part, Remove HTML tags, Cut verbose words
    LINES=`wget -q -O - $url| sed '1,/顶部LOGO区结束/d;/48小时天气预报/,1000d;' | sed 's/<[^>]*>//g;/<!--/d' \
    | sed 's/&nbsp;//g;s/&deg;C//g;s/^\s*//g;/^$/d' \
    | sed '11,$d;' \
    | sed 's/天气//g;s/气温//g;s/风向风力//g;s/://g;s/指数//g;s/ //g;'`
    # Format file content
    MES=`echo "$LINES"| sed -n '4p' | tr -d '\r\n'`,
    MES=$MES`echo "$LINES"| sed -n '5p' | tr -d '\r\n'`,
    MES=$MES`echo "$LINES"| sed -n '6p' | tr -d '\r\n'`,
    MES=$MES`echo "$LINES"| sed -n '7p' | tr -d '\r\n'`,
    MES=$MES`echo "$LINES"| sed -n '8p' | tr -d '\r\n'`
    echo "$MES"
}

get_my_city()
{
  CITY=`wget -q -O - http://www.265.com/lookupcity | sed "s/window.www265com.SetCity('//g;s/')//g;s/;//g"`
}

# 以下是自动获取自己城市的例子
get_my_city
date "+襄樊 %F %A"
echo -n "今天: "
get_weather $CITY 24
echo -n "明天: "
get_weather $CITY 48
echo -n "后天: "
get_weather $CITY 72

# 以下是指定城市代码的例子
CITY=59488
date "+珠海 %F %A"
get_weather $CITY 24
echo -n "明天: "
get_weather $CITY 48
echo -n "后天: "
get_weather $CITY 72
把代码保存为weather.sh,然后添加执行权限:

代码: 全选

chmod a+x weather.sh
最后设定output插件,默认的命令是dmesg,改成weather.sh的完整路径名,再把刷新时间改大一些,比如一个小时(3600秒),调整一下宽高度,就可以了。

注意:
各位要根据自己的需要,把脚本里面的城市代换成自己的。如果不清楚自己的城市代码,可以去http://www.265.com看看。
附件
天气插件显示效果
天气插件显示效果
上次由 wenbob 在 2008-11-09 18:20,总共编辑 12 次。
feixuedewo
帖子: 3
注册时间: 2008-11-05 12:15

Re: DIY一个自己的screenlets天气预报插件

#2

帖子 feixuedewo » 2008-11-05 12:16

不错,研究中~!
:em01
lurenjia
帖子: 1
注册时间: 2008-11-05 12:19

Re: DIY一个自己的screenlets天气预报插件

#3

帖子 lurenjia » 2008-11-05 12:22

:em38
很好 很强大
:em37
港谢谢 你很牛 很风骚
ztttly
帖子: 7
注册时间: 2008-06-21 14:56

Re: DIY一个自己的screenlets天气预报插件

#4

帖子 ztttly » 2008-11-05 12:57

还没diy出来,不过先顶一个。预言:本帖将会很火,预先占个座! :em04 :em04
Sanptzx
帖子: 1
注册时间: 2008-09-28 15:11

Re: DIY一个自己的screenlets天气预报插件

#5

帖子 Sanptzx » 2008-11-05 16:01

不错的说``支持一把``
feixuedewo
帖子: 3
注册时间: 2008-11-05 12:15

Re: DIY一个自己的screenlets天气预报插件

#6

帖子 feixuedewo » 2008-11-05 20:16

继续关注中~!
:em03
头像
windkoo
帖子: 50
注册时间: 2006-04-19 10:48
来自: 成都
联系:

Re: 天气预报DIY

#7

帖子 windkoo » 2008-11-06 21:49

很是不错的
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: 天气预报DIY

#8

帖子 xiooli » 2008-11-06 23:06

代码: 全选

#!/bin/bash
#Copyright (c) 2008 xiooli (xioooli[at]yahoo.com.cn) 
#License: GPLv3
#version 20081106

#城市代码,留空可自动检测(自动检测不一定精确),城市代码可在 http://weather.265.com 上查询,是个5位的数字
#受bones7456及wenbob的天气脚本启发,并经修饰以适应conky的显示。
#加上参数-n输出城市名称
#wid=56294
[ -z ${wid} ] && \
if [ -f "/tmp/city" ] ;then
	wid="$(cat /tmp/city)"
else
	wget -q -O /tmp/weather.html 'http://www.265.com/lookupcity';
	wid=`awk -F "'" '{print $2}' /tmp/weather.html`;
    echo ${wid}>/tmp/city;
fi
get_weather() {
    wget -q -O /tmp/weather.html "http://wap.weather.com.cn/wap/${wid}/h24/";
    w3m -dump /tmp/weather.html |sed -n "5,9p"
}

if [ "$1" = "-n" ];then
    if [ -f /tmp/city_name ];then
        cat /tmp/city_name
    else
        w3m -dump /tmp/weather.html |sed -n "4p"|sed 's/\ .*$//'|tee /tmp/city_name
    fi
else
    get_weather
fi
头像
xiooli
帖子: 6956
注册时间: 2007-11-19 21:51
来自: 成都
联系:

Re: 天气预报DIY

#9

帖子 xiooli » 2008-11-07 20:57

貌似那个网站坏了,今天一下午我的conky上都没有天气预报,唉 :em19
头像
linlee
帖子: 1132
注册时间: 2007-10-20 11:30

Re: 天气预报DIY

#10

帖子 linlee » 2008-11-07 22:15

mark~~
up~~
头像
xyy_xx
帖子: 344
注册时间: 2008-09-17 13:37
系统: arch|centos

Re: 天气预报DIY

#11

帖子 xyy_xx » 2008-11-07 22:41

powers of scripts
mark it:em11
拥有书籍并不表示拥有知识;拥有知识并不表示拥有技能;拥有技能并不表示拥有文化;拥有文化并不表示拥有智慧
渣浪:@CodewalkerDotMe
推特:@codewalkertse
博客:http://codewalker.me/
wenbob
帖子: 21
注册时间: 2008-02-25 11:21

Re: 天气预报DIY

#12

帖子 wenbob » 2008-11-08 4:59

我又做根据现在的网页做了一个更全面的天气预报脚本,同样是不写临时文件,每次查天气会从两个网页中取数据,一个html的,一个json的,速度还比较快。因为天气网不停的改,可能过几天得调整一下。

输出效果如下

代码: 全选

$ ./weatherx.sh 
襄樊 2008-11-09 星期日目前天气: 14.3℃,东北风4级(5.8m/s),湿度:69%
晾晒适宜,晨练不宜,感冒较易发,中暑无,交通良好,路况干燥,旅游适宜,划船适宜
感觉舒适,洗车适宜,紫外线中等,钓鱼适宜,空调较少开启,运动较不宜,穿衣温凉,化妆保湿
9日星期日: 晴,17度到7度,微风
10日星期一: 晴,17度到8度,西南风小于3级转东南风小于3级
11日星期二: 多云,18度到8度,东南风小于3级
似乎screenlets的output插件不能支持复杂一点的脚本,可能与输出长度或者栈有关吧,原因待查。这个脚本用于显示更详细的预报信息。前面的脚本内容简短,更适合屏幕插件。结合命令行飞信程序,每天定时运行一次,就成了免费的短信提示了 :em09

代码: 全选

#!/bin/bash

#Copyright (c) 2008 wenbob (wenbob[at]gmail.com)
#License: GPLv3
#version 20081110

# 地区名及其地区代码,可在 http://www.weather.com.cn 查询,从地址栏找到自己所在地区代码
CITY=襄樊
CODE=101200201

# disable cwcolor
export NOCOLOR=1


get_current_data()
{
    # Now
    url="http://www.weather.com.cn/data/sk/$CODE.html"
    # wget -e "http_proxy=http://user:passwd@192.168.0.1:8080" -O - $url
    LINES=`wget -q -O - $url | tr ',"{}:' ' '`
    # Format file content
    TEMP=`echo "$LINES" | awk '1{print $7}'`℃
    WIND=`echo "$LINES" | awk '1{print $9$11 }'`"("`echo "$LINES" | awk '1{print $20}'`"m/s)"
    SD=`echo "$LINES" | awk '1{print $13}'`
    NOW="$TEMP,$WIND,湿度:$SD"
    echo "$NOW"
}

get_fut_data()
{
    THREEDAYS=`echo "$LINES" | sed '1,/fut_weather/d;/scene_weather/,1000d'`
    if [ -z $THREEDAYS ]
    then
        THREEDAYS=`echo "$LINES" | sed '/c_1_2/,1000d'`
    fi

    THREEDAYS=`echo "$THREEDAYS" | sed 's/<br/\n</g;\
s/\/d00.gif/>白天晴</g;\
s/\/d01.gif/>白天多云</g;\
s/\/d02.gif/>白天阴天</g;\
s/\/d03.gif/>白天多云有零星小雨</g;\
s/\/d04.gif/>白天雷雨</g;\
s/\/d05.gif/>白天雷阵雨</g;\
s/\/d06.gif/>白天小雨夹雪</g;\
s/\/d07.gif/>白天零星小雨</g;\
s/\/d08.gif/>白天小雨</g;\
s/\/d09.gif/>白天中雨</g;\
s/\/d10.gif/>白天大雨</g;\
s/\/d11.gif/>白天暴雨</g;\
s/\/d12.gif/>白天特大暴雨</g;\
s/\/d13.gif/>白天多云转小雪</g;\
s/\/d14.gif/>白天小雪</g;\
s/\/d15.gif/>白天中雪</g;\
s/\/d16.gif/>白天大雪</g;\
s/\/d17.gif/>白天暴雪</g;\
s/\/d18.gif/>白天雾</g;\
s/\/d19.gif/>白天冰雹</g;\
s/\/d20.gif/>白天沙尘暴</g;\
s/\/d21.gif/>白天小雨</g;\
s/\/d22.gif/>白天中雨</g;\
s/\/d23.gif/>白天大雨</g;\
s/\/d24.gif/>白天暴雨</g;\
s/\/d25.gif/>白天特大暴雨</g;\
s/\/d26.gif/>白天中雪</g;\
s/\/d27.gif/>白天大雪</g;\
s/\/d28.gif/>白天暴雪</g;\
s/\/d29.gif/>白天浮尘</g;\
s/\/d30.gif/>白天扬沙</g;\
s/\/d31.gif/>白天强沙尘暴</g;\
s/\/n00.gif/>,夜晚晴</g;\
s/\/n01.gif/>,夜晚多云</g;\
s/\/n02.gif/>,夜晚阴天</g;\
s/\/n03.gif/>,夜晚多云有零星小雨</g;\
s/\/n04.gif/>,夜晚雷雨</g;\
s/\/n05.gif/>,夜晚雷阵雨</g;\
s/\/n06.gif/>,夜晚小雨夹雪</g;\
s/\/n07.gif/>,夜晚零星小雨</g;\
s/\/n08.gif/>,夜晚小雨</g;\
s/\/n09.gif/>,夜晚中雨</g;\
s/\/n10.gif/>,夜晚大雨</g;\
s/\/n11.gif/>,夜晚暴雨</g;\
s/\/n12.gif/>,夜晚特大暴雨</g;\
s/\/n13.gif/>,夜晚多云转小雪</g;\
s/\/n14.gif/>,夜晚小雪</g;\
s/\/n15.gif/>,夜晚中雪</g;\
s/\/n16.gif/>,夜晚大雪</g;\
s/\/n17.gif/>,夜晚暴雪</g;\
s/\/n18.gif/>,夜晚雾</g;\
s/\/n19.gif/>,夜晚冰雹</g;\
s/\/n20.gif/>,夜晚沙尘暴</g;\
s/\/n21.gif/>,夜晚小雨</g;\
s/\/n22.gif/>,夜晚中雨</g;\
s/\/n23.gif/>,夜晚大雨</g;\
s/\/n24.gif/>,夜晚暴雨</g;\
s/\/n25.gif/>,夜晚特大暴雨</g;\
s/\/n26.gif/>,夜晚中雪</g;\
s/\/n27.gif/>,夜晚大雪</g;\
s/\/n28.gif/>,夜晚暴雪</g;\
s/\/n29.gif/>,夜晚浮尘</g;\
s/\/n30.gif/>,夜晚扬沙</g;\
s/\/n31.gif/>,夜晚强沙尘暴</g;\
'`

    THREEDAYS=`echo "$THREEDAYS" | sed 's/<[^>]*>//g;/<!--/d'  | sed 's/&nbsp;//g;s/&deg;C//g;s/^\s*//g;/^$/d;s/高温//g;s/低温//g;s/℃/度/g;s/://g'`

    DAY1="`echo "$THREEDAYS"| sed -n '1p' | tr -d '\r\n'`: \
`echo "$THREEDAYS"| sed -n '3p' | tr -d '\r\n'`,\
`echo "$THREEDAYS"| sed -n '4p' | tr -d '\r\n'`到\
`echo "$THREEDAYS"| sed -n '5p' | tr -d '\r\n'`,\
`echo "$THREEDAYS"| sed -n '6p' | tr -d '\r\n'`"

    DAY2="`echo "$THREEDAYS"| sed -n '7p' | tr -d '\r\n'`: \
`echo "$THREEDAYS"| sed -n '9p' | tr -d '\r\n'`,\
`echo "$THREEDAYS"| sed -n '10p' | tr -d '\r\n'`到\
`echo "$THREEDAYS"| sed -n '11p' | tr -d '\r\n'`,\
`echo "$THREEDAYS"| sed -n '12p' | tr -d '\r\n'`"


    DAY3="`echo "$THREEDAYS"| sed -n '13p' | tr -d '\r\n'`: \
`echo "$THREEDAYS"| sed -n '15p' | tr -d '\r\n'`,\
`echo "$THREEDAYS"| sed -n '16p' | tr -d '\r\n'`到\
`echo "$THREEDAYS"| sed -n '17p' | tr -d '\r\n'`,\
`echo "$THREEDAYS"| sed -n '18p' | tr -d '\r\n'`"

     unset THREEDAYS

    echo "$DAY1"
    echo "$DAY2"
    echo "$DAY3"
}

get_today()
{
    TODAY=`echo "$LINES" | sed '1,/c_1_2/d;/box_hist/,1000d;s/<br/\n</g'`
    TODAY=`echo "$TODAY" | sed 's/<[^>]*>//g;/<!--/d'  | sed 's/&nbsp;//g;s/&deg;C//g;s/^\s*//g;/^$/d;s/指数://g;s/://g'`
    TODAY="`echo "$TODAY"| sed -n '1p' | tr -d '\r\n'`,\
`echo "$TODAY"| sed -n '3p' | tr -d '\r\n'`,\
`echo "$TODAY"| sed -n '5p' | tr -d '\r\n'`,\
`echo "$TODAY"| sed -n '7p' | tr -d '\r\n'`,\
`echo "$TODAY"| sed -n '9p' | tr -d '\r\n'`,\
`echo "$TODAY"| sed -n '11p' | tr -d '\r\n'`,\
`echo "$TODAY"| sed -n '13p' | tr -d '\r\n'`,\
`echo "$TODAY"| sed -n '15p' | tr -d '\r\n'`"
    echo "$TODAY"
    unset TODAY

    LIFE=`echo "$LINES" | sed '1,/box_lifeboxin/d;/right_content/,1000d;s/<br/\n</g'`
    LIFE=`echo "$LIFE" | sed 's/<[^>]*>//g;/<!--/d'  | sed 's/&nbsp;//g;s/&deg;C//g;s/^\s*//g;/^$/d;s/指数://g;s/舒适度/感觉/g;s/紫外线强度/紫外线/g;s/空调开启/空调/g;s/>//g;s/://g'`
LIFE="`echo "$LIFE"| sed -n '1p' | tr -d '\r\n'`,\
`echo "$LIFE"| sed -n '3p' | tr -d '\r\n'`,\
`echo "$LIFE"| sed -n '5p' | tr -d '\r\n'`,\
`echo "$LIFE"| sed -n '7p' | tr -d '\r\n'`,\
`echo "$LIFE"| sed -n '9p' | tr -d '\r\n'`,\
`echo "$LIFE"| sed -n '11p' | tr -d '\r\n'`,\
`echo "$LIFE"| sed -n '13p' | tr -d '\r\n'`,\
`echo "$LIFE"| sed -n '15p' | tr -d '\r\n'`"
    echo "$LIFE"
    unset LIFE
}

get_weather()
{
    get_current_data

    url="http://www.weather.com.cn/html/weather/$1.shtml"
    LINES=`wget -q -O - $url | sed '1,/c_1_1/d;/right_content/,1000d'`

    get_today
    get_fut_data
    unset LINES
}


date "+$CITY %F %A 天气实况: " | tr -d "\n"
get_weather $CODE

# 还可在这里加上其他城市的天气预报,如
# echo 珠海
# get_weather 101280701
guoqingray
帖子: 81
注册时间: 2008-11-30 14:52

Re: 天气预报DIY

#13

帖子 guoqingray » 2008-12-08 8:32

顶 !!! 很强。
jikeru
帖子: 15
注册时间: 2008-10-09 0:20

Re: 天气预报DIY

#14

帖子 jikeru » 2008-12-08 12:59

很好很强大
头像
hecy2006
帖子: 309
注册时间: 2008-09-11 0:33
来自: 中国地球
联系:

Re: 天气预报DIY

#15

帖子 hecy2006 » 2008-12-09 8:57

做个记号,~~~
很强大~~
我的记忆里只有未来没有过去
回复