bank_scrap 0.0.10 → 0.0.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ce7f4d32e3f3900721ec3a2ab289f9cb15ce8968
4
- data.tar.gz: 8ecc35df726bc45669b3fde9ebf9f023506e24e9
3
+ metadata.gz: 011bc3352dbc67fd3346b8214de8761910772cb7
4
+ data.tar.gz: 839d98e70e9755a1d8032e789f587655f7a52d55
5
5
  SHA512:
6
- metadata.gz: 5ce34cc53d2c9f7274e66aac5bfe39d5cc672c87ce989967c2d08cf5158c51f77b485a1531fe5f30db200207336568986b025da6125143e17a2799676b1e593c
7
- data.tar.gz: e577618b857f9211a8bd34ab8048324fb68cc4276a80e4f5ff92458262ccbe9ced2d99f68f85891f9720d0b0d235ed70e5a6ac637decb11c570b5e92abadcd2d
6
+ metadata.gz: 3ed3e531ad452268c55e95cfb3c8dd0eaa7bc4b9c46ad884f4f2a16a1e0bca5edeafb1d02337864dd85b2d240cfe893b9252f7bc0a92177b61eeedcb845a3dfe
7
+ data.tar.gz: 844bc92e681e981f6cede4963c1b64a0ffab36e3702fddf06fadd63c0c3e758fe61c85c4a671ee62afe4b140e1fdc756cebad0b1456820d057cc7ff6cb4e3973
data/README.md CHANGED
@@ -10,8 +10,8 @@ Feel free to contribute and add your bank if it isn't supported.
10
10
 
11
11
  | | BBVA | ING Direct | Bankinter |
12
12
  |-----------------|:------:|:----------:|:---------:|
13
- | Account Balance | ✓ | ✓ | WIP |
14
- | Transactions | ✓ | ✓ | WIP |
13
+ | Account Balance | ✓ | | ✓ |
14
+ | Transactions | ✓ | | ✓ |
15
15
 
16
16
  Interested in any other bank? Open a new Issue and we'll try to help.
17
17
 
@@ -54,12 +54,12 @@ Or, if you're using Bundler, just add the following to your Gemfile:
54
54
  ### From terminal
55
55
  #### Bank account balance
56
56
 
57
- ###### BBVA
57
+ ###### BBVA | Bankinter
58
58
 
59
- $ bank_scrap balance bbva --user YOUR_BBVA_USER --password YOUR_BBVA_PASSWORD
59
+ $ bank_scrap balance your_bank --user YOUR_BANK_USER --password YOUR_BANK_PASSWORD
60
60
 
61
61
  ###### ING Direct
62
- ING needs one more argument: your bithday.
62
+ ING needs one more argument: your birthday.
63
63
 
64
64
  $ bank_scrap balance ing --user YOUR_DNI --password YOUR_PASSWORD --extra=birthday:01/01/1980
65
65
 
@@ -96,6 +96,8 @@ require 'bank_scrap'
96
96
  bbva = BankScrap::Bbva.new(YOUR_BBVA_USER, YOUR_BBVA_PASSWORD)
97
97
  # ING
98
98
  ing = BankScrap::Ing.new(YOUR_DNI, YOUR_ING_PASSWORD, extra_args: {"birthday" => "dd/mm/yyyy"})
99
+ # BANKINTER
100
+ bankinter = BankScrap::Bankinter.new(YOUR_BANKINTER_USER, YOUR_BANKINTER_PASSWORD)
99
101
  ```
100
102
 
101
103
 
@@ -57,9 +57,6 @@ module BankScrap
57
57
 
58
58
 
59
59
  def initialize_cookie(url)
60
- log 'Initialize cookie'
61
-
62
- @http.url = url
63
60
  @http.get(url).body
64
61
  end
65
62
 
@@ -3,9 +3,9 @@ require 'execjs'
3
3
 
4
4
  module BankScrap
5
5
  class Bankinter < Bank
6
-
7
- BASE_ENDPOINT = "https://movil.bankinter.es"
8
- LOGIN_ENDPOINT = "/mov/es-es/cgi/ebkmovil+md+login"
6
+ BASE_ENDPOINT = "https://www.bankinter.com"
7
+ LOGIN_ENDPOINT = "/www/es-es/cgi/ebk+login"
8
+ TRANSACTIONS_ENDPOINT = "/www/es-es/cgi/ebk+opr+buscadormov"
9
9
 
10
10
  def initialize(user, password, log: false, debug: false, extra_args: nil)
11
11
  @user = user
@@ -14,50 +14,90 @@ module BankScrap
14
14
  @debug = debug
15
15
 
16
16
  initialize_connection
17
- parse_html(initialize_cookie(BASE_ENDPOINT + '/'))
17
+ initialize_cookie(BASE_ENDPOINT)
18
+ parse_html(get(BASE_ENDPOINT + '/www/es-es/cgi/ebk+gc+lgin'))
18
19
  login
20
+ super
19
21
  end
20
22
 
21
- def get_balance
23
+ def fetch_accounts
24
+ log 'fetch_accounts'
25
+ accounts = []
22
26
  if @dashboard_doc
23
- if links = @dashboard_doc.css('div.textoresaltado_md a')
24
- links[0].text
27
+ if links = @dashboard_doc.css('div.caj_content_plegable.bk_ocultable_novisible div.tab_extracto_01')[0]
28
+ links.css('table tbody tr').each do |x|
29
+ name = x.css('td.enlace div form button').text.encode("UTF-8")
30
+ balance_currency = x.css('td.numero').text.scan(/[\d,\.]+|\D+/)
31
+ balance = balance_currency[0]
32
+ currency = balance_currency[1].gsub(/[[:space:]]/,"")
33
+ cc = x.css('td.enlace div form input')[0]['value']
34
+ data = {'id' => cc, 'description' => name, 'availableBalance' => balance, 'currency' => currency, 'iban' => cc}
35
+
36
+ accounts.push(build_account(data))
37
+ end
25
38
  end
26
39
  end
40
+
41
+ accounts
27
42
  end
28
43
 
29
- def get_transactions
30
- response = get(BASE_ENDPOINT + "/mov/es-es/cgi/" + @transactions_endpoint)
44
+ def fetch_transactions_for(account, start_date: Date.today - 1.month, end_date: Date.today)
45
+ transactions = []
46
+
47
+ fields = {
48
+ 'ext-solapa' => 'operar',
49
+ 'ext-subsolapa' => 'mis_cuentas',
50
+ 'ordenDesc' => '',
51
+ 'ordenFechaC' => 'A',
52
+ 'ordenFechaV' => '',
53
+ 'ordenGasto' => '',
54
+ 'ordenIng' => '',
55
+ 'buscador' => 'S',
56
+ 'tipoConsulta' => 'N',
57
+ 'seleccionado_tipo' => '',
58
+ 'cuenta_seleccionada' => account.iban,
59
+ 'tipoMov' => 'A',
60
+ 'dia' => start_date.strftime("%d"),
61
+ 'mes' => start_date.strftime("%m"),
62
+ 'anio' => start_date.strftime("%Y"),
63
+ 'diaH' => end_date.strftime("%d"),
64
+ 'mesH' => end_date.strftime("%m"),
65
+ 'anioH' => end_date.strftime("%Y"),
66
+ }
67
+
68
+ response = post(BASE_ENDPOINT + TRANSACTIONS_ENDPOINT, fields)
31
69
 
32
70
  html_doc = Nokogiri::HTML(response)
33
71
 
34
- html_transactions = html_doc.css('ul#listamovimiento li')
72
+ html_transactions = html_doc.css('table#tablaDin_tabla tbody tr')
35
73
 
36
- # puts html_transactions[0]
37
- html_transactions.each do |x|
38
- puts x.css('div.fechaimagen span').text
39
- puts x.css('div.altoMaximo').text
40
- puts x.css('div.importesproductosflecha_md').text
74
+ html_transactions.each do |x|
75
+ date = x.css('td.fecha')[0].text
76
+ description = x.css('td')[2].text
77
+ amount = x.css('td.numero').text.gsub(/\s+|\.|,/, "")
78
+
79
+ data = {'description' => description, 'amount' => amount, 'operationDate' => date, 'currency' => account.currency}
80
+ transactions.push(build_transaction(data, account));
41
81
  end
42
82
 
83
+ transactions
43
84
  end
44
85
 
45
86
  private
46
87
 
47
88
  def login
48
- fields = [
49
- Curl::PostField.content('bkcache',''),
50
- Curl::PostField.content('destino', ''),
51
- Curl::PostField.content(@id_field, 'username,password,psi'),
52
- Curl::PostField.content(@login_field,@login_param)
53
- ]
89
+ fields = {
90
+ 'bkcache' => '',
91
+ 'destino' => 'ebk+opr+extractointegral',
92
+ @id_field => 'username,password,psi',
93
+ @login_field => @login_param
94
+ }
54
95
 
55
96
  response = post(BASE_ENDPOINT + LOGIN_ENDPOINT, fields)
56
97
 
57
- @dashboard_doc = Nokogiri::HTML(response)
58
-
59
- @transactions_endpoint = @dashboard_doc.xpath('//div[@class="floatIzquierdo_md"]/form/@action')[0];
98
+ response = get(BASE_ENDPOINT + '/www/es-es/cgi/ebk+opr+extractointegral')
60
99
 
100
+ @dashboard_doc = Nokogiri::HTML(response, nil, "ISO-8859-1")
61
101
  end
62
102
 
63
103
  def parse_html(html)
@@ -67,7 +107,6 @@ module BankScrap
67
107
 
68
108
  html_form = html_doc.css('form#fLogSecurity')
69
109
  #TODO: Check if form is present if not retry initialize cookie for 5 attemps
70
-
71
110
  @id_field = html_form.xpath('input[3]/@id')
72
111
 
73
112
  js_source = 'var document = {};' + html_form.text
@@ -83,5 +122,31 @@ module BankScrap
83
122
 
84
123
  @login_param = js_context.call(js_function, @user, @password, psi_actions)
85
124
  end
125
+
126
+ def build_account(data)
127
+ Account.new(
128
+ bank: self,
129
+ id: data['id'],
130
+ balance: data['availableBalance'],
131
+ currency: data['currency'],
132
+ description: data['description'],
133
+ iban: data['iban']
134
+ )
135
+ end
136
+
137
+ def build_transaction(data, account)
138
+ amount = Money.new(data['amount'], data['currency'])
139
+ balance = data['accountBalanceAfterMovement'] ? Money.new(data['accountBalanceAfterMovement'] * 100, data['currency']) : nil
140
+
141
+ Transaction.new(
142
+ account: account,
143
+ id: data['id'],
144
+ amount: amount,
145
+ description: data['conceptDescription'] || data['description'],
146
+ effective_date: Date.strptime(data['operationDate'], "%d-%m-%Y"),
147
+ currency: data['currency'],
148
+ balance: balance
149
+ )
150
+ end
86
151
  end
87
152
  end
@@ -1,3 +1,3 @@
1
1
  module BankScrap
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bank_scrap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ismael Sánchez
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2015-02-05 00:00:00.000000000 Z
14
+ date: 2015-02-08 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler