guilhermechapiewski-correios-api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/lib/api.rb ADDED
@@ -0,0 +1,8 @@
1
+ require "rubygems"
2
+ require "sinatra"
3
+ require "correios"
4
+
5
+ get "/encomenda/:numero" do
6
+ encomenda = Correios.encomenda(params[:numero])
7
+ xml = "<? xml encoding=\"UTF-8\" version=\"1.0\" ?>\n#{encomenda.to_xml}"
8
+ end
data/lib/correios.rb ADDED
@@ -0,0 +1,52 @@
1
+ require "rubygems"
2
+ require "hpricot"
3
+ require "open-uri"
4
+ require "encomenda"
5
+ require "encomenda_status"
6
+
7
+ class Correios
8
+ @url = "http://websro.correios.com.br"
9
+ @url_rastreamento = "#{@url}/sro_bin/txect01$.QueryList?P_ITEMCODE=&P_LINGUA=001&P_TESTE=&P_TIPO=001&P_COD_UNI="
10
+
11
+ def self.encomenda(numero, url=@url_rastreamento)
12
+ html = Hpricot(open("#{url}#{numero}"))
13
+ encomenda = Encomenda.new(numero)
14
+
15
+ pula_tr = true
16
+ (html/"tr").each do |tr|
17
+ status = nil
18
+ status = self.parse_tr(encomenda, tr) if not pula_tr
19
+ encomenda << status if not status.nil?
20
+ pula_tr = false
21
+ end
22
+ return encomenda
23
+ end
24
+
25
+ private
26
+ def self.parse_tr(encomenda, tr)
27
+ status = nil
28
+ td_count = 0
29
+ (tr/"td").each do |td|
30
+ if td_count == 0
31
+ if td.inner_html =~ /\d{2}\/\d{2}\/\d{4} \d{2}:\d{2}/
32
+ status = EncomendaStatus.new
33
+ parsed_data = td.inner_html.scan(/(\d{2})\/(\d{2})\/(\d{4}) (\d{2}):(\d{2})/)
34
+ timestamp = parsed_data[0][2] + parsed_data[0][1] + parsed_data[0][0] + parsed_data[0][3] + parsed_data[0][4] + "00"
35
+ status.data = DateTime.parse(timestamp)
36
+ else
37
+ encomenda.primeiro_status_disponivel.detalhes = td.inner_html
38
+ end
39
+ end
40
+
41
+ status.local = td.inner_html if td_count == 1
42
+ if td_count == 2
43
+ parsed_situacao = td.inner_html.scan(/.*>(.*)<.*/)
44
+ status.situacao = parsed_situacao[0][0]
45
+ end
46
+
47
+ td_count += 1
48
+ end
49
+
50
+ return status
51
+ end
52
+ end
data/lib/encomenda.rb ADDED
@@ -0,0 +1,32 @@
1
+ class Encomenda
2
+ attr_reader :numero, :status
3
+
4
+ def initialize(numero)
5
+ @numero = numero
6
+ @status = Array.new
7
+ end
8
+
9
+ def <<(status)
10
+ @status << status
11
+ @status.sort! do |a,b|
12
+ a.data <=> b.data
13
+ end
14
+ end
15
+
16
+ def ultimo_status_disponivel
17
+ @status.last
18
+ end
19
+
20
+ def primeiro_status_disponivel
21
+ @status.first
22
+ end
23
+
24
+ #TODO: refactor - nao sei se deveria estar aqui...
25
+ def to_xml
26
+ xml = "<encomenda numero=\"#{@numero}\">"
27
+ @status.each do |status|
28
+ xml += status.to_xml
29
+ end
30
+ xml += "</encomenda>"
31
+ end
32
+ end
@@ -0,0 +1,16 @@
1
+ class EncomendaStatus
2
+ attr_accessor :data, :local, :situacao, :detalhes
3
+
4
+ def to_s
5
+ return "#{super.to_s} {data=>#{@data}, local=>#{@local}, situacao=>#{@situacao}, detalhes=>#{@detalhes}}"
6
+ end
7
+
8
+ #TODO: refactor - nao sei se deveria estar aqui...
9
+ def to_xml
10
+ xml = "<status data=\"#{@data.to_s}\">"
11
+ xml += "<local>#{@local}</local>"
12
+ xml += "<situacao>#{@situacao}</situacao>"
13
+ xml += "<detalhes>#{@detalhes}</detalhes>"
14
+ xml += "</status>"
15
+ end
16
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: guilhermechapiewski-correios-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Guilherme Chapiewski
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+
12
+ date: 2009-03-08 00:00:00 -08:00
13
+ default_executable:
14
+ dependencies:
15
+ - !ruby/object:Gem::Dependency
16
+ name: hpricot
17
+ type: :runtime
18
+ version_requirement:
19
+ version_requirements: !ruby/object:Gem::Requirement
20
+ requirements:
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 0.6.164
24
+ version:
25
+ - !ruby/object:Gem::Dependency
26
+ name: sinatra
27
+ type: :runtime
28
+ version_requirement:
29
+ version_requirements: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.0
34
+ version:
35
+ description: API Ruby/REST para rastreamento de pacotes dos Correios.
36
+ email: guilherme.chapiewski@gmail.com
37
+ executables: []
38
+
39
+ extensions: []
40
+
41
+ extra_rdoc_files: []
42
+
43
+ files:
44
+ - lib/api.rb
45
+ - lib/correios.rb
46
+ - lib/encomenda.rb
47
+ - lib/encomenda_status.rb
48
+ has_rdoc: false
49
+ homepage: http://github.com/guilhermechapiewski/correios-api
50
+ post_install_message:
51
+ rdoc_options: []
52
+
53
+ require_paths:
54
+ - lib
55
+ required_ruby_version: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ version:
61
+ required_rubygems_version: !ruby/object:Gem::Requirement
62
+ requirements:
63
+ - - ">="
64
+ - !ruby/object:Gem::Version
65
+ version: "0"
66
+ version:
67
+ requirements: []
68
+
69
+ rubyforge_project:
70
+ rubygems_version: 1.2.0
71
+ signing_key:
72
+ specification_version: 2
73
+ summary: API para rastreamento de pacotes dos Correios.
74
+ test_files: []
75
+