首先說一下做這個軟件的動機和用途。平時喜歡在cnBeta網站看新聞,但是有時候太忙了,不可能每天都去看,一般兩三天或者四五天去一次,快速掃一下重要的新聞,遇到特別好的文章就收藏起來。唯一不爽的就是超過一天的新聞評論不顯示了,所以一邊學Ruby一邊做了這個軟件。
上一篇博客中使用的方法是在在瀏覽器中使用遠程的代理服務器,然后就可以看到過期的評論。但是網頁打開速度比較慢,圖片加載慢,視頻看不了。現在又用了一個新的方法,而且效果不錯,代理服務器還是在本機運行,網頁文本從遠程服務器獲取,其他的圖片、視頻等則不經過遠程代理,從而達到了一個較好的使用體驗。
代理服務器做成了比較通用的結構,可以掛載對多個網站的處理。
1class Website 2 @@sites = {} 3 attr_accessor :domain, :encoding 4 def initialize(domain, encoding) 5 @domain = domain 6 @encoding = encoding 7 @@sites[domain] = self 8 end 9 10 def self.get_site(domain) 11 @@sites[domain] 12 end 13 14 def self.all_sites 15 @@sites.values 16 end 17end 18 19class << Websites::Cnbeta 20 def need_collect_uri?(uri) 21 false 22 end 23 24 def process_uri(uri, downloader) 25 if match = uri.match(%r{http://www.cnbeta.com/articles/\w+\.htm}) 26 if data = downloader.get("http://116.255.235.62:88/get?url=#{uri}", nil, "ASCII-8BIT") 27 return data, 'text/html', true 28 end 29 end 30 return nil 31 end 32end 33 34server = OfflineProxyServer.new(ServerName: "localhost", Port: 9999) 35server.downloader = WebClient.new 36Signal.trap(:INT){ server.shutdown } 37server.start
相關的代碼已經用OCRA(One-Click Ruby Application)工具打包成了一個exe文件,可以獨立運行。
運行后會在本機啟動一個代理服務,在瀏覽器中把代理服務器設置成localhost:9999,再看新聞時就可以看到過期的評論。
最近在看《Agile Web Development with Rails, 4th Edition》,RoR真的是很強,ActiveRecord的OR Mapping設計的很好,自動生成Scaffolding代碼,使用erb生成HTML,用Sass生成CSS,用CoffeeScript生成Javascript,完全讓人工作在一個更高的層次上。RoR有很多的插件可用,常用的功能都有現成的實現。居然有這么多好用的工具,以前的眼界確實太窄了,有種想把自己的網站用RoR重寫一次的沖動。