読者です 読者をやめる 読者になる 読者になる

Natural Software

KinectなどのDepthセンサーを中心に活動しています

C# で Cacoo API にアクセスする

C#

出遅れましたが、やってみました。
http://github.com/kaorun/OAuthSample


このコード( OAuthBase.cs )を使ったのですが、どうにも上手くいかなかったので、id:ikikko さんに手伝ってもらいながら原因を探り、結局、この2点と分かりました。

  • シグニチャの作成にPINが入ってなかった
  • Authorizationヘッダのための文字列が無かった

原因を解決するために、Mavenを入れるわ、Javaのライブラリのコードは読むわ、Wireshark を使うわの大騒ぎで、おかげさまで OAuth がざっくり理解できました(笑)


これらを追加して、どうも使いづらいので、ikikkoさんJava のやつっぽくしたので、結構シンプルになったと思います。
で、今見返してたら Code — OAuth というサイトにもライブラリがあるようで、こっちの方が使いやすいのかなぁ。。。

修正過程で

動いた状態を壊さないためと、OAuthBase.cs に手を入れるのに Visual Studio Test を使いました。
おかげさまでリファクタしてる途中に、直し忘れると Red になったり、コードが動くことを確認しながら手を入れられるので、とてもよかった。
TDDとまでいかなくても、テストコードがあるだけで安心感が違うことを改めて実感しました。
#今回はシグニチャがらみでハマったので、ここを重点的にテストコードを書きました。

認証サンプル

using System;
using System.IO;
using OAuth;

namespace TwitterOAuthGetAccessToken
{
    class Program
    {
        static void Main( string[] args )
        {
            try {
                System.Net.ServicePointManager.Expect100Continue = false;

                // リクエストトークンを取得
                OAuthProvider provider = new OAuthProvider( APIKey.AccessToken, APIKey.Authorize, APIKey.ReqestToken );
                OAuthConsumer consumer = new OAuthConsumer( OAuth.APIKey.ConsumerKey, OAuth.APIKey.ConsumerSecret );
                string authorizeURL = provider.RetrieveRequestToken( ref consumer );

                //ブラウザからPIN確認
                System.Diagnostics.Process.Start( authorizeURL );
                Console.Write( "PIN:" );
                string pin = Console.ReadLine();

                // アクセストークンを取得
                provider.RetrieveAccessToken( ref consumer, pin );

                Console.WriteLine( "public const string Token = \"" + consumer.Token + "\";" );
                Console.WriteLine( "public const string TokenSecret = \"" + consumer.TokenSecret + "\";" );

                //デスクトップ\oauth_token.txtに保存
                File.WriteAllText( Environment.GetFolderPath( Environment.SpecialFolder.Desktop ) + @"\cacoo_oauth_token.txt",
                    consumer.Token + ", " + consumer.TokenSecret );
            }
            catch ( Exception ex ) {
                Console.WriteLine( ex.Message );
            }
            finally {
                Console.Write( "Press enter : " );
                Console.ReadLine();
            }
        }
    }
}

データの取得サンプル

using System;
using OAuth;

namespace OAuthSample
{
    class Program
    {
        static void Main( string[] args )
        {
            try {
                System.Net.ServicePointManager.Expect100Continue = false;

                OAuthConsumer consumer = new OAuthConsumer( APIKey.ConsumerKey, APIKey.ConsumerSecret );
                consumer.SetTokenWithSecret( APIKey.Token, APIKey.TokenSecret );

                OAuthProvider provider = new OAuthProvider();

                string result = "";

                result = provider.RetrieveRequest( "https://cacoo.com/api/v1/account.xml", consumer );
                Console.WriteLine( "--- アカウント情報取得 ---" );
                Console.WriteLine( result );
                Console.WriteLine( "" );

                result = provider.RetrieveRequest( "https://cacoo.com/api/v1/users/kaorun55.xml", consumer );
                Console.WriteLine( "--- ユーザー情報取得 ---" );
                Console.WriteLine( result );
                Console.WriteLine( "" );

                result = provider.RetrieveRequest( "http://cacoo.com/api/v1/diagrams.xml", consumer );
                Console.WriteLine( "--- 図の一覧取得 ---" );
                Console.WriteLine( result );
                Console.WriteLine( "" );

                result = provider.RetrieveRequest( "http://cacoo.com/api/v1/diagrams/cTedXHIB8T1x1QJS.xml", consumer );
                Console.WriteLine( "--- 図の情報取得 ---" );
                Console.WriteLine( result );
                Console.WriteLine( "" );

                // バイナリの返し方を考える
                //result = provider.RetrieveRequest( "http://cacoo.com/api/v1/diagrams/cTedXHIB8T1x1QJS.png", consumer );
                //Console.WriteLine( "--- 画像取得 ---" );
                //Console.WriteLine( result );
                //Console.WriteLine( "" );
            }
            catch ( Exception ex ) {
                Console.WriteLine( ex.Message );
            }
            finally {
                Console.Write( "Press enter : " );
                Console.ReadLine();
            }
        }
    }
}