話說我是個火影迷,所以每到周三的時候,總會為了等火影的更新不停地刷新網(wǎng)頁。后來我還迷上了一部連載小說,每天不定期更新,于是每天就在那里刷呀刷,F(xiàn)5都快爛了。F5爛了沒關(guān)系,程序猿那么忙,怎么可以把寶貴的時間浪費在這種地方 >_< 等到周四再去看火影不就行了么,每隔一兩天看一次小說不就行了么,可是,臣妾做不到啊 T.T
意淫方案為了避免因為幾個連載而日夜煎熬,作為一個能拯救世界的技術(shù)宅,當(dāng)然要做點什么了 >_< 沒錯,讓機(jī)器來自動幫我檢測更新就行啦。所以,我只要寫一個程序,定時讀取連載目錄的內(nèi)容,如果檢測到有更新,可以自動發(fā)一封郵件到我的QQ郵箱提醒我去看連載 Y^o^Y
實現(xiàn)簡述首先是簡化我們的問題,上面提到的解決方案的程序里面,可以分為以下幾個部分:
順便提一下,我最近做php比較多,所以開發(fā)語言就以 PHP 為主咯 ╮(╯_╰)╭
下面只對技術(shù)方案做簡單的說明,畢竟程序做的事情也很簡單,沒有什么很神奇的代碼
定時執(zhí)行 - crontab前段時間剛好租過一臺很矬的玩具級 linux 服務(wù)器,所以我可以讓程序在這臺服務(wù)器上24小時不停地跑。在 Linux 系統(tǒng)里面,定時執(zhí)行通常可以通過 crontab 命令新增一條定時任務(wù)。例如,我要設(shè)置每隔10分鐘執(zhí)行一次,那么 crontab 新增項的格式如下:
*/10 * * * * /path/task.sh讀取連載目錄的內(nèi)容連載目錄是在一個網(wǎng)頁上的,要讀取出目錄的內(nèi)容,還需要再把這個問題分解:
網(wǎng)頁的內(nèi)容一般是是瀏覽器作為客戶端通過 HTTP 協(xié)議從服務(wù)器獲取的。在我們的方案里,我們要寫的程序就需要充當(dāng) HTTP 協(xié)議通信的客戶端來下載網(wǎng)頁的數(shù)據(jù),熟悉 Linux 的你應(yīng)該會想到 curl 命令行工具,這里可以用 PHP 提供的 exec 函數(shù)來執(zhí)行 curl 命令,或者使用 PHP 自帶的 curl 庫。
我使用的是 PHP 的 curl 庫,有興趣可以自行了解。
分析網(wǎng)頁的內(nèi)容 - 正則表達(dá)式下載到的網(wǎng)頁文檔是 html 代碼,以我看的火影忍者為例,http://www.mangapanda.com/93/naruto.html ,(PS:表示看不懂日語而且英文版的更新速度比中文版的快,所以就...)

對于我們來說,連載目錄其實就是 html 文檔中的這部分 href 屬性值為 "/naruto/xxx" 的 <a> 元素了。
只要對下載到的 html 代碼用簡單的模式匹配做文本過濾,就可以得到連載目錄的內(nèi)容了,我覺得你也應(yīng)該想得到,用正則表達(dá)式來做這件事情再適合不過了。以剛才那個網(wǎng)頁為例,可以用下面這行正則表達(dá)式來粗略地過濾出連載目錄:
|href="/naruto/[^"]*"|因為不同的要使用的正則表達(dá)式會不一樣,所以這個正則表達(dá)式應(yīng)該是由用戶配置的。
在 PHP 里面,可以使用 PHP PCRE Functions 中的 PReg_match_all 函數(shù)。
檢測是否有更新這個相對比較簡單,只有有更新,那么連載上當(dāng)?shù)膬?nèi)容就一定會有變化。所以只要把每次讀取到連載目錄和上一次讀取到的連載目錄的內(nèi)容進(jìn)行比較,只要有不同,就認(rèn)定有有更新即可。
至于歷史數(shù)據(jù)的儲存,用一個文件就可以了。我有點小題大作地使用了 MySQL 數(shù)據(jù)庫來做這個事情。
發(fā)郵件 - PHPMailer不熟悉計算機(jī)網(wǎng)絡(luò)的我對郵件協(xié)議了解也是一塌糊涂,經(jīng)過 google 之后,找到了 PHPMailer 庫,參考這個庫提供的 SMTP 的例子即可。
我使用一個 QQ 郵箱來作為發(fā)件人,需要注意的問題是這個 QQ 郵件要開通 SMTP 服務(wù)。
效果演示和代碼下載考慮到對用戶友好以及通用性,所以做了一個簡易的配置頁面,如下圖所示:

收到的提醒郵件的內(nèi)容也很簡單,內(nèi)容為空都可以,不過最好還是附上連載目錄的鏈接。

代碼:https://github.com/roxma/cpp_learn/tree/master/php_learn/apps/series_update_reminder
這里面夾雜著一些個人學(xué)習(xí)過程中積累的和主題無關(guān)的代碼,我相信應(yīng)該不會有人想認(rèn)真看,如果真的很想看,可以從 php_learn/apps/series_update_remindder/check.php 跟進(jìn)去。代碼真的不建議細(xì)看,我覺得最重要的內(nèi)容其實還是“技術(shù)概要”那一節(jié)里面的講到的思路,(好吧代碼太難看你偷偷告訴我就行了不要聲張)
新聞熱點
疑難解答