Module: PacTrac::Carrier::ChinaPost

Defined in:
lib/pactrac/carrier/china_post.rb

Class Method Summary collapse

Class Method Details

.parse_tracking_data(response) ⇒ Object



57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/pactrac/carrier/china_post.rb', line 57

def parse_tracking_data(response)
  doc = Nokogiri::HTML(response.raw.body)
  table = doc.css('table.txt-main')
  if table.nil?
    return Err.new(false, 'unable to find tracking data table')
  end        
  tracking_data = { :updates => [] }
  first = true
  table.css('tr').each do |row|
    if first
      first = false
      next
    end
    cells = row.css('td')
    next if cells.nil? or cells.length < 6
    tracking_data[:updates] << {
      :at => DateTime.parse(cells[5].text.strip),
      :location => cells[3].text.strip,
      :message => cells[2].text.strip,
    }
  end
  if tracking_data[:updates].empty?
    return Err.new(false, "unable to extract any tracking data")
  end
  return Err.new(true), tracking_data
end

.start_sessionObject



84
85
86
# File 'lib/pactrac/carrier/china_post.rb', line 84

def start_session
  Http::Session.start('intmail.183.com.cn', 80)
end

.titleObject



16
17
18
# File 'lib/pactrac/carrier/china_post.rb', line 16

def title
  'China Post'
end

.tracking_number_relevant?(tracking_number) ⇒ Boolean

Returns:

  • (Boolean)


20
21
22
# File 'lib/pactrac/carrier/china_post.rb', line 20

def tracking_number_relevant?(tracking_number)
  tracking_number.strip.match(/^R[AR]\d+CN$/)
end

.tracking_request(tracking_number, session) ⇒ Object



24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/pactrac/carrier/china_post.rb', line 24

def tracking_request(tracking_number, session)
  err, raw = Http.request(Net::HTTP::Get.new(
    '/item/trace/itemTrace.jsp',
    'User-Agent' => user_agent), session)
  return err unless err.valid
  # Get validation image
  err, raw = Http.request(Net::HTTP::Get.new('/rand',
    'User-Agent' => user_agent), session)
  unless err.valid
    return Err.new(false,
      "there was a problem connecting to the China Post server, " +
      "#{err.msg}")
  end
  f = Verify::File.create('china_post.jpg', raw.body)
  return Err.new(true), Response.new(raw, true, "file://#{f}")
end

.user_agentObject



88
89
90
91
# File 'lib/pactrac/carrier/china_post.rb', line 88

def user_agent
  'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.1 (KHTML, like' +
    ' Gecko) Chrome/21.0.1180.75 Safari/537.1'
end

.verify(tracking_number, verification, session) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/pactrac/carrier/china_post.rb', line 41

def verify(tracking_number, verification, session)
  req = Net::HTTP::Post.new('/item/trace/itemTraceAction.do',
    'User-Agent' => user_agent)
  req.set_form_data({ :itemNo => tracking_number, :rand => verification })
  if session.cookies
    req['Cookie'] = Http::Cookie.to_request_header_value(session.cookies)
  end
  err, raw = Http.request(req, session)
  unless err.valid
    return Err.new(false,
      "there was a problem connecting to the China Post server, " +
      "#{err.msg}")
  end
  return Err.new(true), Response.new(raw, false)
end