摘要:本文記錄了我嘗試開發(fā)logstash插件的愉(艱)快(辛)過程
背景
有很多大V的微博很有營養(yǎng),比如agenzh的微博有很多關(guān)于技術(shù)方面的和程序員鄒欣有很多關(guān)于軟件工程的,值得反復(fù)玩味。但是微博是按timeline形式排列的,非常不方便非線性查看。agentzh的code2ebook給我啟發(fā),可不可以把感興趣大V的微博做成電子書?
規(guī)劃
首先想到的是寫爬蟲,然后模擬翻頁操作,抓取全部微博。這種方式當(dāng)然行得通,我也很熟練。剛好最近在看ELK,按照鄒欣老師Build To Learn的原則,用ELK來收集分析也挺不錯(cuò)的,順便練練手。logstash定期獲取更新的微博,寫入elasticsearch,除了可以導(dǎo)出生成電子書外,還可以在kibana做可視化分析。例如分析下大V們發(fā)微博的時(shí)間分布來分析下其作息習(xí)慣。根據(jù)詞頻來對(duì)大V進(jìn)行分類,agenzh的openresty詞頻肯定很高。
logstash input plugin
logstash自帶了很多input plugin,比如抓取twitter。但是沒有微博的,想想自己能貢獻(xiàn)一個(gè)微博的plugin還是挺激動(dòng)的。于是開始學(xué)習(xí)怎么寫input plugin。第一反應(yīng)是模仿twitter這個(gè)插件寫,首先使用下面的命令生成一份plugin模板。
bin/logstash-plugin generate --type input --name weibo --path ~/elastic/plugins
得到如下圖的目錄結(jié)構(gòu)

可以看到weibo.rb是需要我們自己修改的。

其中重點(diǎn)在run這個(gè)method中:
1.創(chuàng)建一個(gè)event對(duì)象
2.修飾event對(duì)象
3.加入queue
logstash的Excution Model解釋說,input plugin跑在單獨(dú)線程中,我們只需要往queue里插入event中就行了,至于如何發(fā)送到elasticsearch就不用管了。
然而logstash-input-twitter的結(jié)構(gòu)有點(diǎn)不一樣。

猜測(cè)有兩個(gè)原因:
第一,這是個(gè)streaming api,跟restful api不一樣
第二,這個(gè)plugin寫得比較早,新版本推薦寫法不一樣。
流程其實(shí)不復(fù)雜,所以也就不用參照了,直接自己寫就是了。
1.發(fā)送request抓取更新的微博
2.根據(jù)抓取結(jié)果創(chuàng)建event對(duì)象
3.插入queue
到目前為止還是比較愉快的,接下來就有點(diǎn)鬧心了。
Weibo API
抓取更新的微博有兩種方法,第一就是爬蟲,第二是通過微博官方的API。總是野路子不太好,所以決定嘗試下通過官方的API抓取。然后我的噩夢(mèng)就開始了,查看api文檔,找到了以下api。

惡心的地方就在需要登錄授權(quán),充分體現(xiàn)了微博是面向企業(yè)收費(fèi)的網(wǎng)站,對(duì)個(gè)人開發(fā)者極其不友好,不提供(或者是我沒找到)個(gè)人訪問的token。看看github這個(gè)同性交友網(wǎng)站是多么的人性化,直接提供了個(gè)人訪問的token。

于是為了獲得我自己的token。我還需要像開發(fā)第三方應(yīng)用一樣,使用另一個(gè)獲取token的API。還好微博提供了SDK,可以直接拿來用。

本以為直接這樣就能用了,結(jié)果還需要一個(gè)申請(qǐng)一個(gè)應(yīng)用,填寫AppKey和重定向url。

沒開發(fā)過微博第三方應(yīng)用,完全搞不懂這個(gè)重定向url是干什么的。于是我隨手填了www.baidu.com,順便申請(qǐng)了應(yīng)用。


反復(fù)確認(rèn)了幾次之后,意識(shí)到可能是應(yīng)用未審核的問題。到這個(gè)時(shí)候我真想放棄了,直接爬得了??墒浅翛]成本以及投入那么多了,還是繼續(xù)吧。

然后這個(gè)審核界面死活提交不了證件圖片,我嘗試了用Chrome,F(xiàn)irefox,IE都沒成功。這時(shí)候我的內(nèi)心是萬馬奔騰的。idea產(chǎn)生就在一瞬間,框架規(guī)劃也沒花多長時(shí)間,最后在這個(gè)微博API的使用上耗了一下午,還沒搞定。雖然不太可能,還是呼吁下微博開放個(gè)人訪問token。
未完待續(xù)......