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