在 conky 中添加自动显示/更新最新汽油油价

在 conky 中添加自动显示/更新最新汽油油价

2019.9.19

基本条件:系统中已经安装了 conky


命令名称: conky-oil-price-update.sh
版本:0.2

下载地址:
https://sourceforge.net/projects/emacslocale/files/conky-weather/


效果图

操作:

  1. 修改 ~/.conkyrc ,添加以下内容
    #-------------------
    ${hr}
    ${font WenQuanYi Zen Hei Sharp:pixelsize=18}${alignc}[ 油价 ]
    ${exec sed -n ‘1,3p’ $HOME/conky/oil-price.txt}
    ${hr}
    #-------------------

  2. 下载或者编辑一个自动从网站读取油价信息的 bash 脚本。我这里命名为
    ~/sh/conky-oil-price-update.sh

保存,并给出 755 执行权限:
chmod 755 ~/sh/conky-oil-price-update.sh

  1. 上面的 conky-oil-price-update.sh 命令脚本中,默认设置的省份是 湖南。
    湖南以外的其他省份,请把第 27行 的 ZONE_EN 变量,由 hunan, 改成对应省份/直辖市的 汉语拼音。

特别提示:

  1. 油价数据来源: http://youjia.chemcp.com/
  2. 个别省份的拼音写法比较特殊,请参照以下拼音写法:
    shanxi 山西 ; sanxi 陕西
    shanndong 山东 ; xicang 西藏
  3. 目前只支持指定省/直辖市,不能指定到下一级某个城市

  1. 手动运行这个命令一次,看看效果。
    ~/sh/conky-oil-price-update.sh

  2. 修改 crontab 计划任务表,添加一个自动执行油价数据更新的任务。时间设定:
    每天每个小时的第 15分钟更新一次。
    其实,油价数据一般是2个星期才更新一次。如果电脑是一直联网的,可以设置为每天的9:00更新一次就够了。
    这里给出的设置,是考虑到某些情况下,电脑开机时间不确定,或者不是经常联网的情况。

以普通用户运行 crontab -e
添加这样一行:

15 * * * * /home/user/sh/conky-oil-price-update.sh

注:/home/user 即我电脑上的 ~ 目录

附: conky-oil-price-update.sh 脚本内容


#!/bin/bash

coding: utf-8

original filename: conky-oil-price-update.sh

updated by Careone, 2019-9-19

APPNAME=“conky-oil-price-update”
APPVER=“0.2”

oil price source: http://youjia.chemcp.com/hunan/

src_html=mktemp
#src_html="$HOME/conky/youjia_chemcp_com_gb2312.html"

#utf8_html=mktemp
utf8_html="$HOME/conky/oil-price.html"

datafile="$HOME/conky/oil-price.txt"
checksum="$HOME/conky/oil-price.md5"

if [ ! -d “$HOME/conky” ]; then
mkdir -p “$HOME/conky”
fi

declare -a type price
#type=( “89号汽油” “92号汽油” “95号汽油” “98号汽油” “0号柴油” )

TAG 26:

ZONE_EN=“hunan” #hunan, guangdong…
ZONE_CN= #湖南, 广东, 北京, 上海…

_usage () {

cat<<EOF
Usage: $APPNAME [ 省/直辖市的拼音 ]
示例: $APPNAME hunan 获取 [ 湖南 ] 省最新的汽油/柴油价格

特别提示:

  1. 油价数据来源: http://youjia.chemcp.com/
  2. 个别省份的拼音写法比较特殊,请参照以下拼音写法:
    shanxi 山西 ; sanxi 陕西
    shanndong 山东 ; xicang 西藏

Options:
-v, --version 显示版本信息并退出
-h, --help 显示帮助信息并退出

Bugs:
请发送缺陷报告给 Careone <emacslocal^126.com>.

Homepage:
https://sourceforge.net/projects/emacslocale/files/conky-weather/
EOF
}

_notice () {

cat<<EOF
特别提示:

  1. 油价数据来源: http://youjia.chemcp.com/
  2. 个别省份的拼音写法比较特殊,请参照以下拼音写法:
    shanxi 山西 ; sanxi 陕西
    shanndong 山东 ; xicang 西藏
    EOF
    }

for option in “$@”; do

case "$option" in
  -h | --help)
  _usage
  exit 0 ;;


-v | --version)
  echo "  $APPNAME $APPVER"
  exit 0 ;;

	-*)
  echo "Unrecognized option \`$option'" 1>&2
  exit 1 ;;
esac

done

if [ “$#” -ge 1 ]; then
ZONE_EN="$1"
case “$ZONE_EN” in
[a-zA-Z]) ZONE_EN=echo "$ZONE_EN" | tr 'A-Z' 'a-z'
;;
[^a-zA-Z]
| *) echo " 错误 (E35): 无效的地区代码。请使用省/市的拼音" 1>&2
echo " (默认为: hunan 湖南) "
ZONE_EN=“hunan” ;;
esac

fi

BODY

echo " $APPNAME $APPVER"
_notice
echo

echo " * 联网获取油价信息 [ http://youjia.chemcp.com ] …"
echo " ------------------ "
wget -c “http://youjia.chemcp.com/” -O “$src_html”
echo " ------------------ "
echo

#if [ ! -s “$utf8_html” ]; then
if [ ! -e “$utf8_html” ]; then
md5sum “$src_html” > “$checksum”
echo " [ 更新 ] 油价数据 (date --iso) …"
iconv -f gb2312 -t utf8 “$src_html” > “$utf8_html”
sed -i “/charset=gb2312/s//charset=utf8/” “$utf8_html”
else
OLD_MD5=cat "$checksum" | cut -d' ' -f1
NEW_MD5=md5sum "$src_html" | cut -d' ' -f1

if [ “$NEW_MD5” != “$OLD_MD5” ]; then
echo " [ 更新 ]油价数据 (date --iso) …"
iconv -f gb2312 -t utf8 “$src_html” > “$utf8_html”
sed -i “/charset=gb2312/s//charset=utf8/” “$utf8_html”
else
echo " [ 读取 ] 油价数据…"
if [ -e “$utf8_html” ]; then
touch “$utf8_html”
fi
fi
fi

#if [ ! -s “$utf8_html” ]; then

echo " 读取油价数据…"

iconv -f gb2312 -t utf8 “$src_html” > “$utf8_html”

#fi

part 2: 提取油价数据

type=( grep "地区" "$utf8_html" -A5 | sed -n '2,6p' | cut -d'>' -f3 | cut -d'<' -f1 | sed "/号汽油/s//#/g" )
#unset type[0]

if [ -z “$ZONE_EN” ]; then
ZONE_EN=“hunan”
#ZONE_CN=“湖南”
fi

ZONE_CN=grep "http://youjia.chemcp.com/$ZONE_EN/" -A6 "$utf8_html" | head -1 | cut -d'>' -f3 | cut -d'<' -f1

echo " 地区: $ZONE_EN ($ZONE_CN)"

#price=( grep '元/升<' "$utf8_html" | cut -d'>' -f3- | cut -d'<' -f1 | sed "/元../s///" )
price=( grep "http://youjia.chemcp.com/$ZONE_EN/" -A6 "$utf8_html" | sed -n '2,7p' | cut -d'>' -f2 | cut -d'<' -f1 )

TIMESTAMP="${price[5]} ${price[6]}"

unset price[6] price[5]

echo " [$ZONE_CN] $TIMESTAMP 更新" | tee “$datafile”

declare -i MAXID="${#price[@]}"
let “MAXID -= 1”
for a in seq 0 "$MAXID"; do
echo -n " ${type[a]}: ${price[a]}" | tee -a “$datafile”
case “$a” in
[01345789]) echo -en " " | tee -a “$datafile” ;;
[26] | *)echo | tee -a “$datafile” ;;
esac
done
echo
#echo " 油品 type[@]: ${type[@]}"
#echo " $ZONE_CN price[@]: ${price[@]}"