class RussianPost::Tracking
Constants
- COLUMNS
- TRACKING_PAGE
Attributes
agent[R]
barcode[R]
options[R]
Public Class Methods
new(tracking_code, options = {})
click to toggle source
# File lib/russian_post/tracking.rb, line 15 def initialize(tracking_code, options = {}) @barcode = tracking_code.strip.upcase @agent = Mechanize.new @options = options || {} end
Public Instance Methods
track()
click to toggle source
# File lib/russian_post/tracking.rb, line 21 def track initial_page = fetch_initial_page tracking_page = fetch_tracking_data(initial_page) check_validity!(tracking_page) parse_tracking_table(tracking_table(tracking_page)) end
Private Instance Methods
bypass_security(page)
click to toggle source
# File lib/russian_post/tracking.rb, line 71 def bypass_security(page) if page.form && page.form.has_field?("key") bypass_security(page.form.submit) elsif page.body.include?("window.location.replace(window.location.toString())") fetch_initial_page end end
check_validity!(page)
click to toggle source
# File lib/russian_post/tracking.rb, line 36 def check_validity!(page) if page.search('//div[@id=\'CaptchaErrorCodeContainer\']/text()').first raise RussianPost::Captcha::RecognitionError, "Failed to recognize captcha. Please contact developers!" end end
fetch_initial_page()
click to toggle source
# File lib/russian_post/tracking.rb, line 66 def fetch_initial_page page = agent.get(TRACKING_PAGE) bypass_security(page) or page end
fetch_tracking_data(page)
click to toggle source
# File lib/russian_post/tracking.rb, line 79 def fetch_tracking_data(page) page.form.set_fields( 'BarCode' => barcode, 'InputedCaptchaCode' => options[:captcha] || solve_captcha(page), 'searchsign' => '1') page.form.submit end
get_captcha_url(page)
click to toggle source
# File lib/russian_post/tracking.rb, line 42 def get_captcha_url(page) page.image_with(:id => 'captchaImage').src end
get_row_data(row)
click to toggle source
# File lib/russian_post/tracking.rb, line 62 def get_row_data(row) row.css('td').map { |td| td.text unless ['-', ''].include?(td.text) } end
parse_row(row)
click to toggle source
# File lib/russian_post/tracking.rb, line 55 def parse_row(row) data = get_row_data(row) data[1] = Time.parse("#{data[1]} +04:00") Hash[COLUMNS.zip(data)] end
parse_tracking_table(table)
click to toggle source
# File lib/russian_post/tracking.rb, line 51 def parse_tracking_table(table) table.map { |e| parse_row(e) } end
solve_captcha(page)
click to toggle source
# File lib/russian_post/tracking.rb, line 32 def solve_captcha(page) RussianPost::Captcha.for_url(get_captcha_url(page)).text end
tracking_table(page)
click to toggle source
# File lib/russian_post/tracking.rb, line 46 def tracking_table(page) table = page.search(".pagetext tbody tr") table ? table : raise("No tracking table found") end