Jamyy's Weblog

Shell Script: 修改 Atom XML 檔案裡的 Link 內容

by Jamyy on 二月.14, 2014, under Coding

目的: 修改 linuxtoday.com Atom feed 內容, 直接連入來源文章網址
環境: BASH

$ vi ~/bin/regenerate-linuxtoday-feeds.sh

#!/bin/bash

# 設置 shell option: 忽略大小寫
shopt -s nocasematch

# 設置 REGEX 變數, 用以取出 <a href="..."> 裡的 URL
REGEX='(<a\ .*+href=\")([^\"]+)(\">)'

# 設置 AGENT 變數, 供 curl 套用
AGENT="Mozilla/5.0 (Windows NT 6.2; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/32.0.1667.0 Safari/537.36"

cd /dev/shm
true > reallinks.txt

# 取得 Atom feed (XML)
curl "http://feeds.feedburner.com/linuxtoday/linux?format=xml" --silent --user-agent "$AGENT" --output atom.xml

# 取出 link 與 feedburner:origLink 裡的內容, 分別存放在 links1.txt 與 links2.txt
echo "cat //item/link/text()" | xmllint --shell atom.xml | grep http > links1.txt
echo "cat //item/*[local-name()='origLink']/text()" | xmllint --shell atom.xml | grep http > links2.txt

# 取得 linuxtoday.com 網頁的 "Complete Story" 網址
for i in $(cat links2.txt); do
	TEXT=$(curl "$i" --silent --user-agent "$AGENT" | grep "Complete Story")
	[[ $TEXT =~ $REGEX ]] && echo ${BASH_REMATCH[2]} >> reallinks.txt
	sleep 3
done

# 將 XML 取出的網址與 "Complete Story" 網址合併在一起
paste links1.txt reallinks.txt > ok1.txt
paste links2.txt reallinks.txt > ok2.txt

# 以 "Complete Story" 網址取代 XML 檔案裡的網址
cat ok[1-2].txt | while read i; do
	OLD="$(echo $i | awk '{print $1}')"
	NEW="$(echo $i | awk '{print $2}')"
	sed -i -e "s|"$OLD"|"$NEW"|" atom.xml
done

# 把 feed link 替換為自己網站的 URL
OLD="http://www.linuxtoday.com/"
NEW="http://my.web.host/feed/atom.xml"
sed -i -e "s|"$OLD"|"$NEW"|" atom.xml
sed -i -e 's/<atom10.*\/>//' atom.xml

# 將成果寫入目的路徑並刪除暫存檔案
cat atom.xml > /var/www/html/feed/atom.xml
rm -f links[1-2].txt ok[1-2].txt reallinks.txt atom.xml

排程每三十分鐘執行一次
$ chmod +x ~/bin/regenerate-linuxtoday-feeds.sh
$ crontab -e

*/30 * * * * /home/myaccount/bin/regenerate-linuxtoday-feeds.sh

Ref:



:, ,