2010-12-31 1 views
0

私はインタラクティブブローカーのアカウントを持っています。彼らにはまともな取引APIがありますが、ウェブサイトhttps://www.interactivebrokers.com/sso/Loginで利用可能なアカウント管理機能にアクセスするAPIはありません。私は少しjavascriptを見て、彼らはユーザー名&のパスワードをjavascriptのブラウザで暗号化し、SSLで暗号化されたものを送信しています。.netを使用したhttpsページの取得HttpWebRequestまたはWebClientが返す(400)不正リクエスト

私はそれをC#で行うことができると考えています。最初のステップは(私は)https://www.interactivebrokers.com/sso/LoginをHttpWebRequestまたはWebClientを使って開き、セッションIDを取得することです(これはログインページを読み込んでいるにすぎず、まだユーザー名またはパスワードを入力していない)。

コードの中には改革はありません。 Webクライアントのバージョンである:

WebClient client = new WebClient(); 
client.Encoding = Encoding.UTF8; 
Stream data = client.OpenRead("https://www.interactivebrokers.com/sso/Login"); 

HttpWebRequestのバージョンのいずれかについての自宅書くことは何もありません:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create("https://www.interactivebrokers.com/sso/Login"); 
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

しかし、私はどちらの場合も、私は

The remote server returned an error: (400) Bad Request. 

を得ること私はWhy Does my HttpWebRequest Return 400 Bad request?のようにユーザエージェントを追加しようとしました:

request.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"; 

request.UserAgent = "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; .NET4.0C; .NET4.0E)"; 

私はまだ(400)エラーが発生します。

内部例外がnullですが、WebExceptionの流れを見ると、次の応答(タイトルは「200 OK」と言う理由を私は知らない)を示しています。

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN"> 
<html><head> 
<title>200 OK</title> 
</head><body> 
<h1>OK</h1> 
<p>Your browser sent a request that this server could not understand.<br /> 
</p> 
</body></html> 

を私はパケットに差が見リクエストを行っているウェブブラウザと私のC#コードとの間の最初の違いは、ウェブブラウザにはより多くのCypherスイートがあり、それから私のC#コードが利用できるということです。サーバーがWebブラウザに応答すると、c#クライアントで利用できないcypherの1つが選択されます。 HttpWebRequest/WebClientにCypherスイートを追加するにはどうすればよいですか?私はそれが実際に問題であるかどうかをまだ把握していません。

本当に基本的なものがありませんか?なぜ私はHttpWebRequestまたはWebClientでそのページを読み込むことができないのですか?

おかげ

+1

暗号にはあまり関係ありません。 Fiddlerをインストールし、HTTPS復号モードを有効にして(ツール> Fiddlerオプション> HTTPS)、ブラウザからのリクエストとアプリケーションのリクエストを比較します。 – EricLaw

答えて

1

これは、2つのヘッダ(HttpWebRequestの上のプロパティ)が必要であることが判明:UserAgentの&を受け入れます。これはWireSharkで見つけたはずのものですが、Fiddlerを使用するとヘッダーを比較するのが少し楽になりました。私は、フェードラーのCONNECTセッションを比較していたので、スピードが落ちました。ユーザーエージェントを変更しても接続ヘッダーには影響しません(実際はなぜか分かりませんが、私は推測しません)。 CONNECT後の次の行は、HttpWebRequestに設定したプロパティーを適切に反映していたので、何が間違っていたのか把握することができました。

私を正しい方向に動かすためのEric Lawのおかげです。 Cyphersとは何の関係もありませんでした。

関連する問題