VC++で「つぶやく」までの流れ

liboauthというライブラリがあるらしいが、そういうのを使わずにやらなイカ
https://dev.twitter.com/docs/api
OAuth Core 1.0

準備(ここが難所)

HTTPクライアント

winsockプログラミング:Geekなぺーじ
ここのHTTPクライアントの作成というところを見て(コピペして)、
HTTP/1.1で好きなページのHTMLをゲットできるようにしておく。
ちなみに、C#ならWebRequestクラスというのがある。

署名の生成

文字列と暗号鍵から署名を生成できるようにする。
汝の隣人のブログを愛せよ | LOVELOG
このようにすればWindowsAPIだけで可能。
ちなみにC#ならHMACSHA1クラスというのがあって簡単。

UNIX time

1970年1月1日から何秒経過したのかを知る必要がある。
SYSTEMTIME st = {1970, 1, 4, 1, 0, 0, 0, 0}; のように初期化して、
GetSystemTime(GetLocalTimeではなく)で得た時刻との差をとればいい。
C#では、DateTimeクラスで同様のことが(少ない行数で)できる。

BASE64

CryptBinaryToStringAでCRYPT_STRING_BASE64を指定すればいい。
ただし、最後に付加される改行を含めないように注意すること。
C#なら、ConvertクラスのToBase64Stringメソッドを使えばいい。

URLエンコード

ここは、C#のHttpUtilityクラスのUrlEncodeが使えない(16進数が小文字ではダメ)。
OAuthとC#でマルチバイト文字を扱う - nyanp::blog
ここで紹介されているコードをC++に直して使えばいい。
unreservedCharsというのは、(ググればわかるが)"-_.~"の4文字と英数字。
あと、文字コードUTF-8でなければならない。
変換するには、WideCharToMultiByteでCP_UTF8を指定する。
これまたC#にはUTF8Encodingクラスというのがあってお手軽だ。

まとめ

TwitterのクライアントがことごとくC#で作られている理由がよくわかったでげそ。

実際に作ってみる

アプリケーションの登録

http://lab.klab.org/young/2010/06/%E3%81%A8%E3%81%82%E3%82%8Boauth%E3%81%AEtwitter%E3%82%AF%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%B3%E3%83%88/
Twitterのホームから、設定、連携アプリ、開発者の方へ、と辿り、
http://twitter.com/apps/newにアクセスし、必要事項を埋める。
このとき、クライアントアプリケーション・Read & Writeを選択するでゲソ。

認証

http://watcher.moe-nifty.com/memo/docs/twitterAPI.txt
これのOAuth関連の項にあるように、認証をする。
一文字でも間違えると認証されないので、仕様通りにやるでゲソ。
http://developer.yahoo.co.jp/other/oauth/signinrequest.html
ここの説明がわかりやすい。
アプリケーションのConsumer keyとConsumer secretによって、
ユーザーにアクセス許可を求めるためのURLが得られ、
Twitterにログインした状態のユーザーがそこにアクセスすることで、
ユーザーがアプリケーションにアクセス許可を与えることができる。
それも、ユーザーがアプリケーションにパスワードを教えずに。

つぶやく

こうして得られたTokenとToken secretを使えば、Twitterでつぶやくことができる。
具体的には、次のように送信する(アクセストークンなどはXXXXで伏字にした)。

POST http://api.twitter.com/1/statuses/update.xml?oauth_consumer_key=XXXX&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1291280948&oauth_token=XXXX&oauth_version=1.0&status=%XX%XX%XX&oauth_signature=XXXX HTTP/1.1
Host: api.twitter.com
行き詰まったら

C#で同じ処理を書いてみて(C#なら簡単に書けてサンプルも多いので)、
結果が正しいかどうかを突き合わせながら進もうじゃなイカ

(追記)XML

つぶやくだけなら関係ないが、取得したデータを表示するにはXMLを扱う必要がある。
VC++ならXmlLiteのIXmlReader、C#ならXmlReader Class (System.Xml) | Microsoft Docsが使える。
サンプルは、XmlLite プログラミングhttp://wawatete.ddo.jp/exec/program/cs/xml_xmlreader1

(追記)認証の具体例

Consumer key:AAAA
Consumer secret:BBBB
"BBBB&"をkeyとして署名DDDDを生成。

POST http://api.twitter.com/oauth/request_token?oauth_consumer_key=AAAA&oauth_nonce=CCCC&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1312714856&oauth_version=1.0&oauth_signature=DDDD HTTP/1.1
Host: api.twitter.com

成功すると下のようなデータが得られる。

oauth_token=EEEE&oauth_token_secret=FFFF&oauth_callback_confirmed=true

oauth_tokenを使って次のURLにアクセスする(ShellExecuteなどを使う)。

http://api.twitter.com/oauth/authorize?oauth_token=EEEE

GGGGというPINが表示される。それを入力してもらう。
"BBBB&FFFF"をkeyとして署名IIIIを生成。

POST http://api.twitter.com/oauth/access_token?oauth_consumer_key=AAAA&oauth_nonce=HHHH&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1312714868&oauth_token=EEEE&oauth_verifier=GGGG&oauth_version=1.0&oauth_signature=IIII HTTP/1.1
Host: api.twitter.com

成功すると下のようなデータが得られる。

oauth_token=JJJJ&oauth_token_secret=KKKK&user_id=72810881&screen_name=merom686

これで準備完了。さっそく「てすと」とつぶやいてみる。
"BBBB&KKKK"をkeyとして署名LLLLを生成。

POST http://api.twitter.com/1/statuses/update.xml?oauth_consumer_key=AAAA&oauth_signature_method=HMAC-SHA1&oauth_timestamp=1312722001&oauth_token=JJJJ&oauth_version=1.0&status=%E3%81%A6%E3%81%99%E3%81%A8&oauth_signature=LLLL HTTP/1.1
Host: api.twitter.com