SplunkにTwitterのデータをぶちこむ(自分のタイムライン)。

# はじめに #
[前回](http://qiita.com/t_nakayama0714/items/5cebde7f5e66083d5044)はSplunkの新規インストールとAppを利用したTwitterデータのサンプル投入をやりました。

「 **でもやっぱり自分のタイムラインを取得したいよね！** 」

ってことと、

「 **汎用APIのときどうしたらいいの？** 」

ってのを思うので今回は2通りの方法でTwitterのStream APIから自分のタイムラインデータを取得します。

# App for Twitter Data #
ではまずは前回も使った[App for Twitter Data](https://apps.splunk.com/app/1162/)を利用して自分のタイムラインをSplunkに取り込みます。

そもそも前回取得していたあのサンプルデータって何だったのでしょうか。

![WS000011.JPG](https://qiita-image-store.s3.amazonaws.com/0/45253/7bb64dab-941f-6fad-f7c0-3eb49744d6bf.jpeg)

これは実はTwitterが提供している「 **全ツイートの一部をランダムに取得するAPI** 」から取ってきたデータでした。

[GET statuses/sample](https://dev.twitter.com/docs/api/1.1/get/statuses/sample)

> Returns a small random sample of all public statuses. The Tweets returned by the default access level are the same, so if two different clients connect to this endpoint, they will see the same Tweets.
> 
> GET	https://stream.twitter.com/1.1/statuses/sample.json

で、それを指定しているのが`/opt/splunk/etc/apps/twitter2/bin/stream_tweets.py`のスクリプトです。
詳しい部分は省きますが、このスクリプトが60秒に1回動き、その都度上記APIからツイートデータを取得しています。

さて、では`stream_tweets.py`のスクリプトを少しいじって自分のタイムラインを取得できるようにしましょう。
まずApp for Twitter Dataのセットアップ画面から`Enable Twitter Input:`のチェックを外してください。これでスクリプトの定期実行が停止します。
あるいはデータ入力の管理画面からスクリプトを直接無効にしてもOKです。

では次にスクリプト内の3箇所を下記のように修正してください。

```bash
vi /opt/splunk/etc/apps/twitter2/bin/stream_tweets.py
```

- 【137行】`def read_sample_tweet_stream(` → `def read_user_tweet_stream(`  

- 【172行】`streamer.statuses.sample()` → `streamer.user()`  
    
- 【200行】`read_user_tweet_stream(` → `read_user_tweet_stream(`  

上記のように設定したら、先ほどの逆の手順でスクリプトの定期実行を有効化してください。
設定がそのままであれば60秒毎に実行されるので、下記のログを確認してpythonのエラーが出ていなければ成功です。

```bash
tail -f /opt/splunk/var/log/splunk/splunkd.log
```

改めてAppのDashboardを確認したら自分のタイムラインデータが取り込まれているはずです。
(ただ、ダッシュボードのパネルはsampleデータの分析に適したものなので自分のTLにはイマイチです)

# REST API Modular Input #
汎用的なAPIも扱えるように[REST API Modular Input](https://apps.splunk.com/app/1546/)を用いてタイムラインデータを取り込みます。

## REST APIのセッティング ##
ではRESTの入力設定をしていきましょう。

`設定` → `データ入力` → `REST` → `新規`

下記のように設定してください。書いてないところはとりあえず空白でOKです。

|項目名|設定値|
|:-----|:-----|
|Endpoint URL|https://userstream.twitter.com/2/user.json|
|HTTP Method|GET|
|Authentication Type|oauth1| 
|OAUTH 1 Client Key|`<API key>`|
|OAUTH 1 Client Secret|`<API secret>`|
|OAUTH 1 Access Token|`<Access token>`|
|OAUTH 1 Access Token Secret|`<Access token secret>`|
|Response Type|json|
|Streaming Request ?|○|
|ソースタイプの設定|manual|
|ソースタイプ|Twitter|
|その他の設定|○|
|インデックス|main|

* 多分下の4つくらいは特に関係ないと思います。(詳しくは試してない)

さて、上記の設定を終えたら適当に名前を付けて保存、有効化しましょう。
TLにツイートが流れてくるのを待ってもいいし、自分で何かつぶやいてみてもいいでしょう。

そうしたらサーチ画面から

`sourcetype = Twitter user.screen_name = <アカウント名>`

あたりで検索をかけてみましょう。
多分指定したアカウントのつぶやきがヒットします。

![WS000016.JPG](https://qiita-image-store.s3.amazonaws.com/0/45253/c92dda00-34aa-abb4-167f-1938ed5be720.jpeg)

先ほど入力設定で`Response Type -> json`を選択したためデータがjsonで取り込まれます。
また、Splunkはjsonの構造をkey-valueなノリで解釈してくれて、自動的にkeyをフィールドと認識してくれます。
なので面倒なフィールド調整などもいらず、非常に楽チンです。

では少しTwitterのjsonデータを見てみましょう。

|Key|Value|
|:-----|:-----|
|create_at|つぶやいた時刻|
|source|つぶやいたクライアント|
|text|つぶやき本文|
|user.screen_name|アカウント名|
|user.description|プロフィール|

というような感じになっています。この辺りの値でしぼっていくと膨大なツイートの中からでも効率的に目的のツイート(群)を見つけることができます。

# TwitterのAPI #
今回はStream APIということでひたすらデータの流れてくるTwitter APIを使っています。なので、最初に触れた`https://stream.twitter.com/1.1/statuses/sample.json`なんかを受け続けると、あっという間にフリーライセンス制限([参照](http://ja.splunk.com/view/free-vs-enterprise/SP-CAAAE8W))に引っかかってしまいます。ごく一部とはいえ、全世界でつぶやかれるツイートですからね。
(実際ひっかかったのでSplunk建て直しました)

他にどんなAPIがあるのか少し調べてみました。

- [REST API v1.1 Resources](https://dev.twitter.com/docs/api/1.1)
- [The Streaming APIs](https://dev.twitter.com/docs/api/streaming)

|API名|種別|説明|Endpoint URL|
|:-----|:----:|:-----|:-----|
|User timeline|REST|指定ユーザのつぶやきを取得|https://api.twitter.com/1.1/statuses/user_timeline.json|
|Home timeline|REST|指定ユーザのTL取得|https://api.twitter.com/1.1/statuses/home_timeline.json|
|Show tweet|REST|指定IDのつぶやきを取得|https://api.twitter.com/1.1/statuses/show.json?id=xxx|
|Search tweet|REST|指定条件の検索結果を取得|https://api.twitter.com/1.1/search/tweets.json|
|User stream|STREAM|指定ユーザのストリームを取得|https://userstream.twitter.com/1.1/user.json|
|Site stream|STREAM|複数ユーザのストリームを取得|https://userstream.twitter.com/1.1/site.json|
|Filter stream|STREAM|指定条件のストリームを取得|https://stream.twitter.com/1.1/statuses/filter.json|
|Sample stream|STREAM|サンプルストリームを取得|https://stream.twitter.com/1.1/statuses/sample.json|

確かにこうやって公開されているAPIが分かればTwitterクライアントの裏側がどうなっているか非常によくわかりますね。
AndroidにSample stream実装したらすぐ死にそう。

# 次回 #
とりあえずあとはしばらく放置しておけば勝手にデータが溜まってくるので、データがある程度溜まり次第 **サーチの書き方** を勉強していきたいと思います。多分ドキュメントを淡々と読むことになりそう。　→　[**次回**](http://qiita.com/t_nakayama0714/items/c2b78dcdf8bd61bbe3af) **できました。**

- [Splunk_ja v5 (日本語公式ドキュメント)](http://ja.splunk.com/web_assets/v5/book/Exploring_Splunk_ja.pdf)

    ちょっと古い(最新のSplunkはv6.1)ですが基本的な文法を学ぶ分にはいいでしょう。多分。

# 参考 #
今回あれこれするにあたり下記を参考にさせていただきました。

- [Twitter for Splunk: Tracking Tweets](http://blog.splunkstart.com/post/86230093385/twitter-for-splunk-tracking-tweets)  
    
    SplunkのTipsから。ここではFilter streamを使って解説していますね。    
    
- [第3回Twitter API勉強会 - ストリーミングAPI](http://www.slideshare.net/yusukey/3twitter-api-api)

    今回やってみるまでTwitter APIがどういう体系になってるのかよくわかってませんでした。