elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Desarrollo Web
| | |-+  PHP (Moderador: #!drvy)
| | | |-+  Consultar página OCA
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Consultar página OCA  (Leído 5,770 veces)
pelucas95

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Consultar página OCA
« en: 29 Mayo 2015, 19:56 pm »

Buenas! Les pido ayuda en esto.

Quiero ser capaz de obtener los datos de la tabla que se genera en la dirección:

http://www4.oca.com.ar/ocaepakNet/Views/ConsultaTracking/TrackingConsult.aspx?numberTracking=3867500000001111111

para luego evaluar si el producto aparece como "llegando" y enviarme un mail (de momento a una dirección temporal de yopmail) cuando esto suceda.

He intentado un par de cosas basadas en descargar el html que se genera (del sitio que les acabo de dar) a mi servidor pero allí no se encuentra la información que necesito, si no que ese html está preparado para hacer las consultas mediante javascript (jquery si no me equivoco). Entonces para ir probando al menos, ejecuto la descarga y luego voy al html manualmente para ejecutar el javascript.. pero tampoco funciona.

Código
  1. <?php
  2. // descargarARCHIVO al server
  3.  
  4. $paginaweb = "http://www4.oca.com.ar/ocaepakNet/Views/ConsultaTracking/TrackingConsult.aspx?numberTracking=3867500000001111111" ;
  5. $recurso = fopen("hola.html","w");
  6. fwrite($recurso,file_get_contents($paginaweb));
  7.  
  8. search_and_replace("hola.html","../../","http://www4.oca.com.ar/ocaepakNet/");
  9.  
  10. //search_and_replace("hola.html","TrackingConsult.aspx","http://www4.oca.com.ar/ocaepakNet/Views/ConsultaTracking/TrackingConsult.aspx");
  11. fclose($recurso);
  12.  
  13. // FUNCION REEMPLAZAR
  14. function search_and_replace($path,$search,$replace)
  15. {
  16. if(!is_array($search))
  17.    {
  18.        $search = array($search);
  19.    }
  20.    if(!is_array($replace))
  21.    {
  22.        $replace = array($replace);
  23.    }
  24.  
  25.    $file_contents = file_get_contents($path);
  26.    $file_contents = str_replace($search,$replace,$file_contents);
  27.  
  28.    file_put_contents($path,$file_contents);
  29. }
  30. ?>

como se darán cuenta, soy novatillo aunque con conocimientos en C. Soy estudiante.

Alguna idea?

Gracias!


« Última modificación: 29 Mayo 2015, 20:58 pm por #!drvy » En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.855



Ver Perfil WWW
Re: Consultar página OCA
« Respuesta #1 en: 29 Mayo 2015, 21:16 pm »

Bueno el asunto es un poco complicado y requiere de algo de experiencia sobre parseo de datos. Voy a intentar explicarlo todo pero en fin.. si dices que eres novato igual no entiendes algunas cosas.

Para empezar intenta olvidarte de ejecutar el javascript. En PHP eso es muy complejo e inútil. Pero si la pagina usa javascript y por tanto hace consultas con AJAX, puedes acceder directamente a la pagina a la que consulta con AJAX. En la herramienta de desarrollador de tu navegador hay una pestaña que se llama RED. Ahí puedes ver todas las consultas que se hacen. Si te fijas, hace un POST (GetTracking) a una pagina especifica.



Si vemos ese request, vemos que mandamos unos datos a esta URL:
Código
  1. http://www4.oca.com.ar/ocaepakNet/Views/ConsultaTracking/TrackingConsult.aspx/GetTracking

Y el dato es:
Código
  1. {'numberOfSend': '3867500000001111111'}

Por tanto, solo te hace falta simular la misma consulta POST para obtener los estados.

Ahora, lo que te devuelve es JSON en PHP lo puedes parsear fácilmente (json_decode) y obtener por tanto todos los estados. json_decode lo convierte a array y objeto y de ahí es fácil de manipular y solo haría falta recorrerlo y buscar el estado que querremos.

Puesto que tengo tiempo libre te dejo un código. Es un poco largo y si solo buscas saber si hay un estado o no hay otras formas mejores de hacerlo pero con este puedes obtener las fechas de actualización y todos los datos..


Código
  1. <?php
  2.  
  3. /**
  4.  * Obtiene los datos JSON de la pagina de tracking
  5.  * @param  [integer] $id - Id del producto
  6.  * @return [json || bool]
  7.  */
  8. function obtener_pedido($id=null){
  9.    if(!function_exists('curl_init')){ die('cURL no existe.'); }
  10.  
  11.    $url = 'http://www4.oca.com.ar/ocaepakNet/Views/ConsultaTracking/TrackingConsult.aspx/GetTracking';
  12.  
  13.    $ch = curl_init();
  14.    $options = array(
  15.        CURLOPT_URL => $url,
  16.        CURLOPT_POST => 1,
  17.        CURLOPT_POSTFIELDS => '{"numberOfSend": "'.$id.'"}',
  18.        CURLOPT_RETURNTRANSFER => true,
  19.        CURLOPT_HTTPHEADER => array(
  20.            'Accept: application/json, text/javascript, */*; q=0.01',
  21.            'X-Requested-With: XMLHttpRequest',
  22.            'Content-Type: application/json; charset=utf-8',
  23.        ),
  24.    );
  25.  
  26.    curl_setopt_array($ch, $options);
  27.    $json = curl_exec($ch);
  28.    curl_close($ch);
  29.  
  30.    if(empty($json)){ return false; }
  31.    $json = json_decode($json);
  32.    return $json->d;
  33. }
  34.  
  35.  
  36. /**
  37.  * Filtra los estados del JSON para comprobar si un estado
  38.  * concreto existe. En caso de existir, lo deja en el JSON
  39.  * En caso contrario, lo elimina.
  40.  * @param  [integer] $id     - Id del producto
  41.  * @param  [string]  $estado - Estado a buscar
  42.  * @return [json || boolean]
  43.  */
  44. function estado_pedido($id,$estado=null){
  45.    $estados = obtener_pedido($id);
  46.    if(!$estados){ return false; }
  47.  
  48.    foreach($estados as $id=>$state){
  49.        if(trim($state->State) !== $estado){
  50.            unset($estados[$id]);
  51.        }
  52.    }
  53.  
  54.    return (empty($estados) ? false : end($estados));
  55. }
  56.  
  57. /* Ejemplos */
  58.  
  59.  
  60. /* Comprobamos si el estado 'Vista a domicilio en curso' esta presente */
  61. $estado = estado_pedido('3867500000001111111','Vista a domicilio en curso');
  62. if(!empty($estado)){
  63.    echo 'Pronto se entregara su producto'.PHP_EOL;
  64.    echo 'Fecha: '.$estado->DateShow;
  65. }
  66.  
  67. /* Otro ejemplo */
  68. $estado = estado_pedido('3867500000001111111','Entregado');
  69. if(!empty($estado)){
  70.    echo 'El producto ha sido entregado'.PHP_EOL;
  71.    echo 'Fecha: '.$estado->DateShow;
  72. }

Básicamente lo que hace es simular la consulta de pedido, recorrer los resultados y solo dejar el estado que buscas. Lo de enviar el mail ya te lo dejo a ti..

PD: Si  no entiendes algo pregunta. Las funciones que salen en rojo y están subrayadas son enlaces que te llevan a la documentación de PHP para explicarte que hace.

Saludos


« Última modificación: 29 Mayo 2015, 21:20 pm por #!drvy » En línea

pelucas95

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Consultar página OCA
« Respuesta #2 en: 3 Junio 2015, 07:00 am »

venga.. Pues la verdad, flor de ayuda!!! muchísimas graciass!!!

Justo ahora estoy estudiando estructuras en C y me parece que por ahí viene la mano no?

estuve viendo también de lo de JSON y es bastante también jeje.

Te remil agradezco la ayuda.

Qué es todo eso de Curl?

A ver si entendí. Yo hago el pedido con la funcion "obtener_pedido" y lo que me devuleve es un "todo" en formato JSON. A ese JSON lo convierto en un objeto ("lo parseo") y luego busco la cadena que me interesa.
En línea

#!drvy
Moderador
***
Desconectado Desconectado

Mensajes: 5.855



Ver Perfil WWW
Re: Consultar página OCA
« Respuesta #3 en: 3 Junio 2015, 20:35 pm »

Citar
Qué es todo eso de Curl?

Es una extensión de PHP basada en el programa CURL que permite hacer consultas avanzadas sobre sitios remotos de forma sencilla.

Aquí tienes el manual en PHP: http://php.net/manual/es/book.curl.php

Citar
A ver si entendí. Yo hago el pedido con la funcion "obtener_pedido" y lo que me devuleve es un "todo" en formato JSON. A ese JSON lo convierto en un objeto ("lo parseo") y luego busco la cadena que me interesa.

Mas o menos. Realmente lo que retorna obtener_pedido ya es un array/objeto del JSON devuelto. La otra función solo se encarga de buscar el estado.

Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines