C++でわざわざツイッタークライアントなんぞ作ろうとしている僕ですが、段々と部品単位では動くようになってきたので、自分用のまとめも兼ねて、ツイッタークライアントをフル(?)スクラッチするときに作るべき物たちを書いて置こうかとおもいます。
実際にはBASE64エンコード/デコードやSSL通信関係の部分は先人の方々のコードを使わせて頂いているので”フル”スクラッチとは言えないのですけれど、C++標準ライブラリとOpenSSLだけを使ってツイッタークライアントを作るとしたら何が必要なのか、というお話です。
さて、まずツイッタークライアントはどんな動きをするのか、概要は至って単純なんですが部品の動きが面倒くさい。
クライアントは当然至極ながらTwitterAPIを利用してツイッターとデータのやりとりをします。
ではTwitterAPIはどうやって使うのか?
当初僕はTwitter社がライブラリのようなものを提供してくれているのかと思っていたんですが、そんなわけなかったww 英語のドキュメントをヒーヒー言いながら読んでいくと、どうやらTwitterAPIはURLの塊だということが分かりました。HTTPヘッダにOAuthの認証情報を載っけてAPIのとあるURLを叩くと対応するデータがツイッター側で生成されてHTTPレスポンスのBodyに載っかって送り返されてくる、という仕組みになっているようです。
ここまで分かるとようやく何を作るべきなのか見えてきます。必要な物は以下の通り。
- HTTPS(SSL)通信を行うモジュール – (OpenSSLを利用)
- OAuthの認証を行うモジュール – (OAuthにはHMAC-SHA1,BASE64, URLエンコード, パラメータを扱うモジュールも必要)
- HTTPを扱うモジュール – (リクエストヘッダの作成、受信データからボディの抽出など)
- jsonを解釈するモジュール – (jsonパーサpicojsonを利用)
- TwitterAPIの機能を提供するモジュール – (ライブラリのフロントエンド、関数呼び出し一発でTwitterAPIの機能を提供する)
細かく見ると、OAuthやHTTPの処理にはURLエンコード(パーセントエンコード)やBASE64エンコードを行うモジュール、KeyとValueの対のパラメータ(連想配列)を扱うモジュール等も必要になります。
イメージとしてはこんな感じ
この図は色々端折りまくって(特にOAuth周り)イメージすら伝わるかどうか怪しいので雰囲気だけでも伝わればいいかなと思います。
青色の部分がTwitterクライアントとしての機能を実現するモジュールです。
基本的にはHTTPヘッダのAuthorization項目にOAuthの認証情報をTwitter社が定めるフォーマットで記載し、HTTPSでURLを叩くだけでAPIが利用出来るというわけです。
今回はTwitterAPIの機能を提供するライブラリと、OAuth認証を行うモジュールを別のクラスとして作成し、ライブラリがTwitterAPIのサーバーにアクセスする際に逐一OAuth担当クラスにAuthorizationヘッダを作ってもらうような処理の流れにしようかと考えています。
何はともあれ、OAuth認証が出来るようにならないと話にならないので次はその辺りを記事にします。
まぁ僕はC++を使うのも初めてなのでクッソ汚くて設計なんてあったもんじゃないようなコードが出来る事うけ合いですが、生暖かい目で見て頂ければいいかなと思っております。
それではノシー