У меня есть аккаунт в Interactive Brokers. У них есть достойный торговый API, но нет API для доступа к некоторым функциям управления счетами, которые доступны через их веб-сайт по адресу https://www.interactivebrokers.com/sso/Login. Я немного посмотрел на javascript, и они шифруют имя пользователя и пароль в браузере в javascript, а затем отправляют зашифрованные данные по SSL.
Я надеюсь, что смогу сделать это в C #. Первым шагом (я думаю) является открытие https://www.interactivebrokers.com/sso/Login с использованием HttpWebRequest или WebClient, чтобы получить идентификатор сеанса (это просто загрузка страницы входа в систему - даже не вводя никакого имени пользователя или пароля).
Нет ничего слишком революционного в коде. Версия WebClient:
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.
Я пытался добавить пользовательский агент согласно Почему мой HttpWebRequest возвращает 400 неверный запрос? :
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).
Внутреннее исключение равно нулю, но просмотр потока 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 #, и первое отличие, которое я заметил, заключается в том, что в веб-браузере доступно гораздо больше наборов шифров, чем мой код на c #. Когда сервер отвечает на веб-браузер, он выбирает один из шифров, который недоступен в клиенте c #. Как добавить наборы шифров в HttpWebRequest / WebClient? Я еще не выяснил, действительно ли это проблема или нет.
Я что-то упускаю из виду? Почему я даже не могу загрузить эту страницу с помощью HttpWebRequest или WebClient?
Спасибо