bitcasaDiff

(目的)
BitcasaAPI経由で取得できるファイルリストは、アップロードが完了したファイルのみが取得できるので
APIで取得したBitcasaのファイルリストとローカルのファイルリストを比較することにより、
アップロード忘れや不完全ファイルなどのアップロード失敗ファイルを検出する

(改版履歴)
1.0.0.1(2014/04/14)
公開バージョン

(実行に必要な環境)
Microsoft .NET Framework 4.0
Visual Studio 2013 の Visual C++ 再頒布可能パッケージ

(コンパイルに必要なもの)
Visual Studio 2013 pro(他のバージョンでは確かめていない)
openssl (dllコンパイルしてつけてある)

C#ラッパーによりC#->C++/CLI->opensslでBitcasa APIを叩きに行きます。

(中身)
src\
 ssl\ opensslからコンパイルと実行に必要なものを持ってきた
 BitcasaDLL\ opensslによりBitcasaAPIを叩く足回り,C++/CLI C#ラッパー
 WebWindow\ はじめの認証をWeb表示するモジュール
 BitcasaDiff\ 本体
 bin\ コンパイルしたらここにコピーされます

bin_x64\ 64bitコンパイル実行ファイル(dllは全部要るはず)
bin_x86xp\ 32bitコンパイル実行ファイル(dllは全部要るはず)

(使い方)
https://www.lithium03.info/product/bitcasaDiff/howtouse_jp.html
にまとめたので参照してください。

(技術的情報と注意)
IEコンポーネントのバージョン問題で、ログインできないのでレジストリに一カ所書きに行きます。
src\WebWindow\Form1.csのこのあたり
Microsoft.Win32.Registry.CurrentUser.CreateSubKey(@"Software\Microsoft\Internet Explorer\Main\FeatureControl\" + feature))

ログインに必要な一時キーを取得するauthenticate APIコールにおいて
リダイレクト先をBitcasaに要求されています。
この目的のため、https://www.lithium03.info/login/login_success.html?authorization_code=xxx
のページにリダイレクトしています。
authorization_codeはログイン時にClientSecretと共にaccess_token APIに提示することで
アカウントにアクセスできるトークンを取得するのに使います。
302応答のLocationに入っているところで抽出すれば、うちのサイトへのGETアクセスはしなくてよいのですが、
IEコンポーネントで自動的にリダイレクトして飛び先から抽出した方が容易なので今の形にしています。

初回ログイン時にパスワードを要求するウインドウは、WebWindowによってIEコンポーネントを使って出しています。
フォームのタイトルに、現在表示中のURLが出ています。
ログインが成功してauthorization_codeが提示されるまでの間のページは、すべてBitcasa側のサイトです。
ログインページ
https://developer.api.bitcasa.com/v1/oauth2/authenticate?client_id=aaefc0f0&redirect=https://www.lithium03.info/login/login_success.html

ログイン動作時の詳細なページ遷移については、\src\BitcasaDLL\BitcasaAPI.cppにある
int BitcasaAPI::authenticate() を参考にしてください。
この関数は、WebWindowと同等の動作をするCUIの関数ですが、現在のコードでは使用していません。
ここで行っているように、手パースすると余計な場所に一切アクセスしないでauthorization_codeを
取得できるのですが、ログイン時の遷移をBitcasaが予告なしに時々変更してしまうことと、
権限を要求する画面を加工してしまうのがまずいので、現在はWebWindowを使うことにしています。

いったん有効なトークンを取得できたら、移行の接続はすべてdeveloper.api.bitcasa.com:443への
SSL接続のみで行われます。
developer.api.bitcasa.comの名前はラウンドロビンで複数のIPアドレスが時間によって切り替わっている
模様です。opensslモジュールの自動接続により、よきにはからって切り替わります。

(注意事項)
APIコールはBitcasaサイトの条件を読んで、用法用量を守ってください。
サーバーに高負荷をかける行為は規約で禁じられています。
あまり連続して呼び出すとAPI回数切れになるので、数分後にもう一度試してください。

ソースコードのうち、私が書いている部分(openssl以外)はパブリックドメインです。
