pactrac 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -7,7 +7,7 @@ require 'shellwords'
7
7
  require 'colorize'
8
8
 
9
9
  program :name, 'PacTrac'
10
- program :version, '0.0.1'
10
+ program :version, '0.0.2'
11
11
  program :description, 'Internation package tracker in Ruby'
12
12
 
13
13
  command :track do |c|
@@ -1,5 +1,6 @@
1
1
  require 'pactrac/carrier/dhl'
2
2
  require 'pactrac/carrier/ems'
3
+ require 'pactrac/carrier/china_post'
3
4
  require 'pactrac/err'
4
5
 
5
6
  module PacTrac
@@ -7,7 +8,7 @@ module PacTrac
7
8
  module_function
8
9
 
9
10
  def all
10
- [Carrier::Dhl, Carrier::Ems]
11
+ [Carrier::Dhl, Carrier::Ems, Carrier::ChinaPost]
11
12
  end
12
13
 
13
14
  def for_tracking_number(tracking_number)
@@ -0,0 +1,93 @@
1
+ require 'nokogiri'
2
+ require 'pactrac/err'
3
+ require 'pactrac/response'
4
+ require 'pactrac/http'
5
+ require 'pactrac/http/session'
6
+ require 'pactrac/http/cookie'
7
+ require 'pactrac/verify/file'
8
+ require 'net/http'
9
+ require 'date'
10
+
11
+ module PacTrac
12
+ module Carrier
13
+ module ChinaPost
14
+ module_function
15
+
16
+ def title
17
+ 'China Post'
18
+ end
19
+
20
+ def tracking_number_relevant?(tracking_number)
21
+ tracking_number.strip.match(/^RA\d+CN$/)
22
+ end
23
+
24
+ def tracking_request(tracking_number, session)
25
+ err, raw = Http.request(Net::HTTP::Get.new(
26
+ '/item/trace/itemTrace.jsp',
27
+ 'User-Agent' => user_agent), session)
28
+ return err unless err.valid
29
+ # Get validation image
30
+ err, raw = Http.request(Net::HTTP::Get.new('/rand',
31
+ 'User-Agent' => user_agent), session)
32
+ unless err.valid
33
+ return Err.new(false,
34
+ "there was a problem connecting to the China Post server, " +
35
+ "#{err.msg}")
36
+ end
37
+ f = Verify::File.create('china_post.jpg', raw.body)
38
+ return Err.new(true), Response.new(raw, true, "file://#{f}")
39
+ end
40
+
41
+ def verify(tracking_number, verification, session)
42
+ req = Net::HTTP::Post.new('/item/trace/itemTraceAction.do',
43
+ 'User-Agent' => user_agent)
44
+ req.set_form_data({ :itemNo => tracking_number, :rand => verification })
45
+ if session.cookies
46
+ req['Cookie'] = Http::Cookie.to_request_header_value(session.cookies)
47
+ end
48
+ err, raw = Http.request(req, session)
49
+ unless err.valid
50
+ return Err.new(false,
51
+ "there was a problem connecting to the China Post server, " +
52
+ "#{err.msg}")
53
+ end
54
+ return Err.new(true), Response.new(raw, false)
55
+ end
56
+
57
+ def parse_tracking_data(response)
58
+ doc = Nokogiri::HTML(response.raw.body)
59
+ table = doc.css('table.txt-main')
60
+ if table.nil?
61
+ return Err.new(false, 'unable to find tracking data table')
62
+ end
63
+ tracking_data = { :updates => [] }
64
+ first = true
65
+ table.css('tr').each do |row|
66
+ if first
67
+ first = false
68
+ next
69
+ end
70
+ cells = row.css('td')
71
+ next if cells.nil? or cells.length < 6
72
+ tracking_data[:updates] << {
73
+ :at => DateTime.parse(cells[5].text.strip),
74
+ :location => cells[3].text.strip,
75
+ :message => cells[2].text.strip,
76
+ }
77
+ end
78
+ return Err.new(false, "unable to extract any tracking data, " +
79
+ err.msg) if tracking_data[:updates].empty?
80
+ return Err.new(true), tracking_data
81
+ end
82
+
83
+ def start_session
84
+ Http::Session.start('intmail.183.com.cn', 80)
85
+ end
86
+
87
+ def user_agent
88
+ 'Mozilla/5.0 (Windows NT 6.0) AppleWebKit/537.1 (KHTML, like' +
89
+ ' Gecko) Chrome/21.0.1180.75 Safari/537.1'
90
+ end
91
+ end
92
+ end
93
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pactrac
3
3
  version: !ruby/object:Gem::Version
4
- hash: 29
4
+ hash: 27
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 1
10
- version: 0.0.1
9
+ - 2
10
+ version: 0.0.2
11
11
  platform: ruby
12
12
  authors:
13
13
  - Michael Alexander
@@ -92,6 +92,7 @@ extra_rdoc_files: []
92
92
  files:
93
93
  - lib/pactrac/carrier/dhl.rb
94
94
  - lib/pactrac/carrier/ems.rb
95
+ - lib/pactrac/carrier/china_post.rb
95
96
  - lib/pactrac/err.rb
96
97
  - lib/pactrac/http.rb
97
98
  - lib/pactrac/http/session.rb