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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7e07ddabb163c0283055e9b48996e8a03bff8db6
4
- data.tar.gz: d0bc91897c4c607e61de130ca32ac10118140283
3
+ metadata.gz: 8aa6ea0f009804787942dd42adff98aef36dd601
4
+ data.tar.gz: a137f771dfd1eee094edbd9f71d74cbc02cce20f
5
5
  SHA512:
6
- metadata.gz: 67cd5e951a7701884e44fc40990b9f7d17afdc84e0928c496f7789b057b9c09a27667452dc364b5f96e575e943c6db4bcdb8ff01d78a154933551de3ee5063d6
7
- data.tar.gz: 086880bb1048f771821aa16e63620e6c509e4574dd5aac83e497ce8066aeaba76f796d99f133991c2b5c0eadb2436b691a4a888eacd356c62ff720a5940405af
6
+ metadata.gz: e0b08d23ebcd36680a143636d1f7eb5452b28049bee9f17b2e5b42548fa016f1627f3358216f5dcfe51c1ea7afdfa0b53129c83e76d5be4a035f8c0c0604819a
7
+ data.tar.gz: 558ce9735baad049a50360b48b66b13755a28365347cde5577c0625492f283522b59193a45d390af25cb6b4bd55c90f7d80b3c673ae9293a7dbaebfc52284627
data/.gitignore CHANGED
@@ -12,3 +12,6 @@
12
12
  *.o
13
13
  *.a
14
14
  mkmf.log
15
+
16
+ # MAC OS X files
17
+ .DS_Store
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
- Work in progress:
12
- - ING
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 "bundler", "~> 1.7"
24
- spec.add_development_dependency "rake", "~> 10.0"
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
@@ -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
@@ -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
@@ -1,3 +1,3 @@
1
1
  module BankScrap
2
- VERSION = "0.0.5"
2
+ VERSION = "0.0.6"
3
3
  end
data/lib/bank_scrap.rb CHANGED
@@ -7,4 +7,5 @@ module BankScrap
7
7
  # constant is used for the first time
8
8
  autoload :Bankinter, 'bank_scrap/banks/bankinter'
9
9
  autoload :Bbva, 'bank_scrap/banks/bbva'
10
+ autoload :Ing, 'bank_scrap/banks/ing'
10
11
  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.5
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: