Erlangでツイート取得&投稿

  • 7
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

「言語入門はまずTwitterAPIだ!!」って感じでいろいろやってきたのでErlangもそうする事にしたのですが、とても手こずった…。

PHPでいうjson_decode()が標準で入ってなかったり、$status->textみたいに書けなかったり…。

なんとか頑張った

使用ライブラリ

・jsonのデコード
jsx (https://github.com/talentdeficit/jsx)
・OAuthの通信
Erlang-oauth (https://github.com/tim/erlang-oauth/)

ソースコード

twi.erl
-module(twi).
-compile(export_all).

-define(CK,"").
-define(CS,"").
-define(AT,"").
-define(AS,"").

post() ->
        ssl:start(),
        ApiKey = {?CK, ?CS, hmac_sha1},
        URL = "https://api.twitter.com/1.1/statuses/update.json",
        io:format("post text : "),
        Input = io:get_line(standard_io,''),
        Text = string:substr(Input, 1, length(Input)-1),
        Response = oauth:post(URL, [{"status", Text}], ApiKey, ?AT, ?AS).

get() ->
        ssl:start(),
        ApiKey = {?CK, ?CS, hmac_sha1},
        URL = "https://api.twitter.com/1.1/statuses/user_timeline.json",
        Body = return_body(oauth:get(URL, [{"count", 10}], ApiKey, ?AT, ?AS)),
        if
                Body == error -> 
                        io:format("Error");
                true ->         
                        Res = jsx:decode(list_to_binary(Body), [{labels, atom}]),
                        lists:foreach(fun(Status) ->
                                Text = [Text|| {text,Text} <- Status],
                                io:format("~s~n",Text),
                                io:format("----------------------------~n")
                         end,Res)
        end.



return_body({ok, {{_, 200, _}, _, Body}}) -> Body;
return_body({ok, {{_, _, _}, _, _}})-> error.

実行

投稿

$ erl -pa ebin -s crypto -s inets
1> c(twi).       //コンパイル
2> twi:post().   //post()を実行

ツイート取得

$ erl -pa ebin -s crypto -s inets
1> c(twi).       //コンパイル
2> twi:get().   //get()を実行

軽く説明

post()

ツイートする内容をio:get_line(standard_io,'')で受け取ってます

io:format("post text : "),
        Input = io:get_line(standard_io,''),

あとはoauth:post()を使ってリクエストするだけ!!

get()

oauth:get()でリクエストを送ります。
返ってきた値が正常か判定するためにreturn_body()関数を作りました。エラーじゃなければapiで得たjsonデータをそのまま返します。

return_body({ok, {{_, 200, _}, _, Body}}) -> Body;
return_body({ok, {{_, _, _}, _, _}})-> error.

return_body()関数で正常だと判断された場合jsx:decode()でリストに変換します。
10件分のツイートを拾ったのでそれをforeachでぐるぐる回します。
あとはリスト内包表記を使いツイートテキストを抜き取って表示!!

       if
                Body == error -> 
                        io:format("Error");
                true ->         
                        Res = jsx:decode(list_to_binary(Body), [{labels, atom}]),
                        lists:foreach(fun(Status) ->
                                Text = [Text|| {text,Text} <- Status],
                                io:format("~s~n",Text)
                         end,Res)
        end.

感想

Erlangはパターンマッチが楽しいですね。
最初は「クソ言語だ!!」と言ってたけど慣れるとなかなか面白くて好きです^^