自動でTweetするBotを作ろうと思って、TwitterのREST APIを使ってみたのだけど、アルファベット以外の文字をTweetするとOAuthに失敗してハマったのでメモしておきます。

TwitterのBotを作る記事はたくさんネット上に転がってるので、ここでは特に説明しないですが、僕が参考にしたのはこの記事。
https://blogs.msdn.microsoft.com/henrikn/2012/02/16/extending-httpclient-with-oauth-to-access-twitter/

で、この中で使っているOAuthBase.csはリンク切れだったのでGitHubにあったのを使ってます。
https://gist.github.com/tsupo/112124
ただ、このOAuthBase.csだとAuthenticationHeaderを作ってくれないのでそこは自分で作成。

TweetするコードはHttpClientを使ってこんな感じ。

これで「Test」みたいなアルファベットだけのメッセージならTweetできたのだけど「a=b」みたいなのをTweetするとOAuthに失敗する(401が返る)。UriのコンストラクタはmessageをUrlEncodeしてくれるみたいで、こんな風に明示的にUrlEncodeする必要はないし、このように変えてもやはりOAuthに失敗する。

原因は、.NET FrameworkのUrlEncodeがOAuthが要求しているRFC 3986に従っていないため。何がいけないかというと、例えば「=」をRFC 3986に従ってUrl Encodeすると「%3D」とならなければいけないのだけど、.NETのは「%3d」と小文字の「d」を使ってしまうのであった。当然これでシグネチャを作ると違う結果になってOAuthに失敗するというわけだ。

というわけで自分で作ったUrlEncodeがこちら。OAuthBase.csにもUrlEncodeがあるんだけど、UTF-8に変換してないからこっちの方がよいと思う。(OAuthBase.csでは文字列は一度UrlEncodeされているという前提だから問題ない)

同じようにハマった人の助けになれば幸いです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Anti Spam Code *