whv_nz 0.1.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.
@@ -0,0 +1,106 @@
1
+ require 'faraday'
2
+ require 'nokogiri'
3
+
4
+ require 'faraday_middleware'
5
+
6
+ class Webcomm
7
+ def initialize(config, hk_id, logger)
8
+ @hk_id = hk_id
9
+ @logger = logger
10
+ @config = config
11
+
12
+ @conn =
13
+ Faraday.new(:url => 'https://webcomm.paymark.co.nz/hosted/') do |faraday|
14
+ faraday.request :url_encoded
15
+ faraday.response :logger, @logger, { :bodies => false }
16
+
17
+ faraday.use WebcommMiddleware
18
+ faraday.use FaradayMiddleware::Gzip
19
+ faraday.use FaradayMiddleware::FollowRedirects
20
+ faraday.adapter Faraday.default_adapter
21
+ end
22
+ end
23
+
24
+ def pay
25
+ send_request "hk"
26
+ send_request "rm"
27
+ send_request "hkc"
28
+ end
29
+
30
+ def send_request(form)
31
+ @logger.info("Start(webcomm): " + form)
32
+ send form
33
+ @logger.info("Finish(webcomm): " + form)
34
+ rescue Faraday::ClientError => e
35
+ @logger.error(e)
36
+ Rollbar.error(e)
37
+
38
+ retry
39
+ end
40
+
41
+ def hk
42
+ res = @conn.get do |req|
43
+ req.params['hk'] = @hk_id
44
+ end
45
+
46
+ doc = Nokogiri::HTML(res.body)
47
+ @rm_id = doc.xpath('//form').first.attributes["action"].value.split("=").last
48
+
49
+ @logger.info "rm_id: #{@rm_id}"
50
+ end
51
+
52
+ def rm
53
+ res = @conn.post do |req|
54
+ req.params['rm'] = @rm_id
55
+ req.body = {
56
+ "hk" => @hk_id,
57
+ "hosted_responsive_format" => "N",
58
+ "card_type_MASTERCARD.x" => "54",
59
+ "card_type_MASTERCARD.y" => "15",
60
+ "card_type_MASTERCARD" => "MASTERCARD",
61
+ "processingStage" => "card_entry",
62
+ "future_pay" => "",
63
+ "future_pay_save_only" => ""
64
+ }.to_query
65
+ end
66
+
67
+ form = Nokogiri::HTML(res.body).xpath('//form').first
68
+ @hkc_id = form.attributes["action"].value.split("&").first.split("=").last
69
+
70
+ @logger.info "hkc_id: #{@hkc_id}"
71
+ end
72
+
73
+ def hkc
74
+ if $whv.success
75
+ @logger.info "exit"
76
+ exit 2
77
+ end
78
+
79
+ res = @conn.post do |req|
80
+ req.params['hkc'] = @hkc_id
81
+ req.params['rm'] = @rm_id
82
+
83
+ credit_card = @config["credit_card"]
84
+ req.body = {
85
+ "cardnumber" => credit_card["cardnumber"],
86
+ "use_card_security_code" => "Y",
87
+ "enforce_card_security_code" => "N",
88
+ "enforce_card_security_code_3party" => "Y",
89
+ "enforce_card_security_code_futurepay" => "Y",
90
+ "cardverificationcode" => credit_card["cardverificationcode"],
91
+ "expirymonth" => credit_card["expirymonth"],
92
+ "expiryyear" => credit_card["expiryyear"],
93
+ "hk" => @hk_id,
94
+ "hosted_responsive_format" => "N",
95
+ "cardtype" => "MASTERCARD",
96
+ "future_pay" => "N",
97
+ "future_pay_save_only" => "",
98
+ "cardholder" => credit_card["cardholder"],
99
+ "pay_now" => "Pay Now"
100
+ }.to_query
101
+ end
102
+
103
+ @logger.info res.body
104
+ $whv.data["success"] = true
105
+ end
106
+ end
@@ -0,0 +1,27 @@
1
+ require 'faraday'
2
+
3
+ class WebcommMiddleware < Faraday::Middleware
4
+ def call(request_env)
5
+ request_env[:request_headers].merge!(shared_headers)
6
+
7
+ @app.call(request_env).on_complete do |response_env|
8
+
9
+ end
10
+ end
11
+
12
+ private
13
+ def shared_headers
14
+ headers = {}
15
+
16
+ headers['Host'] = 'webcomm.paymark.co.nz'
17
+ headers['Connection'] = 'keep-alive'
18
+ headers['Cache-Control'] = 'max-age=0'
19
+ headers['Upgrade-Insecure-Requests'] = '1'
20
+ headers['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_5) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36'
21
+ headers['Accept'] = 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
22
+ headers['Accept-Encoding'] = 'gzip, deflate, sdch, br'
23
+ headers['Accept-Language'] = 'en,en-US;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2'
24
+
25
+ headers
26
+ end
27
+ end
data/lib/whv_nz/whv.rb ADDED
@@ -0,0 +1,175 @@
1
+ require 'yaml'
2
+ require 'logger'
3
+ require 'active_support'
4
+ require 'active_support/core_ext'
5
+ require 'pry'
6
+ require 'slop'
7
+ require 'mailgun'
8
+ require 'rollbar'
9
+ require 'sucker_punch'
10
+
11
+ class Whv
12
+
13
+ attr_reader :data, :pages, :online_services
14
+
15
+ def initialize
16
+ @opts = Slop.parse do
17
+ on '-n', '--new', 'Generate config file'
18
+
19
+ on '-c', '--config=', 'Config file path'
20
+
21
+ on '-p', '--production', 'Use real account'
22
+
23
+ on '-d', '--daemon', 'In background'
24
+
25
+ on '-h', '--help', 'Show help info'
26
+ end
27
+ end
28
+
29
+ def start
30
+ begin
31
+ if @opts.daemon?
32
+ ::Process.daemon(true, true)
33
+ start_apply
34
+ elsif @opts.new?
35
+ path = File.dirname(__FILE__) + "/config.yml"
36
+ FileUtils.cp(path, Dir.pwd)
37
+ elsif @opts[:config]
38
+ prestart
39
+ start_apply
40
+ else
41
+ puts @opts
42
+ end
43
+
44
+ exit 0
45
+ rescue StandardError => e
46
+ @logger.fatal(e)
47
+ Rollbar.critical(e)
48
+
49
+ raise e
50
+ end
51
+ end
52
+
53
+ def prestart
54
+ if !Dir.exist?("log")
55
+ Dir.mkdir("log")
56
+ end
57
+
58
+ @data_path = Dir.pwd + "/log/data.yml"
59
+ if !File.exist?(@data_path)
60
+ File.new(@data_path, "w+")
61
+ end
62
+
63
+ @env = @opts.production? ? "production" : "development"
64
+ @file_data = YAML.load(File.read(@data_path)) || {}
65
+
66
+ @data = @file_data[@env] || {}
67
+ @config = YAML.load(File.read(@opts[:config]))[@env]
68
+
69
+ log_path = Dir.pwd + "/log/whv.log"
70
+ logdev = @opts.daemon? ? log_path : "| tee #{log_path}"
71
+ @logger = Logger.new(logdev, 0, 100 * 1024 * 1024)
72
+
73
+ @pages = Pages.new(@data, @config, @logger)
74
+ @online_services = OnlineServices.new(@data, @config, @logger)
75
+
76
+ Rollbar.configure do |config|
77
+ config.access_token = @config["rollbar_token"]
78
+ config.enabled = @config["rollbar_token"]
79
+
80
+ config.use_sucker_punch
81
+ end
82
+
83
+ Signal.trap("INT") {
84
+ save_data
85
+ exit 2
86
+ }
87
+
88
+ Signal.trap("TERM") {
89
+ save_data
90
+ exit 2
91
+ }
92
+ end
93
+
94
+ def save_cookie(cookie)
95
+ @data["cookie"] = cookie
96
+ save_data
97
+
98
+ @logger.info "updated cookie: #{cookie}"
99
+ end
100
+
101
+ def success
102
+ @file_data = YAML.load(File.read(@data_path)) || {}
103
+ @data = @file_data[@env] || {}
104
+
105
+ @data["success"]
106
+ end
107
+
108
+ private
109
+ def submit_forms
110
+ @config["forms"].each do |e|
111
+ thread = Thread.new { @online_services.send_request e }
112
+ thread.join
113
+ end
114
+ end
115
+
116
+ def start_apply
117
+ if !@data["cookie"]
118
+ @pages.open_page "login"
119
+
120
+ @online_services.send_request "login"
121
+ else
122
+ @logger.info "use saved cookie: #{@data["cookie"]}"
123
+ end
124
+
125
+ is_success = false
126
+ while !is_success
127
+ is_success = @online_services.send_request "create"
128
+
129
+ if !is_success
130
+ @pages.open_page "login"
131
+
132
+ @online_services.send_request "login"
133
+ end
134
+ end
135
+
136
+ submit_forms
137
+
138
+ is_submit = false
139
+ while !is_submit
140
+ is_submit = @online_services.send_request "submit"
141
+ end
142
+
143
+ link = ""
144
+ while !link.start_with?("https://webcomm.paymark.co.nz/hosted/?hk=")
145
+ link = @online_services.send_request("on_line_payment") || ""
146
+ end
147
+
148
+ hk_id = URI(link).query.split("=").last
149
+ @logger.info "hk_id: #{hk_id}"
150
+
151
+ webcomm = Webcomm.new(@config, hk_id, @logger)
152
+ webcomm.pay
153
+
154
+ send_notification
155
+ end
156
+
157
+ def send_notification
158
+ if @config["mailgun"]["key"]
159
+ client = Mailgun::Client.new @config["mailgun"]["key"]
160
+
161
+ message_params = { from: @config["mailgun"]["from"],
162
+ to: @config["mailgun"]["to"],
163
+ subject: 'WHV: SUCCESS!',
164
+ text: 'WHV: SUCCESS!'
165
+ }
166
+
167
+ client.send_message '', message_params
168
+ end
169
+ end
170
+
171
+ def save_data
172
+ @file_data[@env] = @data
173
+ File.write(@data_path, @file_data.to_yaml)
174
+ end
175
+ end
data/lib/whv_nz.rb ADDED
@@ -0,0 +1,14 @@
1
+ require "whv_nz/version"
2
+
3
+ require 'whv_nz/online_services_middleware.rb'
4
+ require 'whv_nz/online_services.rb'
5
+
6
+ require 'whv_nz/webcomm_middleware.rb'
7
+ require 'whv_nz/webcomm.rb'
8
+
9
+ require 'whv_nz/pages.rb'
10
+ require "whv_nz/whv"
11
+
12
+ module WhvNz
13
+
14
+ end
data/whv_nz.gemspec ADDED
@@ -0,0 +1,43 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'whv_nz/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "whv_nz"
8
+ spec.version = WhvNz::VERSION
9
+ spec.authors = ["muyexi"]
10
+ spec.email = ["muyexi@gmail.com"]
11
+
12
+ spec.summary = %q{Ruby script to apply for Working Holiday Visa from New Zeanland.}
13
+ spec.homepage = "https://github.com/muyexi/whv_nz"
14
+ spec.license = "MIT"
15
+
16
+ if spec.respond_to?(:metadata)
17
+ spec.metadata['allowed_push_host'] = "https://rubygems.org"
18
+ else
19
+ raise "RubyGems 2.0 or newer is required to protect against " \
20
+ "public gem pushes."
21
+ end
22
+
23
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
24
+ f.match(%r{^(test|spec|features)/})
25
+ end
26
+ spec.bindir = "bin"
27
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
+ spec.require_paths = ["lib"]
29
+
30
+ spec.add_development_dependency "bundler", "~> 1.14"
31
+ spec.add_development_dependency "rake", "~> 10.0"
32
+ spec.add_development_dependency 'pry'
33
+
34
+ spec.add_dependency 'activesupport'
35
+ spec.add_dependency 'faraday', '~> 0.11.0'
36
+ spec.add_dependency 'slop'
37
+ spec.add_dependency 'selenium-webdriver', '~> 3.1'
38
+ spec.add_dependency 'rollbar'
39
+ spec.add_dependency 'sucker_punch', '~> 1.6'
40
+ spec.add_dependency 'mailgun-ruby', '~> 1.1'
41
+ spec.add_dependency 'faraday_middleware', '~> 0.10.0'
42
+ spec.add_dependency 'nokogiri', '~> 1.6', '>= 1.6.8'
43
+ end
metadata ADDED
@@ -0,0 +1,239 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: whv_nz
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - muyexi
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-03-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.14'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.14'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: activesupport
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: faraday
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: 0.11.0
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: 0.11.0
83
+ - !ruby/object:Gem::Dependency
84
+ name: slop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :runtime
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: selenium-webdriver
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.1'
104
+ type: :runtime
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.1'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rollbar
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :runtime
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: sucker_punch
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '1.6'
132
+ type: :runtime
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '1.6'
139
+ - !ruby/object:Gem::Dependency
140
+ name: mailgun-ruby
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.1'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.1'
153
+ - !ruby/object:Gem::Dependency
154
+ name: faraday_middleware
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: 0.10.0
160
+ type: :runtime
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: 0.10.0
167
+ - !ruby/object:Gem::Dependency
168
+ name: nokogiri
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - "~>"
172
+ - !ruby/object:Gem::Version
173
+ version: '1.6'
174
+ - - ">="
175
+ - !ruby/object:Gem::Version
176
+ version: 1.6.8
177
+ type: :runtime
178
+ prerelease: false
179
+ version_requirements: !ruby/object:Gem::Requirement
180
+ requirements:
181
+ - - "~>"
182
+ - !ruby/object:Gem::Version
183
+ version: '1.6'
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: 1.6.8
187
+ description:
188
+ email:
189
+ - muyexi@gmail.com
190
+ executables: []
191
+ extensions: []
192
+ extra_rdoc_files: []
193
+ files:
194
+ - ".gitignore"
195
+ - ".ruby-version"
196
+ - Gemfile
197
+ - Gemfile.lock
198
+ - LICENSE
199
+ - README.md
200
+ - Rakefile
201
+ - bin/console
202
+ - bin/setup
203
+ - bin/whv_nz
204
+ - lib/whv_nz.rb
205
+ - lib/whv_nz/config.yml
206
+ - lib/whv_nz/online_services.rb
207
+ - lib/whv_nz/online_services_middleware.rb
208
+ - lib/whv_nz/pages.rb
209
+ - lib/whv_nz/version.rb
210
+ - lib/whv_nz/webcomm.rb
211
+ - lib/whv_nz/webcomm_middleware.rb
212
+ - lib/whv_nz/whv.rb
213
+ - whv_nz.gemspec
214
+ homepage: https://github.com/muyexi/whv_nz
215
+ licenses:
216
+ - MIT
217
+ metadata:
218
+ allowed_push_host: https://rubygems.org
219
+ post_install_message:
220
+ rdoc_options: []
221
+ require_paths:
222
+ - lib
223
+ required_ruby_version: !ruby/object:Gem::Requirement
224
+ requirements:
225
+ - - ">="
226
+ - !ruby/object:Gem::Version
227
+ version: '0'
228
+ required_rubygems_version: !ruby/object:Gem::Requirement
229
+ requirements:
230
+ - - ">="
231
+ - !ruby/object:Gem::Version
232
+ version: '0'
233
+ requirements: []
234
+ rubyforge_project:
235
+ rubygems_version: 2.6.8
236
+ signing_key:
237
+ specification_version: 4
238
+ summary: Ruby script to apply for Working Holiday Visa from New Zeanland.
239
+ test_files: []