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:
  1. function source_extract(
  2.         $url,
  3.         $POSTdata='',
  4.         $GETdata='',
  5.         $file_upload='',
  6.         $header=false,
  7.         $cookie=false
  8.     ){
  9.     $user_agent = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.8.0.9) Gecko/20061206 Firefox/1.5.0.9';
  10.    
  11.     #get
  12.     if(is_array($GETdata)){
  13.         foreach($GETdata as $k => $v){  $GETdata[$k] = $k.'='.urlencode($v)}
  14.         $GETdata = implode('&', $GETdata);
  15.     }
  16.     if($GETdata!='') $url .= strpos($url, '?') ? '&'.$GETdata : '?'.$GETdata;
  17.    
  18.     #post+files
  19.     if(is_array($POSTdata)&&!is_array($file_upload)){
  20.         foreach($POSTdata as $k => $v){ $POSTdata[$k] = $k.'='.$v;   }
  21.         $POSTdata = implode('&', $POSTdata);
  22.     } elseif(count($POSTdata)==0){
  23.         $POSTdata = array();
  24.     }
  25.     if(is_array($file_upload)){ 
  26.         foreach($file_upload as $k=>$v){
  27.             $v          = (substr($v,0,1)!='.'&&substr($v,0,1)!='/') ? './'.$v : ''.$v;
  28.             $path_v    = realpath(dirname($v));
  29.             $file_v    = basename($v);
  30.             $file_upload[$k]    = '@'.$path_v.(substr($path_v,-1)!='/' ? '/' : '').$file_v;
  31.         }
  32.         $file_upload = array_merge($POSTdata, $file_upload);
  33.     }
  34.    
  35.     $ch = curl_init($url);
  36.     if(is_array($file_upload)|| $POSTdata!=''){
  37.         curl_setopt($ch, CURLOPT_POST, 1);
  38.         curl_setopt($ch, CURLOPT_POSTFIELDS, (is_array($file_upload) ? $file_upload : $POSTdata));
  39.     }
  40.     if($cookie){
  41.         curl_setopt ($ch, CURLOPT_COOKIEJAR, $cookie);
  42.         curl_setopt ($ch, CURLOPT_COOKIEFILE, $cookie);
  43.     }
  44.     if($header){
  45.         curl_setopt ($ch, CURLOPT_HEADER, 1);
  46.     }
  47.     curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  48.     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, (substr($url,0,5)=='https'));
  49.     curl_setopt($ch, CURLOPT_USERAGENT, $user_agent);
  50.     $_url_content = $url_content = curl_exec ($ch);
  51.     curl_close($ch);
  52.         $url_content = array(
  53.             'url'      =>$url,
  54.             'post'    =>$file_upload ? $file_upload : $POSTdata,
  55.             'content'   =>$_url_content
  56.         );
  57.     if($header){
  58.         $_url_content = explode("\r\n\r\n", $_url_content,3);
  59.        
  60.         $url_content['header']  = (count($_url_content)>2) ? $_url_content[0]."\r\n".$_url_content[1] : $_url_content[0];
  61.        
  62.         $url_content['header']  = explode("\r\n", $url_content['header']);
  63.         foreach($url_content['header'] as $k=>$v){  $o[$k] = explode(': ', $v,2); $o[$o[$k][0]] = $o[$k][1]; unset($o[$k]);   }
  64.         $url_content['header'] = $o;
  65.        
  66.         $url_content['content'] = (count($_url_content)>2) ? $_url_content[2] : $_url_content[1];
  67.     }
  68.     return $url_content;
  69. }

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:
  1. <?php
  2. //archivo creado para comprobar si se obtienen bien los datos de get, post y files
  3. echo '////////// INICIO DEL CONTENIDO DE LA PAGINA /////////////////';
  4. $data = array(
  5.             '_GET'    => $_GET,
  6.             '_POST'  => $_POST,
  7.             '_FILES'    => $_FILES
  8. );
  9. echo '////////// FIN DEL CONTENIDO DE LA PAGINA ////////////////////';
  10. print_r($data);
  11. ?>

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:
  1. <?php
  2. $url = 'receptor.php';
  3. $post = array('ejemplo_post'=>'Ejemplo de datos enviados por post', 'otro_ejemplo'=>32486245378934);
  4. $get = array('ejemplo_get'=>'Ejemplo de datos enviados por get', 'otro_ejemplo_por_get'=>37827489237);
  5. $file_upload = array('Nombre_de_archivo'=> './imagen.jpg');
  6. print_r(source_extract($url, $post, $get, $file_upload, true, './cookie.txt'));
  7.  
  8. /*Esta parte debeis sustituirla por el codigo de la funcion que aparece en la parte de arriba*/
  9. ?>

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