开发logstash插件

摘要:本文记录了我尝试开发logstash插件的愉(艰)快(辛)过程

背景

有很多大V的微博很有营养,比如agenzh的微博有很多关于技术方面的和程序员邹欣有很多关于软件工程的,值得反复玩味。但是微博是按timeline形式排列的,非常不方便非线性查看。agentzh的code2ebook给我启发,可不可以把感兴趣大V的微博做成电子书?

规划

首先想到的是写爬虫,然后模拟翻页操作,抓取全部微博。这种方式当然行得通,我也很熟练。刚好最近在看ELK,按照邹欣老师Build To Learn的原则,用ELK来收集分析也挺不错的,顺便练练手。logstash定期获取更新的微博,写入elasticsearch,除了可以导出生成电子书外,还可以在kibana做可视化分析。例如分析下大V们发微博的时间分布来分析下其作息习惯。根据词频来对大V进行分类,agenzh的openresty词频肯定很高。

logstash input plugin

logstash自带了很多input plugin,比如抓取twitter。但是没有微博的,想想自己能贡献一个微博的plugin还是挺激动的。于是开始学习怎么写input plugin。第一反应是模仿twitter这个插件写,首先使用下面的命令生成一份plugin模板。

bin/logstash-plugin generate --type input --name weibo --path ~/elastic/plugins

得到如下图的目录结构

开发logstash插件_第1张图片
plugin目录结构

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

开发logstash插件_第2张图片
weibo.rb

其中重点在run这个method中:

1.创建一个event对象

2.修饰event对象

3.加入queue

logstash的Excution Model解释说,input plugin跑在单独线程中,我们只需要往queue里插入event中就行了,至于如何发送到elasticsearch就不用管了。

然而logstash-input-twitter的结构有点不一样。

开发logstash插件_第3张图片
twitter.rb

猜测有两个原因:

第一,这是个streaming api,跟restful api不一样

第二,这个plugin写得比较早,新版本推荐写法不一样。

流程其实不复杂,所以也就不用参照了,直接自己写就是了。

1.发送request抓取更新的微博

2.根据抓取结果创建event对象

3.插入queue

到目前为止还是比较愉快的,接下来就有点闹心了。

Weibo API

抓取更新的微博有两种方法,第一就是爬虫,第二是通过微博官方的API。总是野路子不太好,所以决定尝试下通过官方的API抓取。然后我的噩梦就开始了,查看api文档,找到了以下api。


开发logstash插件_第4张图片
weibo api

恶心的地方就在需要登录授权,充分体现了微博是面向企业收费的网站,对个人开发者极其不友好,不提供(或者是我没找到)个人访问的token。看看github这个同性交友网站是多么的人性化,直接提供了个人访问的token。

开发logstash插件_第5张图片
github personal token

于是为了获得我自己的token。我还需要像开发第三方应用一样,使用另一个获取token的API。还好微博提供了SDK,可以直接拿来用。

开发logstash插件_第6张图片
OAuth4Code

本以为直接这样就能用了,结果还需要一个申请一个应用,填写AppKey和重定向url。

开发logstash插件_第7张图片
Oauth2 API

没开发过微博第三方应用,完全搞不懂这个重定向url是干什么的。于是我随手填了www.baidu.com,顺便申请了应用。


开发logstash插件_第8张图片
微博应用
开发logstash插件_第9张图片
认证出错界面

反复确认了几次之后,意识到可能是应用未审核的问题。到这个时候我真想放弃了,直接爬得了。可是沉没成本以及投入那么多了,还是继续吧。


开发logstash插件_第10张图片
审核界面

然后这个审核界面死活提交不了证件图片,我尝试了用Chrome,Firefox,IE都没成功。这时候我的内心是万马奔腾的。idea产生就在一瞬间,框架规划也没花多长时间,最后在这个微博API的使用上耗了一下午,还没搞定。虽然不太可能,还是呼吁下微博开放个人访问token。

未完待续......

你可能感兴趣的:(开发logstash插件)