Captura de miniaturas de paginas web en imágenes con PHP
Otro día, otra idea, y lo que necesitaba hoy era, ¿como puedo hacer una miniatura de una pagina web?
Pues como casi todo en internet, usando servicios online... Entre los servicios online que me ofrecían esto he encontrado mas de 20, pero casi ninguno realizaba el servicio en realidad. Algunos me ofrecían la posibilidad de cambiar de navegador, otros el tamaño, pero casi todos tenían un tiempo de espera para generar la imagen de la web pedida.
Por eso he seleccionado 3. Los 3 que mejor me funcionaron.
La función miniatura_web() utiliza 2 variables fijas y otras 2 que son validas para algunos servicios.
La primera variable, $url, contiene la dirección web de la que sacaremos la imagen y la segunda, $servicio indica cual de los 3 servicios es valido. Las opciones para la variable servicio son: ipinfo, browsercamp, y thumbalizr. La función puede utilizarse sin introducir mas parámetros que la URL a capturar, pero para añadir mejor manejo o mejor respuesta en carga de imagen tenemos las 3 posibilidades.
Ipinfo muestra una captura de imagen de 1.016x741px, por lo que recorta todas las web en anchura. Muestra una imagen de tipo PNG.
browsercamp es mas personalizable. Nos permite seleccionar entre 5 tipos de tamaño que van entre los 800px y los 1600px. Para cambiar el tamaño solo hay que introducir el numero del 1 al 5 en la 3º variable de la función. Por defecto esta en 800px. A demás browsercamp permite determinar si queremos que nos de la imagen en PNG o en JPG, y si seleccionamos la 2º opción nos permite decidir entre 3 opciones de calidad. Esto se introduciría en el 4º valor. Los valores permitidos serian: png para devolver un archivo de tipo PNG, high, medium y low, los 3 modos de calidad de imagen para una salida de archivo de JPG. Como añadido, este servicio da 2 tipos de resultado, una miniatura de la web original y la web grande. Estas se dan en el resultado en forma de array.
thumbalizr es la mención honorífica, ya que tenia la API... Es un servicio que mientras generan la imagen ponen otra que indica que esta en proceso. por tanto no tenemos el efecto inmediato que teníamos con las otras funciones. Permite adaptar la anchura como el modelo anterior, con los 5 valores.
La función:
-
function miniatura_web($url, $servicio = "browsercamp", $tamanio = "1", $calidad = "high"){
-
-
-
if("ipinfo" == $servicio){
-
$sevicios = 'http://ipinfo.info/netrenderer/index.php?browser=ie7&url='.$url;
-
-
$exp_info = '!http://renderer.geotek.de/image.php\?imgid=(.+)&browser=ie7!U';
-
-
$s = $info[0][0];
-
return $s;
-
}
-
if("browsercamp" == $servicio){
-
$sevicios = "http://www.browsrcamp.com/?get=1&width=".$tamanios[$tamanio]."&url=".$url;
-
$sevicios .= "&quality=".$calidades[$calidad];
-
-
$exp_info = '!<a href="(.+)" target="_blank">!U';
-
-
"full" => $info[1][0],
-
);
-
return $s;
-
}
-
if("thumbalizr" == $servicio){
-
$s = "http://www.thumbalizr.com/api/?url=".$url."&width=".$tamanios[$tamanio];
-
return $s;
-
}
-
}
Con lo anterior creo que solo queda que os deje un ejemplo de cada y ya hacéis las pruebas de velocidad cada uno como queráis.
Ejemplo básico (pagina a tamaño completo con browsercamp:
-
$imagen = miniatura_web("http://www.tierra0.com");
Ejemplo ipinfo:
-
$imagen = miniatura_web("http://www.tierra0.com", "ipinfo");
Ejemplo browsercamp completo:
-
$imagen = miniatura_web("http://www.tierra0.com", "browsercamp", "1", "png");
Ejemplo browsercamp miniatura:
-
$imagen = miniatura_web("http://www.tierra0.com", "browsercamp", "1", "png");
Ejemplo thumbalizr:
-
$imagen = miniatura_web("http://www.tierra0.com", "thumbalizr", "1");
Actualización: Corregida la función en las lineas 1, carácter uno y linea 8 ultimas comillas.
Los ejemplos fueron divididos. Si se utilizan varios a la vez hay que plantearse el aumento del tiempo de ejecución de los script
Estoy probando esta aplicacion pero no consigo que copie la imagen, las imagenes van vacias..
Muchas gracias por el dato siguire probando
Buenas Juan Manuel, he corregido un par de errores que tenia la función. El problema es que a veces los servidores que realizan las capturas de imágenes tardan demasiado así que tendrás que ampliar el tiempo de ejecución para el script en el que lo incorpores.
Buenas antares500
Estoy probando este script pero anten no me funcionaba pero ahora, si saca una imagen pequeña de esta pagina pero estoy cambiando la ruta de la web pero me va vacia la imagen..
A mi me gustaria sobre este script, que me saque una copia de una web y salvarlo en mi servidor web..
Le agradeceria mucho si me ayudara..
Lo intentado muchas veces pero no llego al final de la cuestión
Hola Juan, dependiendo del servidor que uses para generarlas tardará mas o menos. Por lo que dices creo que el problema que tienes es que al salvarlas te salen en blanco y eso puede ser por que tu código salve las imágenes demasiado deprisa sin dar tiempo a recibirlas…
Por los datos que me das no se exactamente como ayudarte (con la función de archivo() debería valer…)
Si tienes algún ejemplo mas concreto sobre la función no dudes en contarme.
$original = imagecreatefromjpeg(”original.jpg”);
$thumb = imagecreatetruecolor(150,150); // Lo haremos de un tamaño 150×150
Buenas Antares500
El script de esta pagina web ya si me funciona, pero no me vale, porque lo que quiero que en mi servidor web haga una copia de la url en jpg, para mas tarde extraer de mi servidor web y pintar esa imagen…
Este script me crear un jpg en negro como puedo copiar la imagen de una url en este codigo..
$ancho = imagesx($original);
$alto = imagesy($original);
imagecopyresampled($thumb,$original,0,0,0,0,150,150,$ancho,$alto);
imagejpeg($thumb,’thumb.jpg’,90); // 90 es la calidad de compresión
$thumb = $imagen;
Buenas Juan, creo que la solución es simple en tu caso. Solo tienes que usar la URL que devuelve la función como origen de los datos en la función de entrada especifica (ya sea jpg, png, gif…) y poner en la de salida la de jpg. con eso ya tendrías convertida la imagen… si a demás utilizas entre medias un código que te la redimensione a esas medidas lo tienes todo echo…
hay montones de códigos en internet que hacen lo que quieres.
No te entiendo podrias ser un poco mas explicativo..
En este codigo me hace una miniatura de 150*103 en formato jpg, como puedo usar esa funcion de entrada como dices, para pasar una direccion web y incrustarlo en este script.
Muchas gracia por su tiempo
$original = @imagecreatefromjpeg(”original.jpg”);
$thumb = @imagecreatetruecolor(150,103); // Lo haremos de un tamaño 150×150
$ancho = @imagesx($original);
$alto = @imagesy($original);
@imagecopyresampled($thumb,$original,0,0,0,0,150,103,$ancho,$alto);
@imagejpeg($thumb,’thumb.jpg’,90); // 90 es la calidad de compresión
Hola Juan Manuel, puedes usar la primera linea del primer ejemplo para modificar tu código.
Solo tienes que ponerla en primer lugar y sustituir por “original.jpg”. De esa manera la dirección del archivo se sustituirá en el código que necesitas.
Hola, la pregunta es si es posible hacer que la imagen se actulice, es decir si se realizaron mudificaciones en la página web a capturar?
Hola Juan Ignacio, la verdad es que no estoy seguro. Supongo que dependerá del tiempo que pase entre las actualizaciones o de la configuración de la cache que tengan.. lo único que tengo testado es que en browsrcamp y ipinfo si que realizan capturas correctas de un día para otro pero supongo que será cuestión de que lo pruebes.
un saludo
gracias @antares50 te cuento que ya lo solucioné se me ocurrió que si la dirección cambiaba en algo con respecto a la anterior podría funcionar, es por ello que le paso un valor en la dirección que siempre sea diferente, es decir pongo por ejemplo http://www.dominio.com/?t=1235467541, ese valor no hace nada, es simplemente la fecha obtenida con time(), pero para el browsercamp son direcciones diferentes y la crea nuevamente, saludos….
Esto en un plugin para wordpress a la hora de escribir vendría de perlas
Yo suelo hacerlo a mano, tenerlo a un solo click seria genial.