2014年01月26日

Twitter API に HTTPS でアクセスする(ただし、C++Builder + Indy)

さて、2014年1月15日から、Twitter API のアクセスが、HTTPS 限定となりました。
「節気さんシリーズ」は、ながらく、HTTP であくせすしてていたので、この時、全面的にBotが停止するという事態に陥ったわけであります。

ちかいうちに、そうなりそうだなという話は聞いていたのですが、HTTPS への対応が分からなかったので、「見て見ぬふり」をしていたら、いきなり、痛い目に遭ったという、そういう構図です。

実際に止まってしまったので、あわてて対応方法法を調べます。
基本的なこところは、
http://www.gesource.jp/programming/bcb/45.html
で、判明。
C++Builder についてくる、Indy ライブラリを使えば、SSL で、POST は、容易に実現できそう。
特に、従来、TCPClient でオープンして、レスポンスをパーシングして、

ちょっと安心して、これまで作っていた、OAuth データを、「POSTパラメータ」にぶちこんで、POST するも、失敗。
なぜだろうかと、数日悩んだ結果、答は、
http://d.hatena.ne.jp/mole-studio/20130816/1376676005
にありました。

OAuth ヘッダは、Request.CustomHeaders にセットして、
パラメータのみ、(POST の引数としてわたす)パラメータにセットすれば、OKでした。

この段階で、ツイートには成功しました。
ただ、もうひとつの機能である、「アイコンの差し替え」は対応できていません。

Botの動作は、「OAuth ヘッダを送って、認証した後、アイコンファイルを、マルチ-パートの扱いで直接送信」でしたので、Indey ライブラリを使った、ファイルのアップロードを試すも失敗。
ここで、もう一度、Twitte API の仕様を確認すると、「アイコンファイルは、Base64でエンコードした後、image= につづけて、パラメータとして送信すること」という内容を見つけました。

Base64でエンコードするの処理が追加で必要になるものの、POSTの処理自体は、ツイートと同じなので、楽勝――のはずが、これまた失敗。

悩むこと数日、答がひらめきました。
OAuth ヘッダ(のための、Base String)を作る際に、関連するヘッダは、「アルファベット順に並べる」訳ですが、ツイートの際のパラメータは、status = で、「たまたま」一番最後でした。
この処理を使ったので、アイコン送信の際のパラメータである、image = も「最後」においたわけです。
そもそも、「ヘッダはアルファベット順」でしたが、「ヘッダの後にパラメータ」ということで。
(ちなみに、Twitter サイトの説明もこの順番だった)

でも、image は、「アルファベット順」だと、最初だったのですね。
順番を入れ替えて、Base String をつくり、OAuth ヘッダを作ることで、無事に処理が成功しました。

1週間半。長い戦いでした。

posted by 麻野なぎ at 16:51| Comment(0) | TrackBack(0) | Twitter と Bot の周辺