bank_scrap 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/README.md +4 -4
- data/bank_scrap.gemspec +4 -2
- data/lib/bank_scrap/bank.rb +9 -3
- data/lib/bank_scrap/banks/ing/numbers/pinpad0.png +0 -0
- data/lib/bank_scrap/banks/ing/numbers/pinpad1.png +0 -0
- data/lib/bank_scrap/banks/ing/numbers/pinpad2.png +0 -0
- data/lib/bank_scrap/banks/ing/numbers/pinpad3.png +0 -0
- data/lib/bank_scrap/banks/ing/numbers/pinpad4.png +0 -0
- data/lib/bank_scrap/banks/ing/numbers/pinpad5.png +0 -0
- data/lib/bank_scrap/banks/ing/numbers/pinpad6.png +0 -0
- data/lib/bank_scrap/banks/ing/numbers/pinpad7.png +0 -0
- data/lib/bank_scrap/banks/ing/numbers/pinpad8.png +0 -0
- data/lib/bank_scrap/banks/ing/numbers/pinpad9.png +0 -0
- data/lib/bank_scrap/banks/ing.rb +154 -0
- data/lib/bank_scrap/version.rb +1 -1
- data/lib/bank_scrap.rb +1 -0
- metadata +41 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8aa6ea0f009804787942dd42adff98aef36dd601
|
4
|
+
data.tar.gz: a137f771dfd1eee094edbd9f71d74cbc02cce20f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e0b08d23ebcd36680a143636d1f7eb5452b28049bee9f17b2e5b42548fa016f1627f3358216f5dcfe51c1ea7afdfa0b53129c83e76d5be4a035f8c0c0604819a
|
7
|
+
data.tar.gz: 558ce9735baad049a50360b48b66b13755a28365347cde5577c0625492f283522b59193a45d390af25cb6b4bd55c90f7d80b3c673ae9293a7dbaebfc52284627
|
data/.gitignore
CHANGED
data/README.md
CHANGED
@@ -5,11 +5,11 @@ Ruby gem to extract balance and transactions from banks. You can use it either a
|
|
5
5
|
Feel free to contribute and add your bank if it isn't supported.
|
6
6
|
|
7
7
|
## Supported banks
|
8
|
-
- Bankinter
|
9
|
-
- BBVA (only balance, transactions soon)
|
10
8
|
|
11
|
-
|
12
|
-
|
9
|
+
| | Bankinter | BBVA | ING Direct |
|
10
|
+
|--------------|:---------:|:------:|:----------:|
|
11
|
+
| Balance | ✓ | ✓ | ✓ |
|
12
|
+
| Transactions | WIP | WIP | ✘ |
|
13
13
|
|
14
14
|
Interested in any other bank? Open a new Issue and we'll try to help.
|
15
15
|
|
data/bank_scrap.gemspec
CHANGED
@@ -20,12 +20,14 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.required_ruby_version = '~> 2.1'
|
22
22
|
|
23
|
-
spec.add_development_dependency
|
24
|
-
spec.add_development_dependency
|
23
|
+
spec.add_development_dependency 'bundler', '~> 1.7'
|
24
|
+
spec.add_development_dependency 'rake', '~> 10.0'
|
25
|
+
spec.add_development_dependency 'byebug', '~> 3.5.1'
|
25
26
|
|
26
27
|
spec.add_dependency 'thor', "~> 0.19"
|
27
28
|
spec.add_dependency 'nokogiri', "~> 1.6"
|
28
29
|
spec.add_dependency 'execjs', "~> 2.2"
|
29
30
|
spec.add_dependency 'curb', "~> 0.8"
|
30
31
|
spec.add_dependency 'activesupport', "~> 4.1"
|
32
|
+
spec.add_dependency 'rmagick', "~> 2.2.2"
|
31
33
|
end
|
data/lib/bank_scrap/bank.rb
CHANGED
@@ -26,8 +26,15 @@ module BankScrap
|
|
26
26
|
@curl.body_str
|
27
27
|
end
|
28
28
|
|
29
|
+
def put(url, fields)
|
30
|
+
@curl.url = url
|
31
|
+
|
32
|
+
@curl.put(fields)
|
33
|
+
@curl.body_str
|
34
|
+
end
|
35
|
+
|
29
36
|
def set_header(name, value)
|
30
|
-
@curl.headers[name] = value
|
37
|
+
@curl.headers[name] = value
|
31
38
|
end
|
32
39
|
|
33
40
|
def set_headers(headers)
|
@@ -45,8 +52,7 @@ module BankScrap
|
|
45
52
|
@curl.get
|
46
53
|
|
47
54
|
@curl.body_str
|
48
|
-
|
49
|
-
end
|
55
|
+
end
|
50
56
|
|
51
57
|
def initialize_connection
|
52
58
|
@curl = Curl::Easy.new
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1,154 @@
|
|
1
|
+
require 'json'
|
2
|
+
require 'base64'
|
3
|
+
require 'RMagick'
|
4
|
+
require 'tempfile'
|
5
|
+
|
6
|
+
module BankScrap
|
7
|
+
class Ing < Bank
|
8
|
+
|
9
|
+
BASE_ENDPOINT = 'https://ing.ingdirect.es/'
|
10
|
+
LOGIN_ENDPOINT = BASE_ENDPOINT + 'genoma_login/rest/session'
|
11
|
+
POST_AUTH_ENDPOINT = BASE_ENDPOINT + 'genoma_api/login/auth/response'
|
12
|
+
CLIENT_ENDPOINT = BASE_ENDPOINT + 'genoma_api/rest/client'
|
13
|
+
PRODUCTS_ENDPOINT = BASE_ENDPOINT + 'genoma_api/rest/products'
|
14
|
+
|
15
|
+
SAMPLE_WIDTH = 30
|
16
|
+
SAMPLE_HEIGHT = 30
|
17
|
+
|
18
|
+
def initialize(user, password, log: false, debug: false, extra_args:)
|
19
|
+
@dni = user
|
20
|
+
@password = password.to_s
|
21
|
+
@birthday = extra_args['birthday']
|
22
|
+
@log = log
|
23
|
+
@debug = debug
|
24
|
+
|
25
|
+
initialize_connection
|
26
|
+
bundled_login
|
27
|
+
get_products
|
28
|
+
end
|
29
|
+
|
30
|
+
def get_balance
|
31
|
+
log 'get_balance'
|
32
|
+
balance = {}
|
33
|
+
@data.each do |item|
|
34
|
+
balance[item['name']] = item['balance']
|
35
|
+
end
|
36
|
+
|
37
|
+
balance
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def bundled_login
|
43
|
+
selected_positions = login
|
44
|
+
ticket = pass_pinpad(selected_positions)
|
45
|
+
post_auth(ticket)
|
46
|
+
end
|
47
|
+
|
48
|
+
def login
|
49
|
+
set_headers({
|
50
|
+
"Accept" => 'application/json, text/javascript, */*; q=0.01',
|
51
|
+
'Content-Type' => 'application/json; charset=utf-8'
|
52
|
+
})
|
53
|
+
|
54
|
+
param = '{' +
|
55
|
+
'"loginDocument":{' +
|
56
|
+
'"documentType":0,"document":"' + @dni.to_s +
|
57
|
+
'"},' +
|
58
|
+
'"birthday":"' + @birthday.to_s + '",' +
|
59
|
+
'"companyDocument":null,' +
|
60
|
+
'"device":"desktop"}' +
|
61
|
+
'}'
|
62
|
+
|
63
|
+
response = JSON.parse(post(LOGIN_ENDPOINT, param))
|
64
|
+
positions = response['pinPositions']
|
65
|
+
pinpad = response['pinpad']
|
66
|
+
|
67
|
+
pinpad_numbers_paths = save_pinpad_numbers(pinpad)
|
68
|
+
pinpad_numbers = recognize_pinpad_numbers(pinpad_numbers_paths)
|
69
|
+
|
70
|
+
get_correct_positions(pinpad_numbers, positions)
|
71
|
+
end
|
72
|
+
|
73
|
+
def pass_pinpad(positions)
|
74
|
+
set_headers({
|
75
|
+
"Accept" => 'application/json, text/javascript, */*; q=0.01',
|
76
|
+
'Content-Type' => 'application/json; charset=utf-8'
|
77
|
+
})
|
78
|
+
|
79
|
+
param = "{\"pinPositions\": #{positions}}"
|
80
|
+
response = put(LOGIN_ENDPOINT, param)
|
81
|
+
JSON.parse(response)['ticket']
|
82
|
+
end
|
83
|
+
|
84
|
+
def post_auth(ticket)
|
85
|
+
set_headers({
|
86
|
+
"Accept" => 'application/json, text/javascript, */*; q=0.01',
|
87
|
+
'Content-Type' => 'application/x-www-form-urlencoded; charset=UTF-8'
|
88
|
+
})
|
89
|
+
|
90
|
+
param = "ticket=#{ticket}&device=desktop"
|
91
|
+
post(POST_AUTH_ENDPOINT, param)
|
92
|
+
end
|
93
|
+
|
94
|
+
def get_products
|
95
|
+
set_headers({
|
96
|
+
"Accept" => '*/*',
|
97
|
+
'Content-Type' => 'application/json; charset=utf-8'
|
98
|
+
})
|
99
|
+
|
100
|
+
@data = JSON.parse(get(PRODUCTS_ENDPOINT))
|
101
|
+
end
|
102
|
+
|
103
|
+
def save_pinpad_numbers(pinpad)
|
104
|
+
pinpad_numbers_paths = []
|
105
|
+
pinpad.each_with_index do |digit,index|
|
106
|
+
tmp = Tempfile.new(["pinpad_number_#{index}__", '.png'])
|
107
|
+
File.open(tmp.path, 'wb'){ |f| f.write(Base64.decode64(digit)) }
|
108
|
+
pinpad_numbers_paths << tmp.path
|
109
|
+
end
|
110
|
+
|
111
|
+
pinpad_numbers_paths
|
112
|
+
end
|
113
|
+
|
114
|
+
def recognize_pinpad_numbers(pinpad_numbers_paths)
|
115
|
+
pinpad_numbers = []
|
116
|
+
pinpad_images = Magick::ImageList.new(*pinpad_numbers_paths)
|
117
|
+
0.upto(9) do |i|
|
118
|
+
single_number = pinpad_images[i]
|
119
|
+
differences = []
|
120
|
+
0.upto(9) do |j|
|
121
|
+
pinpad_pixels_sample = single_number.get_pixels(0,0, SAMPLE_WIDTH, SAMPLE_HEIGHT)
|
122
|
+
|
123
|
+
img = Magick::ImageList.new("lib/bank_scrap/banks/ing/numbers/pinpad#{j}.png").first
|
124
|
+
number_pixels_sample = img.get_pixels(0, 0, SAMPLE_WIDTH, SAMPLE_HEIGHT)
|
125
|
+
diff = 0
|
126
|
+
pinpad_pixels_sample.each_with_index do |pixel, index|
|
127
|
+
sample_pixel = number_pixels_sample[index]
|
128
|
+
diff += (pixel.red - sample_pixel.red).abs +
|
129
|
+
(pixel.green - sample_pixel.green).abs +
|
130
|
+
(pixel.blue - sample_pixel.blue).abs
|
131
|
+
end
|
132
|
+
differences << diff
|
133
|
+
end
|
134
|
+
|
135
|
+
real_number = differences.each_with_index.min.last
|
136
|
+
pinpad_numbers << real_number
|
137
|
+
end
|
138
|
+
|
139
|
+
pinpad_numbers
|
140
|
+
end
|
141
|
+
|
142
|
+
def get_correct_positions(pinpad_numbers, positions)
|
143
|
+
first_digit = @password[positions[0] - 1]
|
144
|
+
second_digit = @password[positions[1] - 1]
|
145
|
+
third_digit = @password[positions[2] - 1]
|
146
|
+
|
147
|
+
[
|
148
|
+
pinpad_numbers.index(first_digit.to_i),
|
149
|
+
pinpad_numbers.index(second_digit.to_i),
|
150
|
+
pinpad_numbers.index(third_digit.to_i)
|
151
|
+
]
|
152
|
+
end
|
153
|
+
end
|
154
|
+
end
|
data/lib/bank_scrap/version.rb
CHANGED
data/lib/bank_scrap.rb
CHANGED
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.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ismael Sánchez
|
@@ -41,6 +41,20 @@ dependencies:
|
|
41
41
|
- - "~>"
|
42
42
|
- !ruby/object:Gem::Version
|
43
43
|
version: '10.0'
|
44
|
+
- !ruby/object:Gem::Dependency
|
45
|
+
name: byebug
|
46
|
+
requirement: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - "~>"
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: 3.5.1
|
51
|
+
type: :development
|
52
|
+
prerelease: false
|
53
|
+
version_requirements: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - "~>"
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: 3.5.1
|
44
58
|
- !ruby/object:Gem::Dependency
|
45
59
|
name: thor
|
46
60
|
requirement: !ruby/object:Gem::Requirement
|
@@ -111,6 +125,20 @@ dependencies:
|
|
111
125
|
- - "~>"
|
112
126
|
- !ruby/object:Gem::Version
|
113
127
|
version: '4.1'
|
128
|
+
- !ruby/object:Gem::Dependency
|
129
|
+
name: rmagick
|
130
|
+
requirement: !ruby/object:Gem::Requirement
|
131
|
+
requirements:
|
132
|
+
- - "~>"
|
133
|
+
- !ruby/object:Gem::Version
|
134
|
+
version: 2.2.2
|
135
|
+
type: :runtime
|
136
|
+
prerelease: false
|
137
|
+
version_requirements: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - "~>"
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: 2.2.2
|
114
142
|
description: Command line tools to get bank account details from some banks.
|
115
143
|
email:
|
116
144
|
- root@ismagnu.com
|
@@ -130,6 +158,17 @@ files:
|
|
130
158
|
- lib/bank_scrap/bank.rb
|
131
159
|
- lib/bank_scrap/banks/bankinter.rb
|
132
160
|
- lib/bank_scrap/banks/bbva.rb
|
161
|
+
- lib/bank_scrap/banks/ing.rb
|
162
|
+
- lib/bank_scrap/banks/ing/numbers/pinpad0.png
|
163
|
+
- lib/bank_scrap/banks/ing/numbers/pinpad1.png
|
164
|
+
- lib/bank_scrap/banks/ing/numbers/pinpad2.png
|
165
|
+
- lib/bank_scrap/banks/ing/numbers/pinpad3.png
|
166
|
+
- lib/bank_scrap/banks/ing/numbers/pinpad4.png
|
167
|
+
- lib/bank_scrap/banks/ing/numbers/pinpad5.png
|
168
|
+
- lib/bank_scrap/banks/ing/numbers/pinpad6.png
|
169
|
+
- lib/bank_scrap/banks/ing/numbers/pinpad7.png
|
170
|
+
- lib/bank_scrap/banks/ing/numbers/pinpad8.png
|
171
|
+
- lib/bank_scrap/banks/ing/numbers/pinpad9.png
|
133
172
|
- lib/bank_scrap/cli.rb
|
134
173
|
- lib/bank_scrap/version.rb
|
135
174
|
homepage: https://github.com/ismaGNU/bank_scrap
|
@@ -157,3 +196,4 @@ signing_key:
|
|
157
196
|
specification_version: 4
|
158
197
|
summary: Get your bank account details.
|
159
198
|
test_files: []
|
199
|
+
has_rdoc:
|