diff --git a/CHANGELOG.md b/CHANGELOG.md index 30aa0cb..a16b0f9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,6 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Changed - Enable multiple implementations for Rastreio API +- Implement response parser for EnhancedImplementation ## [1.0.4] - 2020-08-15 ### Changed diff --git a/src/main/java/rastreio/DefaultImplementation.java b/src/main/java/rastreio/DefaultImplementation.java index a8c9155..99e7b81 100644 --- a/src/main/java/rastreio/DefaultImplementation.java +++ b/src/main/java/rastreio/DefaultImplementation.java @@ -87,7 +87,7 @@ private static Request newRequest(String objectCode) { * @param response response data to be parsed * @return new tracking object */ - public static TrackObject parseResponse(String objectCode, String response) { + private TrackObject parseResponse(String objectCode, String response) { TrackObjectServiceType serviceType = TrackObjectServiceType.UNKNOWN; try { diff --git a/src/main/java/rastreio/EnhancedImplementation.java b/src/main/java/rastreio/EnhancedImplementation.java index dd48b5b..ac60bc1 100644 --- a/src/main/java/rastreio/EnhancedImplementation.java +++ b/src/main/java/rastreio/EnhancedImplementation.java @@ -1,6 +1,9 @@ package rastreio; import java.io.IOException; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -17,12 +20,17 @@ import okhttp3.RequestBody; import okhttp3.Response; import okhttp3.ResponseBody; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.jsoup.nodes.Element; +import org.jsoup.select.Elements; /** * Enhanced implementation using OkHttp and Jsoup (from DefaultImplementation). */ public class EnhancedImplementation implements Implementation { private static final OkHttpClient HTTP_CLIENT; + private static final DateFormat DATE_FORMAT = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss SSS"); static { HTTP_CLIENT = new OkHttpClient.Builder() @@ -47,8 +55,7 @@ public void onResponse(Call call, Response response) throws IOException { } try (ResponseBody responseBody = response.body()) { // Parse response and notify listener about new tacking object - listener.onSuccess(DefaultImplementation.parseResponse(objectCode, - responseBody.string())); + listener.onSuccess(parseResponse(objectCode, responseBody.string())); } catch (IOException e) { listener.onFailure(new Exception("Rastreio.track: unable to fullfill HTTP request", e)); } @@ -71,7 +78,7 @@ public TrackObject trackSync(String objectCode) throws IOException { ((InMemoryCookieJar) HTTP_CLIENT.cookieJar()).clear(); } // Parse response and return new tacking object - return DefaultImplementation.parseResponse(objectCode, response.body().string()); + return parseResponse(objectCode, response.body().string()); } catch (IOException e) { throw new IOException("Rastreio.trackSync: unable to fullfill HTTP request", e); } @@ -101,6 +108,130 @@ private static Request newRequest(String objectCode) { return request; } + /** + * Parse response data and create new tracking object. + * @param objectCode tracking object code + * @param response response data to be parsed + * @return new tracking object + */ + private TrackObject parseResponse(String objectCode, String response) { + TrackObjectServiceType serviceType = TrackObjectServiceType.UNKNOWN; + + try { + serviceType = TrackObjectServiceType.valueOf(objectCode.substring(0, 2)); + } catch (Exception e) { + // ignore + } + + TrackObject trackObject = new TrackObject(); + trackObject.setCode(objectCode); + trackObject.setServiceType(serviceType); + trackObject.setError(Error.OBJECT_NOT_FOUND); + trackObject.setValid(false); + trackObject.setDelivered(false); + + Document document = Jsoup.parse(response); + Elements elements = document.getElementsByClass("listEvent"); + + if (elements.isEmpty()) { + return trackObject; + } + + ArrayList events = new ArrayList(); + + for (Element eventListItem : elements) { + elements = eventListItem.getElementsByTag("tr").first().getElementsByTag("td"); + + if (elements.size() != 2) { + System.out.println("Rastreio.parseResponse: couldn't find enough table data elements"); + continue; // Skip invalid table row + } + + final Element eventListFirstData = elements.first(); + final Element eventListLastData = elements.last(); + + String eventListFirstDataHtml = eventListFirstData.html(); + String[] eventListFirstDataPieces = eventListFirstDataHtml.trim().split("
"); + + if (eventListFirstDataPieces.length != 3) { + System.out + .println("Rastreio.parseResponse: couldn't parse first table data element properly"); + continue; // Skip invalid table row + } + + String eventDate = eventListFirstDataPieces[0].trim(); + String eventTime = eventListFirstDataPieces[1].trim(); + + elements = eventListFirstData.getElementsByTag("label"); + + String locale = null; + + if (!elements.isEmpty()) { + locale = elements.first().text().trim(); + } else { + locale = eventListFirstDataPieces[2].trim(); + } + + String eventListLastDataHtml = eventListLastData.html(); + String[] eventListLastDataPieces = eventListLastDataHtml.trim().split("
"); + + elements = eventListLastData.getElementsByTag("strong"); + + String description = null; + + if (!elements.isEmpty()) { + // Get `strong` node content + description = elements.first().text().trim(); + } else if (eventListLastDataPieces.length > 0) { + // Get first string element as event description + description = eventListLastDataPieces[0].trim(); + } + + if (description == null || description.isEmpty()) { + System.out + .println("Rastreio.parseResponse: couldn't parse last table data element properly"); + continue; // Skip invalid table row + } + + String details = null; + + if (eventListLastDataPieces.length > 1 + && !eventListLastDataPieces[1].trim().startsWith(" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+
+ + + + +
+

Ir para a pgina inicial

+
+ + + +
+
Correios de A a Z
+ +
Escolha pela letra inicial dos nossos produtos, servios e assuntos.
+

+ Todos os itens
+ Correios de A-C
+ Correios de D-F
+ Correios de G-Q
+ Correios de R-Z
+
+
+ +
+
+
+ +
+ +
+ + +
+
+
+ + +
+ +
+ + +
+

LB941561336SE

+
+
+ +
+
SEDEX 12 e do SEDEX Hoje, representa o horário real da entrega.

As informações de rastro de objetos registrados ficarão disponíveis até 180 dias após a data de postagem.

Objetos com origem ou destino fora do Brasil

O rastreamento para objetos postados no Brasil com código iniciado por "R" e "C" e terminado com "BR" não é garantido fora do território brasileiro.

Para esses objetos, os operadores postais de outros países podem não disponibilizar e/ou transmitir informação de rastreamento para o Brasil.

Sendo assim, consultas de rastreamento de objetos podem também ser realizadas nos sites dos operadores de destino disponíveis no site da UPU - União Postal Universal.

Para os objetos postados no Exterior para o Brasil, o serviço contratado pelo remetente na origem determina o nível de informação de rastreamento de objetos em nosso site.

+ +

Objetos registrados recebidos do exterior que apresentam cdigo iniciado por "R" no pertencem à modalidade expressa, portanto no há rastreamento ponto a ponto. As informações no sistema de rastreamento para esses objetos "R" incluem apenas os eventos: "recebimento no Brasil", "entrega", "tentativa de entrega" ou "aguardando retirada na unidade responsvel". No caso do objeto ser tributado, haverá os eventos de "encaminhamento para fiscalização e tributação? e "saída da fiscalização".

+ + + +

O prazo estimado de entrega dos objetos registrados é de 40 DIAS ÚTEIS a partir da confirmação de pagamento dos impostos (se tributado) e do despacho postal. Tabela prazos de entrega

+

Remessas iniciadas com o código "UM" não são rastreáveis no Brasil. Esse código é utilizado pelo país de origem para indicar que a remessa é passível de pagamento de imposto de importação no destino.

+
+ +
+ + + +
+ +
+
+
+ +
+ +
+ + +
+
+ + + + + + + + +
11/01/2021
+15:17
+ + + +
+ +Objeto entregue ao destinatrio +
+ +
+ + + + + + + + +
11/01/2021
+12:12
+ + + +
+ +Objeto saiu para entrega ao destinatrio +
+ +
+ + + + + + + + +
04/01/2021
+13:57
+JABOATAO DOS GUARARAPES / PE
+ +
+ +Objeto em trnsito - por favor aguarde +
+ +de Unidade de Tratamento +em JABOATAO DOS GUARARAPES / PE +para Agncia dos Correios +em Extremoz / RN
+ + + +
+ + + + + + + + +
30/12/2020
+14:05
+JABOATAO DOS GUARARAPES / PE
+ +
+ +Objeto em trnsito - por favor aguarde +
+ +de Unidade de Tratamento +em JABOATAO DOS GUARARAPES / PE +para Agncia dos Correios +em Extremoz / RN
+ + + +
+ + + + + + + + +
16/12/2020
+05:40
+CAJAMAR / SP
+ +
+ +Objeto em trnsito - por favor aguarde +
+ +de Unidade de Tratamento +em CAJAMAR / SP +para Unidade de Tratamento +em JABOATAO DOS GUARARAPES / PE
+ + + +
+ + + + + + + + +
14/12/2020
+21:25
+CURITIBA / PR
+ +
+ +Objeto em trnsito - por favor aguarde +
+ +de Unidade de Logstica Integrada +em CURITIBA / PR +para Unidade de Tratamento +em CAJAMAR / SP
+ + + +
+ + + + + + + + +
14/12/2020
+21:23
+ + + +
+ +Fiscalizao aduaneira finalizada +
+ + + +
+ + + + + + + + +
12/12/2020
+09:56
+ + + +
+ +Objeto recebido pelos Correios do Brasil +
+ + + +
+Informar n do documento para a fiscalizao e entrega do seu objeto. Clique aqui Minhas Importaes + +
+ +
+ +
+ + +
+

Todos os objetos internacionais esto sujeitos cobrana do despacho postal. Clique aqui para saber mais

+ + + +
+

+ +
+ +
+ +
+
Acesse o aplicativo dos Correios e leia o código 2D ao lado. Você não precisará digitar o código do objeto e poderá salvar na sua lista de favoritos.
+ + +
+ +
+ +
+ + + + + + + + + +
+
+
+
+
+
+
+ + + +
+ + + + + + + + + + + + + + diff --git a/src/test/resources/LB941561336SE_old.html b/src/test/resources/LB941561336SE_old.html new file mode 100644 index 0000000..ed95b4e --- /dev/null +++ b/src/test/resources/LB941561336SE_old.html @@ -0,0 +1,381 @@ + + + + + + + + + + + + + + + + +
+ + +

LB941561336SE

+ +
+

O horrio apresentado no histrico do objeto no indica quando a situao ocorreu, mas sim quando os dados foram recebidos pelo sistema, exceto no caso do SEDEX 10 e do SEDEX Hoje, em que ele representa o horrio real da entrega.

+
+
+ +
+ + +
+
11/01/2021 15:17 Extremoz / RN +
+

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ 11/01/2021
+ 15:17
+ + + +
+ + + Objeto entregue ao destinatrio +
+ + +
+ 11/01/2021
+ 12:12
+ + + +
+ + + Objeto saiu para entrega ao destinatrio +
+ + +
+ 04/01/2021
+ 13:57
+ JABOATAO DOS GUARARAPES / PE
+ +
+ + + Objeto em trnsito - por favor aguarde +
+ + + + de Unidade de Tratamento em JABOATAO DOS GUARARAPES / PE para Agncia dos Correios em Extremoz / RN +
+ 30/12/2020
+ 14:05
+ JABOATAO DOS GUARARAPES / PE
+ +
+ + + Objeto em trnsito - por favor aguarde +
+ + + + de Unidade de Tratamento em JABOATAO DOS GUARARAPES / PE para Agncia dos Correios em Extremoz / RN +
+ 16/12/2020
+ 05:40
+ CAJAMAR / SP
+ +
+ + + Objeto em trnsito - por favor aguarde +
+ + + + de Unidade de Tratamento em CAJAMAR / SP para Unidade de Tratamento em JABOATAO DOS GUARARAPES / PE +
+ 14/12/2020
+ 21:25
+ CURITIBA / PR
+ +
+ + + Objeto em trnsito - por favor aguarde +
+ + + + de Unidade de Logstica Integrada em CURITIBA / PR para Unidade de Tratamento em CAJAMAR / SP +
+ 14/12/2020
+ 21:23
+ + + +
+ + + Fiscalizao aduaneira finalizada +
+ + +
+ 12/12/2020
+ 09:56
+ + + +
+ + + Objeto recebido pelos Correios do Brasil +
+ + +
+ + + + + + + +
+ + +
+ + + + + +