AlfabankAPI для работы с Альфа-Клиент On-line

Как и у многих, в один прекрасный день появилась идея автоматизировать бизнес процессы в своей организации. Так или иначе автоматизировать можно всё и бесконечно долго, но задача по работе с банком показалась наиболее важной и интересной. Перед началом исследования стоит предъявить требования к необходимому API с помощью которого мы ходим общаться с банком. На первом этапе неплохо было бы установить соединение с банком, получить текущий баланс и список операций по счёту на указанный период.

Поиск готовых решений от банков мало что дал. У многих банков подобное API отсутствует в принципе.

Раз всё так плохо, создадим свой API с блэкджеком и для достижения цели. Так как автор работает с компанией Альфа-Банк, то и API будет на примере данного банка, но очень надеюсь, что после прочтения начнутся открытые разработки и для остальных.

Очевидно, что не имея специальных инструментов для работы с банками, общаться с ними придётся по протоколу https, а значит результат мы будем получать и обрабатывать в виде html. Для этого запаситесь соответствующими библиотеками.
Решение нашей проблемы сводится к двум основным задачам. Первая – это изучить как наш браузер общается с банком, и вторая – повторить увиденное в нашем API. У большинства программистов это не составит большого труда.

Анализ запросов


  1. При загрузке страницы ibank.alfabank.ru/ALFAIBS32 видим, что в ответе содержится jsessionid, который используется в следующем post-запросе.
  2. Второй запрос использует jsessionid, и передаёт команду на загрузку формы авторизации.
    Запрос:
    https://ibank.alfabank.ru/ALFAIBS32/ControllerServlet;jsessionid=...

    Команда: command&auth_loginByPasswordPage
  3. С возвратом формы авторизации, мы уже получаем OTOKey и новый id сессии, который отличается от первого, после чего система ожидает ввода логина и пароля.
  4. Последним шагом остаётся отправить данные авторизации с учётом нового jsessionid и проверить результат. Выглядит это примерно следующим образом:



    Если всё прошло успешно, то в ответе сервера мы найдём очередной jsessionid, но на этот раз он будет является последним, и использоваться во всех последующих запросах.
  5. Проверить успех авторизации можно попробовав найти в ответе тэг:

    <INPUT type='hidden' name='command' value='dashboard_preparePage'>
    

    По которому уже загружается главная страница кабинета.


Разработка


Дабы не докучать скучным кодом, остановимся только на построении запросов к серверу для авторизации. В примере не представлен способ получения необходимых данных из html ответов сервера. Стоит отметить, что при авторизации не используются cookies.
Пример построения запросов
private void SetRequestData(HttpWebRequest request, string data)
{
   var encoding = new ASCIIEncoding();
   byte[] byte1 = encoding.GetBytes(data);
   request.ContentLength = data.Length;
   var stream = request.GetRequestStream();
   stream.Write(byte1, 0, byte1.Length);
   stream.Close();
 }

public void Connect(string login, string password)
{
   // 1. Get- запрос для получения sessionId1
   var url = "https://ibank.alfabank.ru/ALFAIBS32/";
   var request = (HttpWebRequest)HttpWebRequest.Create(url);
   var response = (HttpWebResponse)request.GetResponse();

   // Получаем первый jsessionid из ответа
   // sessionId1 = …

   // 2. Post- запрос для получения формы авторизации с новым jsessionid
   var controller = url  +"ControllerServlet;jsessionid={0}";
   url =string.Format(controller, sessionId1);
   request = (HttpWebRequest)HttpWebRequest.Create, url);
   request.Method = "POST";
   request.ContentType = "application/x-www-form-urlencoded";
   SetRequestData(request, "command=auth_loginByPasswordPage");
   response = (HttpWebResponse)request.GetResponse();

   // Получаем из ответа otokey и новый jsessionid
   // var otokey = …
   // sessionId2 = …

   // 3. Заключительный запрос для завершения авторизации
   url =string.Format(controller, sessionId2);
   request = (HttpWebRequest)HttpWebRequest.Create, url);
   request.Method = "POST";
   request.ContentType = "application/x-www-form-urlencoded";

   var postData = string.Format(
        "command=auth_loginByPassword&username={0}&password{1} " +
        "&null_div_expanded=false&OTOKey={2}", login, password, otokey);

   SetRequestData(request, postData);
   response = (HttpWebResponse)request.GetResponse();

   // Profit!
}



Результат


Настало проверить результаты работы нашего небольшого API:
AlfabankAPI: Hello world!
class Program
{
   static void Main(string[] args)
   {
      var api = new AlfabankAPI.AlfabankAPI();
      api.Connect("k000000", "qwerty");

     Console.WriteLine("Balance: {0}", api.GetBalance());

     var date1 = new DateTime(2013, 9, 1);
     var date2 = DateTime.Now;
     var account = "40700000000000000000";

     var operations = api.GetMovementOnAccount(account , date1, date2);

     foreach (var o in operations)
        Console.WriteLine("{0} {1} {2}", o.Number, o.DateSend, o.Amount);

      Console.ReadKey();
   }
}





Заключение


Надеюсь эта статья вдохновит на создание более качественного и открытого API для различных банков.
Github: AlfabankAPI
Всем пятницы.
Share post
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 22

    0
    У Связного есть SOAP API, но доступ не дают и отмалчиваются. Реверс-инженеринг Android-клиента даёт кое-какие зацепки, но жаль, просниффать HTTPS-соединение пока не получилось…
      +1
      >Поиск готовых решений от банков мало что дал.
      Периодический поиск (в частности поднятие вопрос тут) по прежнему приводит к одному адекватному предложению, это "Интеграция с программным обеспечением клиентов".
        0
        У них есть приложения, так что и API должен быть…
          0
          Ну, оно то есть, конечно, только с одной оговоркой — оно закрытое…
            0
            Ну да, снифать и реверсить… Тот же Java код сносно восстанавливается из бинарников под JVM.
              +2
              Если он не обфусцирован… Иначе — море веселья! Но самая главная особенность закрытого API, помимо необходимости заниматься реверсом состоит в том, что ты никогда не можешь быть уверен до конца в том, что понимаешь и делаешь все правильно и в том, что в любой момент все может резко измениться без объявления войны… Так, вместо занятия делом и останется, что снифать и реверсить, реверсить и снифать, пытаться понять логику работы и надеяться на удачу и на то, что все не навернется в самый ответственный момент…
                0
                Отсутствие изменений без объявления войны и веб-версия не гарантирует. Даже в большей степени не гарантирует потому как на API есть клиенты, которые ломать нельзя.
          +1
          Странно, до вашего поста я думал, что у Альфы есть API для интеграции, а оказывается вон оно как… Это заставляет задуматься… Быстрое гугление показало, что практически ни у каких банков в России нет открытого API, неужели все настолько запущенно, что никто из банков не хочет способствовать развитию и автоматизации бизнеса? Ведь это взаимовыгодный процесс и явное преимущество перед конкурентами, чем проще и удобнее клиенту работать с банком, тем больше, соответственно, клиентов, т.к. издержки бизнеса ниже и выше отдача от взаимодействия для обеих сторон, в конце концов — XXI век на дворе! Электронный оборот, все дела, не? А выигрывать будут те банки, у которых есть удобное API. Хотя, понимая как устроена диктатура монопольных сговоров «конкуренция» в России, это звучит как что-то из области фантастики…
          Единственный банк, который мне в итоге удалось найти, у которого есть более-менее гикопонятное API, это Банк24: wiki.bank24.ru
          Если кто еще знает банки с открытым API, предлагаю писать в комментах! Почему-то я и не подозревал, что ситуация столь печальна…
            0
            Именно так, и даже больше! Сами пользователи пишут на сайтах банков, чтобы дали им этот api хотя бы за денежку. Наткнулся ещё на пару комментариев от бывших работников банков. Суть их в том, что банкиры не считают подобный сервис сильно выгодным. По-поводу предложения — поддерживаю.
              0
              Ну, быстрой отдачи от открытого API точно не будет. Могут пройти годы пока кто-нибудь прикрутит его к той же 1С и начнёт продавать как продукт. А вот разработка и поддержка требует значительных ресурсов, ведь нельзя просто так взять и открыть как есть закрытый API.
              0
              Альфабанк, не смотря на просьбы пользователей, не собирается отдавать даже уведомления на электронную почту, что уж там говорить про открытый API :(
              0
              Они его так просто не дают. Мы пытались.
              Нужен юр. счет, ЭЦП.
                0
                Можно без эцп по логину и паролю создавать платежки на акцептование, а потом бухгалтер зайдя в интернет банк все скопом подписывает. хотя и с подписанием через смс код есть вариант вроде, а счет в банке конечно нужен :)
                0
                Если кто еще знает банки с открытым API, предлагаю писать в комментах!

                СБ Банк видимой видимо будет замыкать этот длинный список.
                +1
                У Банка24.ру есть API — работа через https post запросы ссылка на вики
                  0
                  Это то, что нужно. Этот банк в принципе ориентирован на онлайн клиента. Что не скажешь об основных.
                  0
                  У тинькова неафторизованная часть сайта общается с бекэндом (например для получения курсов доллара), вполне вменяемыми JSON запросами/ответами. Авторизованную не смотрел, но тоже можно ожидать.
                    0
                    В своё время писал бота под Альфу, ВТБ24 и Промсвязьбанк для отправки платежей и контроля балансов на нескольких счетах, проблем нет, было бы желание :)
                      0
                      Напишете статью? :)
                        0
                        Не вижу смысла в статье об ещё одном парсере. Другое дело исходники открыть, но как понимаете не могу. Во всех интернет-банках примерно одинаковая схема работа 1-2 фрейма сессий и в некоторых обманные ресурсы, всё это не составляет труда понять. Никаких волшебных действий там действительно нет.
                        Тем более я писал под альфу ещё старую версию, там был лес дремучий с сессиями, в новой вроде смотрел по лучше(проще) сделали.
                      0
                      Я сейчас возможно всех сильно удивлю, но я вот буквально несколько часов назад общался с Вадимом Белопольским (прекрасный человек из АльфаЛаба), по этому самому вопросу, и он сказал, что протокол у них есть, и по запросу они его предоставляют.

                      Only users with full accounts can post comments. Log in, please.