boost::asioを使ってtwitter api にbasic認証する.

basic認証して,home_timelineを取得する例を示す.今回はjson形式を取得した.picojsonはjsonをデコードするために使用した.XML形式や,RSS形式でやる場合はpicojsonは必要ない.twitter apiが扱う文字コードUTF-8であることに注意.またtwitter apibasic認証を廃止するようなので以下のコードはそのうち使えなくなる.basic認証のサンプルとして残す.

#include <iostream>
#include <string>
#include <boost/asio.hpp>
#include "picojson.h"

using namespace std;
using namespace boost::asio;
using namespace picojson;

int main()
{
    ip::tcp::iostream s( "twitter.com", "http" );

    s << "GET /statuses/home_timeline.json HTTP/1.0\r\n";
    s << "Host: twitter.com\r\n";
    s << "Authorization: Basic Zm9vOmJhcg==\r\n";
    s << "\r\n";
    s << flush;

    string line;
    while( getline(s, line) )
        if( line == "\r" ) break; // cut header

    if(s){
        value v;
        string err = parse(v, s);
        cout << v;
    }
}

basic認証のときは,ユーザー名とパスワードを:で結んだものをbase64エンコードして与える.上記の例はユーザー名 foo, パスワード bar の例である.以下のようにして作成した.

$ echo -n 'foo:bar' | nkf -MB
Zm9vOmJhcg==

boost::asioを使うにはライブラリをリンクする必要があるため,以下のようにコンパイルする.

$ g++ source.cpp -L /usr/local/lib -lboost_system

ちなみにbinaryがリンクしているライブラリはlddコマンドで確認できる.

$ ldd a.out
a.out:
      libboost_system.so => /usr/local/lib/libboost_system.so (0x280a7000)
      libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x280ab000)
      libm.so.5 => /lib/libm.so.5 (0x281a1000)
      libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x281bb000)
      libc.so.7 => /lib/libc.so.7 (0x281c6000)
      libthr.so.3 => /lib/libthr.so.3 (0x282de000)