bank_api 0.3.4 → 0.4.0
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 +4 -4
- data/Gemfile.lock +21 -5
- data/bank_api.gemspec +1 -0
- data/lib/bank_api.rb +4 -0
- data/lib/bank_api/clients/banco_de_chile_company_client.rb +60 -51
- data/lib/bank_api/clients/banco_security/company_client.rb +9 -0
- data/lib/bank_api/clients/banco_security/concerns/balance.rb +35 -0
- data/lib/bank_api/clients/navigation/banco_security/company_navigation.rb +17 -0
- data/lib/bank_api/exceptions.rb +3 -0
- data/lib/bank_api/version.rb +1 -1
- metadata +17 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 165cb735e2871a94d6767c41ba7fe0ad18e5dfe81dab404fb997f2881eefc279
|
4
|
+
data.tar.gz: 49431a70b4e18686ac0c2a600233493266f7d7cd2e41531424bedacf29a65e4b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b6098dd8ae93f1bf1c90494550ae8261d9cbe317d03201c740abca1984f52041bffa5a4e311bc84fb9be985647163caf6ad8e875d23585bb81aa03bb6823f354
|
7
|
+
data.tar.gz: d9b825d50ed7ad44fe5c95ee8913138c77f1a10546388aa766221a847662aed4c2b393cb2426d1306d697cbc904fc533269d7b4630c7e735d976a588e7c7aa76
|
data/Gemfile.lock
CHANGED
@@ -1,8 +1,9 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
bank_api (0.
|
4
|
+
bank_api (0.4.0)
|
5
5
|
pincers
|
6
|
+
rest-client
|
6
7
|
timezone (~> 1.0)
|
7
8
|
|
8
9
|
GEM
|
@@ -13,10 +14,18 @@ GEM
|
|
13
14
|
ffi (~> 1.0, >= 1.0.11)
|
14
15
|
coderay (1.1.2)
|
15
16
|
diff-lcs (1.3)
|
16
|
-
|
17
|
+
domain_name (0.5.20180417)
|
18
|
+
unf (>= 0.0.5, < 1.0.0)
|
19
|
+
ffi (1.9.25)
|
20
|
+
http-cookie (1.0.3)
|
21
|
+
domain_name (~> 0.5)
|
17
22
|
method_source (0.9.0)
|
23
|
+
mime-types (3.1)
|
24
|
+
mime-types-data (~> 3.2015)
|
25
|
+
mime-types-data (3.2016.0521)
|
18
26
|
mini_portile2 (2.3.0)
|
19
|
-
|
27
|
+
netrc (0.11.0)
|
28
|
+
nokogiri (1.8.4)
|
20
29
|
mini_portile2 (~> 2.3.0)
|
21
30
|
pincers (0.7.12)
|
22
31
|
nokogiri (~> 1.6)
|
@@ -28,6 +37,10 @@ GEM
|
|
28
37
|
byebug (~> 10.0)
|
29
38
|
pry (~> 0.10)
|
30
39
|
rake (10.5.0)
|
40
|
+
rest-client (2.0.2)
|
41
|
+
http-cookie (>= 1.0.2, < 2.0)
|
42
|
+
mime-types (>= 1.16, < 4.0)
|
43
|
+
netrc (~> 0.8)
|
31
44
|
rspec (3.7.0)
|
32
45
|
rspec-core (~> 3.7.0)
|
33
46
|
rspec-expectations (~> 3.7.0)
|
@@ -46,8 +59,11 @@ GEM
|
|
46
59
|
childprocess (~> 0.5)
|
47
60
|
rubyzip (~> 1.0)
|
48
61
|
websocket (~> 1.0)
|
49
|
-
timezone (1.2.
|
50
|
-
|
62
|
+
timezone (1.2.12)
|
63
|
+
unf (0.1.4)
|
64
|
+
unf_ext
|
65
|
+
unf_ext (0.0.7.5)
|
66
|
+
websocket (1.2.8)
|
51
67
|
|
52
68
|
PLATFORMS
|
53
69
|
ruby
|
data/bank_api.gemspec
CHANGED
data/lib/bank_api.rb
CHANGED
@@ -26,6 +26,10 @@ module BankApi
|
|
26
26
|
end
|
27
27
|
|
28
28
|
module BancoSecurity
|
29
|
+
def self.get_account_balance(account_number)
|
30
|
+
Clients::BancoSecurity::CompanyClient.new(BankApi.configuration).get_balance(account_number)
|
31
|
+
end
|
32
|
+
|
29
33
|
def self.get_recent_company_deposits
|
30
34
|
Clients::BancoSecurity::CompanyClient.new(BankApi.configuration).get_recent_deposits
|
31
35
|
end
|
@@ -1,3 +1,4 @@
|
|
1
|
+
require 'rest-client'
|
1
2
|
require 'timezone'
|
2
3
|
|
3
4
|
require 'bank_api/clients/base_client'
|
@@ -6,8 +7,7 @@ module BankApi::Clients
|
|
6
7
|
class BancoDeChileCompanyClient < BaseClient
|
7
8
|
COMPANY_LOGIN_URL = 'https://www.empresas.bancochile.cl/cgi-bin/navega?pagina=enlinea/login_fus'
|
8
9
|
COMPANY_DEPOSITS_URL = 'https://www.empresas.bancochile.cl/GlosaInternetEmpresaRecibida/ConsultaRecibidaAction.do'
|
9
|
-
|
10
|
-
TABLE_OFFSET = 1
|
10
|
+
COMPANY_DEPOSITS_TXT_URL = 'https://www.empresas.bancochile.cl/GlosaInternetEmpresaRecibida/RespuestaConsultaRecibidaAction.do'
|
11
11
|
|
12
12
|
DATE_COLUMN = 0
|
13
13
|
RUT_COLUMN = 4
|
@@ -39,18 +39,11 @@ module BankApi::Clients
|
|
39
39
|
|
40
40
|
def get_deposits
|
41
41
|
login
|
42
|
-
deposits_first_try = get_deposits_try
|
43
|
-
deposits_second_try = get_deposits_try
|
44
|
-
deposits_first_try == deposits_second_try ? deposits_first_try : []
|
45
|
-
ensure
|
46
|
-
browser.close
|
47
|
-
end
|
48
|
-
|
49
|
-
def get_deposits_try
|
50
42
|
goto_deposits
|
51
43
|
select_deposits_range
|
52
|
-
|
53
|
-
|
44
|
+
deposits = deposits_from_txt
|
45
|
+
browser.close
|
46
|
+
deposits
|
54
47
|
end
|
55
48
|
|
56
49
|
def login
|
@@ -80,14 +73,7 @@ module BankApi::Clients
|
|
80
73
|
end
|
81
74
|
|
82
75
|
def select_deposits_range
|
83
|
-
|
84
|
-
range_start = (
|
85
|
-
timezone.utc_to_local(Time.now).to_date - @days_to_check
|
86
|
-
).strftime("%d/%m/%Y")
|
87
|
-
browser.search('input[name=initDate]').set(range_start)
|
88
|
-
end
|
89
|
-
|
90
|
-
def submit_deposits_form
|
76
|
+
browser.search('input[name=initDate]').set(deposit_range[:start])
|
91
77
|
browser.search('#consultar').click
|
92
78
|
end
|
93
79
|
|
@@ -95,46 +81,69 @@ module BankApi::Clients
|
|
95
81
|
browser.search('table#sin_datos').count.zero?
|
96
82
|
end
|
97
83
|
|
98
|
-
def
|
99
|
-
|
100
|
-
|
101
|
-
|
84
|
+
def total_results
|
85
|
+
browser.search("#pager .encabezadotabla:contains(\"Operaciones encontradas\")")
|
86
|
+
.text[/\d+/].to_i
|
87
|
+
end
|
102
88
|
|
103
|
-
|
89
|
+
def deposits_from_txt
|
90
|
+
return [] unless any_deposits?
|
91
|
+
response = RestClient.post(
|
92
|
+
COMPANY_DEPOSITS_TXT_URL,
|
93
|
+
deposits_params(deposit_range[:start], deposit_range[:end]),
|
94
|
+
session_headers
|
95
|
+
)
|
96
|
+
transactions = split_transactions(response.body)
|
97
|
+
format_transactions(transactions)
|
98
|
+
end
|
104
99
|
|
105
|
-
|
106
|
-
|
107
|
-
|
100
|
+
def split_transactions(transactions_str)
|
101
|
+
transactions_str.delete("\r").split("\n").drop(1).map { |r| r.split(";") }.select do |t|
|
102
|
+
t[STATE_COLUMN] == "Aprobada"
|
108
103
|
end
|
104
|
+
end
|
109
105
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
if ((index - TABLE_OFFSET) % NUMBER_OF_COLUMNS) == RUT_COLUMN
|
118
|
-
deposit[:rut] = div.text
|
119
|
-
elsif ((index - TABLE_OFFSET) % NUMBER_OF_COLUMNS) == DATE_COLUMN
|
120
|
-
deposit[:date] = Date.parse div.text
|
121
|
-
elsif ((index - TABLE_OFFSET) % NUMBER_OF_COLUMNS) == AMOUNT_COLUMN
|
122
|
-
deposit[:amount] = div.text.delete(',')
|
123
|
-
elsif ((index - TABLE_OFFSET) % NUMBER_OF_COLUMNS) == STATE_COLUMN
|
124
|
-
deposits << deposit if div.text == 'Aprobada'
|
125
|
-
deposit = {}
|
126
|
-
end
|
106
|
+
def format_transactions(transactions)
|
107
|
+
transactions.map do |t|
|
108
|
+
{
|
109
|
+
rut: t[RUT_COLUMN],
|
110
|
+
date: Date.parse(t[DATE_COLUMN]),
|
111
|
+
amount: t[AMOUNT_COLUMN].to_i
|
112
|
+
}
|
127
113
|
end
|
128
|
-
deposits
|
129
114
|
end
|
130
115
|
|
131
|
-
def
|
132
|
-
|
116
|
+
def deposits_params(from_date, to_date)
|
117
|
+
{
|
118
|
+
'accion' => 'exportarTxtOperaciones',
|
119
|
+
'initDate' => from_date,
|
120
|
+
'endDate' => to_date,
|
121
|
+
'ctaCorriente' => 'TODAS',
|
122
|
+
'nada' => 'nada'
|
123
|
+
}
|
133
124
|
end
|
134
125
|
|
135
|
-
def
|
136
|
-
|
137
|
-
|
126
|
+
def session_headers
|
127
|
+
{
|
128
|
+
"Cookie" => "JSESSIONID=#{cookie('JSESSIONID')}; token=#{cookie('token')}",
|
129
|
+
"Content-Type" => "application/x-www-form-urlencoded",
|
130
|
+
"Accept" => "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/" +
|
131
|
+
"apng,*/*;q=0.8",
|
132
|
+
"Referer" => "https://www.empresas.bancochile.cl/GlosaInternetEmpresaRecibida/" +
|
133
|
+
"RespuestaConsultaRecibidaAction.do"
|
134
|
+
}
|
135
|
+
end
|
136
|
+
|
137
|
+
def cookie(name)
|
138
|
+
selenium_browser.manage.cookie_named(name)[:value]
|
139
|
+
end
|
140
|
+
|
141
|
+
def deposit_range
|
142
|
+
@deposit_range ||= begin
|
143
|
+
timezone = Timezone['America/Santiago']
|
144
|
+
today = timezone.utc_to_local(Time.now).to_date
|
145
|
+
{ start: (today - @days_to_check).strftime("%d/%m/%Y"), end: today.strftime("%d/%m/%Y") }
|
146
|
+
end
|
138
147
|
end
|
139
148
|
end
|
140
149
|
end
|
@@ -2,6 +2,7 @@ require 'cgi'
|
|
2
2
|
require 'timezone'
|
3
3
|
|
4
4
|
require 'bank_api/clients/base_client'
|
5
|
+
require 'bank_api/clients/banco_security/concerns/balance'
|
5
6
|
require 'bank_api/clients/banco_security/concerns/deposits'
|
6
7
|
require 'bank_api/clients/banco_security/concerns/login'
|
7
8
|
require 'bank_api/clients/banco_security/concerns/transfers'
|
@@ -11,6 +12,7 @@ require 'bank_api/utils/banco_security'
|
|
11
12
|
module BankApi::Clients::BancoSecurity
|
12
13
|
class CompanyClient < BankApi::Clients::BaseClient
|
13
14
|
include BankApi::Clients::Navigation::BancoSecurity::CompanyNavigation
|
15
|
+
include BankApi::Clients::BancoSecurity::Balance
|
14
16
|
include BankApi::Clients::BancoSecurity::Deposits
|
15
17
|
include BankApi::Clients::BancoSecurity::Transfers
|
16
18
|
include BankApi::Clients::BancoSecurity::Login
|
@@ -28,6 +30,13 @@ module BankApi::Clients::BancoSecurity
|
|
28
30
|
:security
|
29
31
|
end
|
30
32
|
|
33
|
+
def get_balance(account_number)
|
34
|
+
login
|
35
|
+
goto_company_dashboard
|
36
|
+
goto_balance
|
37
|
+
find_account_balance(account_number)
|
38
|
+
end
|
39
|
+
|
31
40
|
def get_deposits
|
32
41
|
login
|
33
42
|
goto_company_dashboard
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
|
3
|
+
module BankApi::Clients::BancoSecurity
|
4
|
+
module Balance
|
5
|
+
ACCOUNT_NUMBER_COLUMN = 0
|
6
|
+
AVAILABLE_BALANCE_COLUMN = 1
|
7
|
+
COUNTABLE_BALANCE_COLUMN = 2
|
8
|
+
|
9
|
+
def find_account_balance(account_number)
|
10
|
+
balance = browser.search(".cuentas-corrientes").search("tbody tr").map do |row|
|
11
|
+
cells = row.search("td")
|
12
|
+
{
|
13
|
+
account_number: cells[ACCOUNT_NUMBER_COLUMN].text,
|
14
|
+
available_balance: money_to_i(cells[AVAILABLE_BALANCE_COLUMN].text),
|
15
|
+
countable_balance: money_to_i(cells[COUNTABLE_BALANCE_COLUMN].text)
|
16
|
+
}
|
17
|
+
end.find do |row|
|
18
|
+
row[:account_number] == account_number
|
19
|
+
end
|
20
|
+
validate_balance(balance, account_number)
|
21
|
+
balance
|
22
|
+
end
|
23
|
+
|
24
|
+
def money_to_i(text)
|
25
|
+
text.delete(".").delete("$").delete(" ").to_i
|
26
|
+
end
|
27
|
+
|
28
|
+
def validate_balance(balance, account_number)
|
29
|
+
if balance.nil?
|
30
|
+
raise BankApi::Balance::InvalidAccountNumber, "Couldn't find balance of account " +
|
31
|
+
account_number.to_s
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -50,6 +50,23 @@ module BankApi::Clients::Navigation
|
|
50
50
|
wait('a.k-link:contains("Recibidas")').click
|
51
51
|
end
|
52
52
|
|
53
|
+
def goto_balance
|
54
|
+
goto_frame query: '#topFrame'
|
55
|
+
selenium_browser.execute_script(
|
56
|
+
"MM_goToURL('parent.frames[\\'topFrame\\']','../menu/MenuTopInicio.asp'," +
|
57
|
+
"'parent.frames[\\'leftFrame\\']','../menu/MenuInicio.asp'," +
|
58
|
+
"'parent.frames[\\'mainFrame\\']','../../../noticias/arriba_noticias.asp');" +
|
59
|
+
"return document.MM_returnValue;"
|
60
|
+
)
|
61
|
+
selenium_browser.execute_script(
|
62
|
+
"MM_goToURL('parent.frames[\\'mainFrame\\']'," +
|
63
|
+
"'/empresas/RedirectConvivencia.asp?urlRedirect" +
|
64
|
+
"=Cartola/Home/CartolaOrSaldoCuentaCorriente')"
|
65
|
+
)
|
66
|
+
goto_frame query: '#mainFrame'
|
67
|
+
goto_frame query: 'iframe[name="central"]', should_reset: false
|
68
|
+
end
|
69
|
+
|
53
70
|
def goto_transfer_form
|
54
71
|
goto_frame query: '#topFrame'
|
55
72
|
selenium_browser.execute_script(
|
data/lib/bank_api/exceptions.rb
CHANGED
data/lib/bank_api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bank_api
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- oaestay
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-
|
11
|
+
date: 2018-08-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pincers
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rest-client
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: timezone
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -131,6 +145,7 @@ files:
|
|
131
145
|
- lib/bank_api.rb
|
132
146
|
- lib/bank_api/clients/banco_de_chile_company_client.rb
|
133
147
|
- lib/bank_api/clients/banco_security/company_client.rb
|
148
|
+
- lib/bank_api/clients/banco_security/concerns/balance.rb
|
134
149
|
- lib/bank_api/clients/banco_security/concerns/deposits.rb
|
135
150
|
- lib/bank_api/clients/banco_security/concerns/login.rb
|
136
151
|
- lib/bank_api/clients/banco_security/concerns/transfers.rb
|