Shell指令碼實現自動從網路更換桌面背景(二)
如果你混跡過ArchLinux的貼吧,應該會對各種狂拽炫酷吊炸天的桌面曬到飛起的景象感到震精!我也曾痴迷過配置各種widgets,dock,硬要配置的同樣狂拽炫酷然後滿足的發一貼。不過很快這種快感就會隨風遠去,自嗨過後剩下的是猶如老司機狂飆兩圈秋名山之後的寂寞,一如知乎上面的Arch黨,真是寂寞如雪啊。
配置那些花哨的widgets是無聊的,相信我。而且部分還有記憶體洩露的bug,導致你桌面越來越卡。另外,在桌面上擺放widget,總覺得挺彆扭,特別是如果我告訴你widget就是邊框透明掉的異形視窗,你會不會強迫症病發。一大堆沒有關閉且使用頻率不高的軟體視窗要擺在桌面上,那不是逼死強迫症嗎?
換一個思路,我們把widget的內容列印進桌面背景。
上一篇我們已經實現了從網路上自動下載桌面,那麼接下來讓我們對這張圖片“印上widget”吧,也好讓單調的桌布迸發生機!正如你們看到的,我打算把天氣和日期加進來。
在急於寫程式碼之前,分析一下可能碰到的技術難點。如何在圖片上面寫字?如何在圖片上面繪圖?如何獲取天氣日期資訊?
在圖片上面寫字繪圖,Linux有一個強大的批處理影象工具集合,大名鼎鼎的“imagemagick”。多數發行版都預裝了這個工具集。不妨拿我們下載的桌布試試手。
$>convert paper。jpg -resize 1920x -pointsize 60 -font Dejavu-Serif -draw “text 220,300 ‘hello world’” test。jpg
paper。jpg是源圖片,resize是修改解析度,1920寬,省略高(如果不省略高就是1920x1080,不過由於採用的是等比壓縮,你不太可能同時滿足高和寬,所以通常指定其一),pointsize為畫筆的尺寸,font為字型,draw開始繪製,draw的引數text代表文字,還可以是圖形比如rectangle,eclipse之類。接著,我們和繪製一個矩形,然後在上面寫上天氣和日期文字。
$>convert paper。jpg -resize 1980x -fill skyblue \
-pointsize 60 -font 文泉驛等寬正黑 \
-draw “fill-opacity 0。65 roundrectangle 180,150 650,550 10,10” \
-fill white -draw “text 200,220 ‘19℃ /晴’” \
-pointsize 40 -draw “text 220,300 ‘Fri March’” dest。jpg
我就先獻醜啦,我調了半天引數也就只能實現到這種地步啦。這裡新出現了幾個引數,比如fill填充顏色,然後draw了一個圓角矩形,引數分別是矩形左上點座標a(x,y),右下點座標b(x,y)以及圓角弧度f,f,另外這個矩形的fill-opacity代表透明度,取值0~1。
好!接下來的工作就是獲取天氣和日期了。先說日期,這個簡單,日期工具是date,如果你不熟悉它的用法,只需要記住它最常用的用法就是格式化輸出
$>date “+%format”
就可以了,具體有哪些format,可以直接man date一下(問男人)!在此我要取的日期是英文縮寫的weekday和全寫的月份用一個空格隔開。
$>date “+%a %B”
五 三月
結果是中文的,這特麼就尷尬了,這不就瞬間拉低逼格了嗎?強迫症表示不能忍。這是因為我們的Locale環境被設定成zh_CN。UTF-8了,我們可以看一下LC_ALL或者LANG環境變數值
$>echo LC_ALL=$LC_ALL LANG=$LANG
LC_ALL= LANG=zh_CN。UTF-8
也許你的情況與我略有區別,但如果你也出現了中文說明這兩個變數至少有一個是zh_CN。UTF-8。如果要顯示出英文,只需要改變成en_US。UTF-8就可以了,但是我又不想把整個終端的環境變數影響掉,只想單純的影響這一句,如何做?env命令就是解決這個場景的,env設定臨時環境變數,程式執行完畢,設定的一切變數就都消失了。
$>env LC_ALL=en_US。UTF-8 date “+%a %B”
Fri March
很強勢!
獲取天氣呢,為了簡單省事,直接爬百度“天氣”關鍵詞的搜尋頁 ,用上一篇文章介紹的方法,依舊是分析文字。
不難發現,我們需要的溫度和狀況對應的在class=“op_weather4_twoicon_shishi_title”的span標籤裡面和op_weather4_twoicon_shishi_sub的i標籤裡面。那麼利用上一篇文章演示過的手法,如法炮製一番……
先是溫度
$>curl -s www。baidu。com/s\?wd\=%E5%A4%A9%E6%B0%94 |\
grep -oP “twoicon_shishi_title\”>[^<]*?<“
op_weather4_twoicon_shishi_title”>10<
可以看到我們只需要那個“10”,所以再這個基礎上還得繼續過濾一次
$>curl -s www。baidu。com/s\?wd\=%E5%A4%A9%E6%B0%94 |\
grep -oP “twoicon_shishi_title\”>[^<]*?<“ |\
grep -oP ”\d+“
10
最後是獲取天氣狀態描述
$>curl -s www。baidu。com/s\?wd\=%E5%A4%A9%E6%B0%94 |\
grep -oP ”twoicon_shishi_sub\“>[^<]*?<” |\
grep -oE “>([^<])*\(”
>多雲(
這個“>多雲(”,前後各帶了我們用不著的字元,沒關係,一會在腳本里面可以擷取字串給處理掉。現在我們遇到的所有技術難題都得到了攻關,可以正式開始寫就程式碼了。仍然是編輯changewallpapaer。sh這個指令碼,再搞一個函式叫widgify好了。
function
widgify
{
local
weatherbody
=
`
curl -s www。baidu。com/s?wd
=
天氣
`
local
temp
=
$(
echo
$weatherbody
\
|
grep -oP
“twoicon_shishi_title\”>[^<]*?<“
\
|
grep -oP
”\d+“
)
local
status
=
$(
echo
$weatherbody
\
|
grep -oP
”twoicon_shishi_sub\“>[^<]*?<”
\
|
grep -oE
“>([^<])*\(”
)
local
status
=
${
status
:
1
:-
1
}
#擷取字串,從第1到倒數第1個位元組
debug
temp
=
$temp
status
=
$status
#開始合圖 如果你不知道自己計算機裡面有哪些字型
#使用convert -list font檢視並選擇一個字型
convert paper。jpg
\
-resize 1980x
\
-fill skyblue
\
-pointsize
60
\
-font 文泉驛等寬正黑
\
-draw
“fill-opacity 0。6 roundrectangle 180,150 650,550 10,10”
\
-fill white
\
-draw
“text 200,220 ‘
$temp
℃ /
$status
’”
\
-pointsize
40
\
-draw
“text 220,300 ‘`env LC_ALL=en_US。UTF-8 date ”
+%a %B
“`’”
dest。jpg
#把修改桌布的語句從downpaper函式挪過來!記住圖片名字換成合成圖dest而非papaer
pcmanfm -w
`
pwd
`
/dest。jpg
}
#最後修改main函式,新增widgify的呼叫!
downpaper
widgify
最後看看效果吧!
很強勢吧?!
本期程式碼已更新至我的github : nikoloss/linuxstuff