Alfa-Client Onlineと連携するためのAlfabankAPI

多くの人がそうであるように、ある日、組織内のビジネスプロセスを自動化するというアイデアが浮上しました。 いずれにせよ、すべてを無期限に自動化できますが、銀行と協力する作業が最も重要で興味深いように思われました。 調査を開始する前に、銀行との通信に必要なAPIの要件を提示する必要があります。 最初の段階では、銀行との接続を確立し、指定された期間の現在の残高と口座の操作のリストを取得するとよいでしょう。



銀行から既製のソリューションを検索してもほとんど成果はありませんでした。 多くの銀行には原則としてそのようなAPIはありません。



すべてが悪いので、ブラックジャックを使用て独自のAPI 作成し、目標を達成します。 著者はAlfa-Bankと協力しているため、APIはこの銀行の例に基づいていますが、それを読んだ後、残りの部分についてはオープンな開発が開始されることを本当に望みます。



明らかに、銀行と連携するための特別なツールがなければ、httpsプロトコルを使用して銀行と通信する必要があります。つまり、結果をhtmlの形式で受け取り、処理します。 これを行うには、適切なライブラリを用意します。

この問題の解決策は、2つの主要なタスクに要約されます。 1つ目は、ブラウザが銀行とどのように通信するかを学習することです。2つ目は、APIで見たものを繰り返すことです。 ほとんどのプログラマーにとって、これは大したことではありません。



クエリ分析



  1. ibank.alfabank.ru/ALFAIBS32ページをロードすると、レスポンスにjsessionidが含まれていることがわかります。jsessionidは、次のポストリクエストで使用されます。

  2. 2番目のリクエストはjsessionidを使用し、認証フォームをダウンロードするコマンドを送信します。

    リクエスト:
      https://ibank.alfabank.ru/ALFAIBS32/ControllerServlet; jsessionid = ... 


    コマンド:command&auth_loginByPasswordPage

  3. 承認フォームが返されると、すでにOTOKeyと新しいセッションIDが取得されますが、これは最初のセッションIDとは異なり、システムはログインとパスワードの入力を求めます。

  4. 最後の手順は、新しいjsessionidで認証データを送信し、結果を確認することです。 次のようになります。







    すべてがうまくいけば、サーバーの応答で次のjsessionidが見つかりますが、今回は最後のjsessionidであり、以降のすべてのリクエストで使用されます。

  5. 答えの中でタグを見つけることにより、認証の成功を確認できます。



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





    キャビネットのメインページが既にロードされている場所。





開発



退屈なコードに煩わされないように、承認のためにサーバーへのリクエストを作成することにのみ焦点を当てます。 この例では、htmlサーバーの応答から必要なデータを取得する方法は提供されていません。 Cookieは認証時に使用されないことに注意してください。

クエリ構築の例
 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

金曜日みんな。




All Articles