bank_scrap 0.0.5 → 0.0.6
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/.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:
|