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 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: