boost::asioを使ってtwitter api にbasic認証する.
basic認証して,home_timelineを取得する例を示す.今回はjson形式を取得した.picojsonはjsonをデコードするために使用した.XML形式や,RSS形式でやる場合はpicojsonは必要ない.twitter apiが扱う文字コードはUTF-8であることに注意.またtwitter apiはbasic認証を廃止するようなので以下のコードはそのうち使えなくなる.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)