Source_extract() version2, envío y extracción de datos desde PHP como si fuera un navegador

source extractLos retos se amplían y source_extract() necesitaba un nuevo enfoque para madurar y ser mas versátil, de manera que, frente a la anterior version que solo enviaba POST y usaba Cookies suplantando un navegador, esta nueva version mejora el soporte, permitiendo enviar datos por GET y POST, pudiendo enviar no solo textos si no a demás poder hacer upload de archivos, con opción de mostrar la cabecera HTTP y todo sin perder la opcion de usar cookies. El único problema es que la reestructuración de variables ha echo que no sean igual que en la anterior versión ya que se ha re-escrito casi entera.

[PHP]
function source_extract(
$url,
$POSTdata=”,
$GETdata=”,
$file_upload=”,
$header=false,
$cookie=false
){
$user_agent = ‘Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9′;

#get
if(is_array($GETdata)){
foreach($GETdata as $k => $v){ $GETdata[$k] = $k.’=’.urlencode($v); }
$GETdata = implode(‘&’, $GETdata);
}
if($GETdata!=”) $url .= strpos($url, ‘?’) ? ‘&’.$GETdata : ‘?’.$GETdata;

#post+files
if(is_array($POSTdata)&&!is_array($file_upload)){
foreach($POSTdata as $k => $v){ $POSTdata[$k] = $k.’=’.$v; }
$POSTdata = implode(‘&’, $POSTdata);
} elseif(count($POSTdata)==0){
$POSTdata = array();
}
if(is_array($file_upload)){
foreach($file_upload as $k=>$v){
$v = (substr($v,0,1)!=’.’&&substr($v,0,1)!=’/’) ? ‘./’.$v : ”.$v;
$path_v = realpath(dirname($v));
$file_v = basename($v);
$file_upload[$k] = ‘@’.$path_v.(substr($path_v,-1)!=’/’ ? ‘/’ : ”).$file_v;
}
$file_upload = array_merge($POSTdata, $file_upload);
}

$ch = curl_init($url);
if(is_array($file_upload)|| $POSTdata!=”){
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, (is_array($file_upload) ? $file_upload : $POSTdata));
}
if($cookie){
curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);
}
if($header){
curl_setopt ($ch, CURLOPT_HEADER, 1);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (substr($url,0,5)==’https’));
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
$_url_content = $url_content = curl_exec ($ch);
curl_close($ch);
$url_content = array(
‘url’ =>$url,
‘post’ =>$file_upload ? $file_upload : $POSTdata,
‘content’ =>$_url_content
);
if($header){
$_url_content = explode(“\r\n\r\n”, $_url_content,3);

$url_content[‘header’] = (count($_url_content)>2) ? $_url_content[0].”\r\n”.$_url_content[1] : $_url_content[0];

$url_content[‘header’] = explode(“\r\n”, $url_content[‘header’]);
foreach($url_content[‘header’] as $k=>$v){ $o[$k] = explode(‘: ‘, $v,2); $o[$o[$k][0]] = $o[$k][1]; unset($o[$k]); }
$url_content[‘header’] = $o;

$url_content[‘content’] = (count($_url_content)>2) ? $_url_content[2] : $_url_content[1];
}
return $url_content;
}
[/PHP]

El primer parámetro es la URL de referencia donde queremos hacer la consulta o extraer el texto.
El segundo, y tercero son arrays que respectivamente introducen los datos a enviar por POST y GET. En ambos casos se pueden introducir tanto texto en formato campo=valor&campo2=valor o siendo un array en el que las key son los nombres de los campos a enviar y los valores los textos a enviar. Si se pretende enviar algún archivo en la petición es obligatorio que los valores que se envíen por POST estén en formato array.
El cuarto parámetro es un array de archivo/s a subir por POST a la URL de destino. El array debe tener como key los nombres de campo y como valor las direcciones donde se encuentran los archivos. Los archivos tienen que estar dentro del servidor, si se redireccióna alguno externo no se enviará correctamente.
El quinto parametro es un valor boleano de true o false, que tiene false por defecto. Si se pone a true mostrara un valor en el array de salida llamado header que contiene una array de las distintas propiedades devueltas en la consulta HTTP.
El sexto y ultimo parámetro indica la utilización de cookies. Por defecto esta en false para no ser utilizado pero si se le indica la ruta de un archivo, este actúa como un cache de cookies entre consultas almacenando valores entre estas.

Esta vez pondré en otro articulo un ejemplo mas real, por ahora aquí os va un ejemplo para probar todas las propiedades..

Creamos en la misma carpeta un archivo que se llame cookie.txt, y subimos en el mismo sitio una imagen JPG a la que cambiaremos el nombre por “imagen.jpg”. Esta imagen va a ser la que vamos a “transmitir”.
A continuacion creamos otro que se llame receptor.php, y en este escribimos lo siguiente.
[PHP]
$_GET,
‘_POST’ => $_POST,
‘_FILES’ => $_FILES
);
echo ‘////////// FIN DEL CONTENIDO DE LA PAGINA ////////////////////’;
print_r($data);
?>
[/PHP]
Este archivo nos servirá como receptor de la prueba con la que vamos a poder comprobar que datos llegan..

Por ultimo hacemos el código de la pagina propia, con el que vamos a hacer la consulta.
Ponemos el nombre que queramos a la pagina y insertamos el código a continuación.
[PHP]
‘Ejemplo de datos enviados por post’, ‘otro_ejemplo’=>32486245378934);
$get = array(‘ejemplo_get’=>’Ejemplo de datos enviados por get’, ‘otro_ejemplo_por_get’=>37827489237);
$file_upload = array(‘Nombre_de_archivo’=> ‘./imagen.jpg’);
print_r(source_extract($url, $post, $get, $file_upload, true, ‘./cookie.txt’));

/*Esta parte debeis sustituirla por el codigo de la funcion que aparece en la parte de arriba*/
?>
[/PHP]

Hay que tener muy en cuenta que hay q sustituir el ultimo comentario por la función de arriba del todo para que el ultimo archivo se ejecute correctamente.

Cuanto tengamos todo y abramos el ultimo archivo desde el navegador veremos que nos aparecen varios datos entre los que se encontrara la cabecera, un array con todos los datos contenidos de la pagina receptor.php y los datos enviados por post, url…

Pronto tendremos un ejemplo más tangible..
A peticion del publico he realizado una corrección en la linea 78 del código de la función que activa automáticamente el soporte de SSL para las paginas web HTTPS. Si alguien tiene algún problema o incompatibilidad con esa corrección q me lo comente

4 opiniones en “Source_extract() version2, envío y extracción de datos desde PHP como si fuera un navegador”

  1. Hola,
    lo primero gracias por tu página, es de mucha utilidad, espero que sigas con este interesante trabajo. Mira, tengo una duda y no consigo resolverla, necesito copiar a una carpeta de mi servidor imagenes de satélite del AEMET, que son de libre distribución, pero quiero poder tenerlas para redimensionarlas y optimizarlas a mi gusto, todo ello desde php, la optimización y demás lo tengo resuelto, el problema es que estas imagenes se deben copiar de manera automática cada 6 horas aprox, veo interesante el script que has hecho, pero no consigo hacerlo funcioonar para lo que quiero, si me pudieras orientar te lo agradecería.

  2. hola @Francisco Javier,
    creo que esta función excede tus necesidades 🙂
    en principio para descargar el “contenido” de un archivo externo de internet te vale con la función file_get_contents() que puedes encontrar desde la versión 4 de PHP.
    para que sea cada 6 horas… eso ya es un poco mas complejo…
    Ese tipo de funciones se suele realizar con un comando de los servidores unix (o linux) llamado “cron”. Lo que hace este comando es ejecutar un script PHP cada cierto tiempo…

    Lo que creo que no me quedo muy claro de tu proyecto es si necesitas almacenar las imágenes cada 6 horas o solo quieres que cada 6 horas, se “refresque” la información para los visitantes..

    Si tu proposito es solo el segundo creo que la solución mas sencilla es comprara la fecha en la que visita el usuario la información con una guardada previamente, y si se determina que han transcurrido 6 horas, volver a cargar los datos desde donde quieras antes de enviarlos al usuario.

    Para esa función de guardar los datos a falta de una base de datos, puedes usar un archivo simple de texto. Para escribir ese archivo de texto y para grabar los datos extraídos desde file_get_contents() puedes usar esta función.

    Si por el contrario lo que quieres es almacenar todas las imágenes del satélite… necesitaras investigar un poco cron 😀

    Espero haberte ayudado y que me puedas enseñar esa aplicación pronto!

    un saludo 🙂

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *