利用指令行指令碼產生指定網站的RSS內容
流行的RSS
隨著各式各樣的部落格越來越紅火,作為特性之一的RSS也為越來越多的人接受和喜愛。
RSS的出現改變了人們從一個網站到另一個網站逐頁尋找自己感興趣的內容的傳統瀏覽方式,
RSS通過可訂製的聚合式內容使人們從網站跳轉中解放出來,更高效快捷的獲取訊息。
這些優勢使得RSS閱讀群不斷的擴大,各大網站看到這種趨勢也紛紛為自己的網頁加入了RSS Feed以供訂閱。
無奈的RSS
但是使用RSS自然會分走一部分網站的瀏覽量,這對於很多網站管理者來說是比較介意的,
所以還是有相當數量的網站持保留態度,暫不提供RSS內容。這對於已經體驗到RSS的好處而相當依賴的人來說不算什麼好事。
既然伸手討不到,那就只有自給自足這一條路了,我們可以利用幾個很簡單的指令行小工具來自動產生RSS。
工具的選項
PHP、ASP這些伺服器指令碼是進階貨,就是太複雜還要組態專門的環境,於是Pass。C++等進階語言門檻更高,於是也Pass。
就只有指令行指令碼易學易用,還不需要專門的執行環境資源佔用也不大,就是它了。
光靠CMD想幹這事兒還是有些困難,還是找幾位幫手來共舉大業吧:
CURL:凡是和網路上傳下載沾邊的找它準沒錯
ICONV:網頁編碼何其多,就靠它來統一格式了
有這兩位幫忙,CMD指令碼便是如虎添翼,能人所不能。
設計的思法
無論什麼軟體都不肯能套用於所有的情況,對於批次處理類的指令碼來說更是如此。往往一個指令碼只能對應一個或一類網站。
所以清晰的思法就異常的重要,有了好的思法就可以反覆套用,所需很少工作量就可以修改適應到其他的網站上。
下面以CCF精品技術論壇為例,嘗試產生新帖子的RSS內容。
獲取頁面
要處理內容首先就得獲取頁面,CURL便是專司此職的。我們只需要下面這個簡單的指令就可以獲取CCF的『軟體使用』子論壇的首頁。
CODE:
curl -b
cookie@et8.txt -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -e "
http://bbs.et8.net/" -o tmp1.txt
http://bbs.et8.net/bbs/forumdisplay.php?f=17^&page=1^&pp=200^&daysprune=-1
[Copy to clipboard]
cookie@et8.txt是IE的Cooke文件,對於論壇等需要的登入的網站很有就靠它提供用戶名密碼。
取得的內容由
CODE:
-o tmp1.txt
[Copy to clipboard]
指定儲存在 tmp1.txt 中。
編碼處理
由於指令行不能很好的處理 unicode。所以需要用 ICONV 把文本轉為 ANSI:
CODE:
iconv -c -f UTF-8 -t GB2312 tmp1.txt >temp.txt
[Copy to clipboard]
這樣我們就將剛才獲取的 tmp1.txt 從 UTF-8 轉為了 GB2312 並另存為 temp.txt。
最後訪問的帖子
既然是訂閱新帖子的RSS,那麼便需要讀取上一次最後列出的帖子,假設我們把上次訪問的帖子的ID儲存在 last.txt 中:
CODE:
for /f "delims=" %%z in (last.txt) do (set last=%%z)
set lastcheck=!last!
[Copy to clipboard]
我們用 last 和 lastcheck 兩個增強環境變數來儲存獲得的ID。
尋找新帖
知道了上次最後訪問的ID,我們就可以通過搜尋 temp.txt 中的首頁前 200 個帖子的ID,以比較的方式篩選出新帖。
同時不要忘了將最新的一篇的ID記錄下來,以便寫入 last.txt 供下次使用。
對於RSS來說,只有題目和位址是不夠的,我們還需要作為摘要的文字,所以我們需要再次使用 CURL 和 ICONV,
獲取新帖的頁面,來做成完整的RSS內容,同時以 echo 到文件的方式新增 XML 格式。
CODE:
for /f "tokens=2-5 delims==<" %%i in ('findstr "showthread.php?s" temp.txt') do (
set tmp=%%l
set post=!tmp:~0,6%!
set title=!tmp:~8!
set flag=0
set first=1
if "%%i"=="a href" if /i !post! GTR !last! if NOT "!post!"=="lastpo" (
if !post! GTR !lastcheck! set lastcheck=!post!
echo.
(echo.^<item^>
echo.^<title^>!title!^</title^>
echo.^<link^>
http://bbs.et8.net/bbs/showthread.php?t=!post!^</link^>
echo.^<description^>
echo.^<[CDATA[) >>tmp.xml
curl -b
cookie@et8.txt -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -e "
http://bbs.et8.net/" -o tmp1.txt
http://bbs.et8.net/bbs/showthread.php?t=!post!
iconv -c -f UTF-8 -t GB2312 tmp1.txt >tmp.txt
for /f "delims=" %%m in (tmp.txt) do (
@echo %%m >tmpl.txt
for /f "tokens=1-2 delims=-" %%n in (tmpl.txt) do (
if "%%o"==" message " set flag=1
if "%%o"==" / message " set first=0
if !first!==1 if !flag!==1 if NOT "%%o"==" message " @echo %%m >>tmp.xml
)
)
echo.
(echo.]]^>
echo.^</description^>
echo.^<pubDate^>^</pubDate^>
echo.^<author^>^</author^>
echo.^</item^>)>>tmp.xml
)
)
@echo !lastcheck! >last.txt
[Copy to clipboard]
通過份析頁面的內容,可以發現主樓的文字是用 <!-- message --> 和 <!-- / message --> 作為開始和結束的標示的。
所以用 flag 和 first 兩個增強環境變數來做雙閘開關,控制文字的輸出。
XML的格式化
最後用一個 for 語句將 tmp.xml 格式化為符合 RSS 2.0。
CODE:
echo.
(echo.^<?xml version="1.0" encoding="GB18030"?^>
echo.^<rss version="2.0"^>
echo.^<channel^>
echo.^<title^>CCF精品技術論壇^</title^>
echo.^<link^>
http://bbs.et8.net/^</link^>
echo.^<description^>CCF ClassiClubForm forum^</description^>
echo.^<language^>zh-cn^</language^>) >rss2.xml
for /f "delims=" %%x in (tmp.xml) do (
if %%x==^<[CDATA[ (
@echo ^<![CDATA[ >>rss2.xml
) else (
@echo %%x >>rss2.xml
)
)
echo.
(echo.^</channel^>
echo.^</rss^>)>>rss2.xml
[Copy to clipboard]
完整的指令碼
CODE:
@echo off
setlocal ENABLEDELAYEDEXPANSION
curl -b
cookie@et8.txt -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -e "
http://bbs.et8.net/" -o tmp1.txt
http://bbs.et8.net/bbs/forumdisplay.php?f=17^&page=1^&pp=200^&daysprune=-1
iconv -c -f UTF-8 -t GB2312 tmp1.txt >temp.txt
for /f "delims=" %%z in (last.txt) do (set last=%%z)
set lastcheck=!last!
for /f "tokens=2-5 delims==<" %%i in ('findstr "showthread.php?s" temp.txt') do (
set tmp=%%l
set post=!tmp:~0,6%!
set title=!tmp:~8!
set flag=0
set first=1
if "%%i"=="a href" if /i !post! GTR !last! if NOT "!post!"=="lastpo" (
if !post! GTR !lastcheck! set lastcheck=!post!
echo.
(echo.^<item^>
echo.^<title^>!title!^</title^>
echo.^<link^>
http://bbs.et8.net/bbs/showthread.php?t=!post!^</link^>
echo.^<description^>
echo.^<[CDATA[) >>tmp.xml
curl -b
cookie@et8.txt -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -e "
http://bbs.et8.net/" -o tmp1.txt
http://bbs.et8.net/bbs/showthread.php?t=!post!
iconv -c -f UTF-8 -t GB2312 tmp1.txt >tmp.txt
for /f "delims=" %%m in (tmp.txt) do (
@echo %%m >tmpl.txt
for /f "tokens=1-2 delims=-" %%n in (tmpl.txt) do (
if "%%o"==" message " set flag=1
if "%%o"==" / message " set first=0
if !first!==1 if !flag!==1 if NOT "%%o"==" message " @echo %%m >>tmp.xml
)
)
echo.
(echo.]]^>
echo.^</description^>
echo.^<pubDate^>^</pubDate^>
echo.^<author^>^</author^>
echo.^</item^>)>>tmp.xml
)
)
@echo !lastcheck! >last.txt
endlocal
echo.
(echo.^<?xml version="1.0" encoding="GB18030"?^>
echo.^<rss version="2.0"^>
echo.^<channel^>
echo.^<title^>CCF精品技術論壇^</title^>
echo.^<link^>
http://bbs.et8.net/^</link^>
echo.^<description^>CCF ClassiClubForm forum^</description^>
echo.^<language^>zh-cn^</language^>) >rss2.xml
for /f "delims=" %%x in (tmp.xml) do (
if %%x==^<[CDATA[ (
@echo ^<![CDATA[ >>rss2.xml
) else (
@echo %%x >>rss2.xml
)
)
echo.
(echo.^</channel^>
echo.^</rss^>)>>rss2.xml
del temp.txt
del tmp1.txt
del tmp.txt
del tmpl.txt
del tmp.xml
[Copy to clipboard]
儲存為et8-rss.cmd即可雙按執行。
RSS的使用
每次想要閱讀之前只要先執行一遍 et8-rss.cmd 就可以更新 RSS 列出新帖。
產生的 rss2.xml 可以增加到 RSS 閱讀器中,比如用 Firefox 的 Sage 增強來閱讀:
本文為chenke_ikari原創,首發於豆腐的簡陋小屋
本文采用Creative Commons 署名-非商業性使用-相同方式共享 2.5 China 許可傳輸協定 進行許可