Consultar página OCA

Iniciado por pelucas95, 29 Mayo 2015, 19:56 PM

0 Miembros y 1 Visitante están viendo este tema.

pelucas95

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 (php) [Seleccionar]
<?php
// descargarARCHIVO al server

$paginaweb "http://www4.oca.com.ar/ocaepakNet/Views/ConsultaTracking/TrackingConsult.aspx?numberTracking=3867500000001111111" ;
$recurso fopen("hola.html","w");
fwrite($recurso,file_get_contents($paginaweb));

search_and_replace("hola.html","../../","http://www4.oca.com.ar/ocaepakNet/");

//search_and_replace("hola.html","TrackingConsult.aspx","http://www4.oca.com.ar/ocaepakNet/Views/ConsultaTracking/TrackingConsult.aspx");
fclose($recurso);

// FUNCION REEMPLAZAR
function search_and_replace($path,$search,$replace)
{
if(!is_array($search))
    {
        
$search = array($search);
    }
    if(!
is_array($replace))
    {
        
$replace = array($replace);
    }

    
$file_contents file_get_contents($path);
    
$file_contents str_replace($search,$replace,$file_contents);

    
file_put_contents($path,$file_contents);
}
?>


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

Alguna idea?

Gracias!

#!drvy

#1
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 (url) [Seleccionar]
http://www4.oca.com.ar/ocaepakNet/Views/ConsultaTracking/TrackingConsult.aspx/GetTracking

Y el dato es:
{'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 (php) [Seleccionar]
<?php

/**
 * Obtiene los datos JSON de la pagina de tracking
 * @param  [integer] $id - Id del producto
 * @return [json || bool]
 */
function obtener_pedido($id=null){
    if(!
function_exists('curl_init')){ die('cURL no existe.'); }

    
$url 'http://www4.oca.com.ar/ocaepakNet/Views/ConsultaTracking/TrackingConsult.aspx/GetTracking';

    
$ch curl_init();
    
$options = array(
        
CURLOPT_URL => $url,
        
CURLOPT_POST => 1,
        
CURLOPT_POSTFIELDS => '{"numberOfSend": "'.$id.'"}',
        
CURLOPT_RETURNTRANSFER => true,
        
CURLOPT_HTTPHEADER => array(
            
'Accept: application/json, text/javascript, */*; q=0.01',
            
'X-Requested-With: XMLHttpRequest',
            
'Content-Type: application/json; charset=utf-8',
        ),
    );

    
curl_setopt_array($ch$options);
    
$json curl_exec($ch);
    
curl_close($ch);

    if(empty(
$json)){ return false; }
    
$json json_decode($json);
    return 
$json->d;
}


/**
 * Filtra los estados del JSON para comprobar si un estado
 * concreto existe. En caso de existir, lo deja en el JSON
 * En caso contrario, lo elimina.
 * @param  [integer] $id     - Id del producto
 * @param  [string]  $estado - Estado a buscar
 * @return [json || boolean]
 */
function estado_pedido($id,$estado=null){
    
$estados obtener_pedido($id);
    if(!
$estados){ return false; }

    foreach(
$estados as $id=>$state){
        if(
trim($state->State) !== $estado){
            unset(
$estados[$id]);
        }
    }

    return (empty(
$estados) ? false end($estados));
}

/* Ejemplos */


/* Comprobamos si el estado 'Vista a domicilio en curso' esta presente */
$estado estado_pedido('3867500000001111111','Vista a domicilio en curso');
if(!empty(
$estado)){
    echo 
'Pronto se entregara su producto'.PHP_EOL;
    echo 
'Fecha: '.$estado->DateShow;
}

/* Otro ejemplo */
$estado estado_pedido('3867500000001111111','Entregado');
if(!empty(
$estado)){
    echo 
'El producto ha sido entregado'.PHP_EOL;
    echo 
'Fecha: '.$estado->DateShow;
}


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

pelucas95

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.

#!drvy

CitarQué 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

CitarA 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