まめ畑

ゆるゆると書いていきます

Win32APIを使ってみる@C#

最近、とあるツールを作っているのですが機能の中で実現すべき要件が殆ど
実装したのですが、もっとも大事なところが中々実現できなかったのですが、
今日何とか実装完了しそうですv
WEBでBASICかダイジェスト認証をしているページにオートログインをしないと
いけなかったのですが、JavaC#での実装をしてみた結果認証は通過している
のですが、403エラーが返ってきてアクセス拒否されてしまいました・・・・・
リファラーとUserAgentを偽装しても同じくエラーで全てのHTTP絵クエストヘッダを
流しこんでも無理・・・・・。
そこで、POSTメッセージをGETに書き換えて同じようにアクセスしても
結果は一緒><、
もう、HTTPレスポンスヘッダは見飽きました・・・・。
しかも、JavaでわざわざAuthenticatorクラスなんて用意されていて、いける
とおもったのですが、こいつの使用方法は何か不自然で開発者がなぜこのような
実装にしたのかわかりません・・・。
専用にクラスを作成・インスタンス化して、それを引数として別クラスのメソッドを
呼び出してセットしておくと必要時に勝手に認証をしてくれるのですが、
すっごく面倒で手順がしっくりきませんでした。Proxyクラスのように使えたら
便利なのに。。。
で、調べたら目的のページはBASIC認証だったのでHTTPリクエストヘッダに直接
セットしてみました、「Authenticattion:BASIC id:PASS」です。
ヘッダにセットするメソッドがあるのでそれで指定します。id:PASS
BASE64エンコードしたものを送信します。
これは簡単でしたw
でも、無理ね・・・・・・。

C#ではもっと簡単で、プロパティに認証情報を格納したクラスのインスタンス
セットするだけでOKです。まぁ、代入ですね。

でも、何しても403でアクセス出来ず・・・・。
あのメーカのWEBサーバはどうなってんだ!!!!!
JavaScripが無効だからか???
でも、直アクセスだから関係ないし。
クッキーもナビゲーションも許可してるのに。。。。
わざわざクッキーコンテナもくっつけたのに・・・・。

で、ブラウザからはアクセス出来るので認証画面に自動的にIDなどを
入力してOKボタンを押してしまえばいけると思い、フォームの自動入力を
実装する事にしました。。。。
もちろんC#で。
C#はマネージメントコード万歳な言語なのでWin32API(アンマネージメントコード)
を使うにはDLLをインポートしないといけません。
それがいっせいにインポートできればいいのですが、関すごとにインポート宣言を
書いていかないといけません。。。。。
で、ポインターを格納するものもあるのでそれにハンドルなどを入れていきます。
で、定数は16進で書いていきます。
関数に渡す時にポインターで引数が指定されているときは、マネージなものを
アンマネージメモリにコピーするメソッドを呼び出します。今回はANSI型に変換
します。

で、初めて使った感想ですが楽しすぎ!!!
やっぱり、OSに色々命令出来るので出来る事の幅が広がります。。。
Javaの物足りなさが浮き彫りになります><

今回は簡単なフォーム入力でしたが、もっと色々やろう><b

これで一応完成しそうな感じですvv
今回はWindowメッセージを横取りして、フォームにメッセージを流し込みました。

Windowsはメッセージのやり取りで動作しているので、フォームはユーザに
わかりやすいように出てきているので、そこをいただきますvvv
何かいいですね〜〜〜。


あ、モバイルSuicaがバージョンアップしました。。。
Version2+になりました。
3月18日からのPASMOとの相互乗り入れに対応したようです。
しかし、JR→他社→JRの乗換えだと運賃が高くなる区間があるようです。
このバージョンアップもソフトを起動してログインなどのアクションを起こした
タイミングで実行されるようです。