Cómo saltar a páginas web al azar en PHP
He preparado va una explicación rápida pero completa, a modo de HOWTO («Como hacer...») sobre cómo está programado el enlace ¡Salta! que tenemos en el menú de navegación de la parte superior de la página, cuyo efecto es sencillamente saltar a una anotación cualquiera dentro de Microsiervos, completamente al azar. Esta explicación es bastante general y podría servir para cualquier sistema de weblogs, o cualquier site con muchas páginas distintas en general, siempre que puedas identificar de forma única cada página (y extraer una lista de todas las URLs que tienes) y ejecutar PHP.
Actualización: Si usas Movable Type, a raíz de una excelente sugerencia de Julio Alonso y con un bug detectado por Estaban existe un código mucho más corto y elegante, que he llamado Random Post Hyperjump! v2.0.
Actualización (19 de mayo de 2005): J. Francisco de Todo lo que nunca quisiste saber ha utilizado el código original para crear Salta! para WordPress con un código breve que hace una llamada a la base de datos, de modo que tampoco hace falta pre-generar la lista de URLs.
Cómo saltar a páginas web al azar en PHP
- Se trata de un script muy sencillo programado en PHP, de modo que lo primero que necesitas es que el sitio en donde tienes alojada las páginas permita usar PHP y subir ficheros. Esto lo puedes consultar con tu proveedor, en general casi cualquier alojamiento de pago está permitido, en los gratuitos no es tan común pero algunos lo tienen - a veces incluso puedes usar la opción de «subir fotos» para subir el fichero PHP. Un truco si no tienes PHP es poner esta página en otro alojamiento donde sí admitan PHP, porque en realidad da igual dónde se ejecute.
- Lo primero que necesitarás es una lista de todas las URLs a las que quieres que se pueda «saltar», porque el script funciona a partir de una larga lista de opciones, eligiendo una al azar (no accede a la base de datos de contenidos). Muchos sistemas de contenidos para crear weblogs generan ficheros «estáticos» HTML individuales, como Movable Type o Blogger. Da igual si los genera como números (ej. 0001.html, 0002.html, etc.) o con nombres, y si lo hace con o sin directorios (ej. archivos/ciencia/sputnink.html) mientras puedas obtener esa lista de archivos individuales. Será una lista como por ejemplo: http://www.microsiervos.com/archivos/foo.html http://www.microsiervos.com/archivos/bar.html http://www.microsiervos.com/archivos/xyz/blah-blah.html
- Hazte con esa lista de archivos y cópiala en cualquier editor de texto, una dirección en cada línea. En mi caso utilicé mi programa FTP para revisar todos los directorios en los que están los archivos individuales, fui copiando-y-pegando esa lista. Luego quité lo que sobraba (el ftp://xyz.com/.... En casi todos los sistemas de blogs se usa un directorio como /archivos/ para guardar las anotaciones individuales, a veces están todos en el mismo directorio, a veces en directorios por categorías. Si tienes acceso por consola puedes moverte por los directorios y hacer un ls y copia-pega, o tal vez obtener los nombres completos de archivo de algún lugar de tu sistema de contenidos (el log tal vez). El caso es terminar con un fichero donde están todas las URLs de tus anotaciones individuales. (Nota: naturalmente, necesitarás refrescar esta lista de vez en cuando porque el script no lo va a hacer sólo.)
- Creas un archivo para el script con el nombre que prefieras, que acabe en .php, en el caso de este weblog se llama microsiervos-al-azar.php con este script:
<php
// Random Post Hyperjump! v1.0
// by Alvy for http://www.microsiervos.com
// License is granted if this attribution is fully included$urls = array (
'foo.html',
'bar.html',
'xyz/blah-blah.html',
);$site = «http://www.microsiervos.com/archivo/»;
$i= rand(0,count($urls));header («Location: $site$urls[$i]»);
?> - Como se ve el script es muy sencillo, sólo son tres líneas en realidad: definir una matriz (
$urls) que contendrá todas las URLs de las páginas, definir otra con la trayectoria completa de la zona en que están esos archivos ($site), elegir una de las URLs al azar ($i) y finalmente hacer un salto usandoheader location. - En el archivo previo en el que tienes tu lista de URLs, y elimina lo que esté repetido (generalmente, el
http://www.xyz.com/archivo/) porque no será necesario. Ten en cuenta que el script encadena lo que definas como «nombre del sitio web» en la variable$sitecon las cadenas de las URLs, fíjate en las barras de separación de los directorios especialmente. - Añade las comillas (
') de inicio y final a cada línea, y una coma antes del retorno de carro. Normalmente en tu editor de texto existirá una función para «añadir al principio de línea» o «al final de línea». Otro truco es hacer un Buscar y Reemplazar, por ejemplo se puede buscar (\r) (un retorno) y reemplazarlo por (',\r') (comilla coma retorno comilla) - Copia y pega la lista de URLs con el formato adecuado dentro del script PHP que contiene el código principal
- Sube el script por FTP o el método que suelas usar a tu weblog. Ya lo puedes enlazar desde el menú. Pruébalo a ver qué tal funciona.
- Importante: Como no querrás confundir a Google y otras arañas buscadoras de la red con un enlace a un sitio que redirije a una página distinta cada vez, recuerda siempre hacer dos cosas: (A) Cuando enlaces a esa página, añade el parámetro
rel=«nofollow»para que los robots no la sigan, enlazándola así: <a href="/microsiervos-al-azar.php" rel="nofollow">; (B) Añade por si acaso una línea de exclusión a tu fichero robots.txt en el directorio principal de tu site (o créalo si no lo tienes), indicando que nunca indexen ni sigan esa página PHP, con esta instrucción:Disallow: /microsiervos-al-azar.php
(utiliza el nombre de archivo que hayas elegido).
- Aunque la lista de URLs sea enorme, el fichero de texto será pequeño y se procesará muy rápido. En el ejemplo de Microsiervos, tiene más de 1.500 URLs y ocupa sólo 50 KB, eso en realidad el usuario ni lo nota porque el PHP lo pre-procesa antes de enviárselo al usuario, en una fracción de segundo.










#1
rvr
Je, qué recuerdos. Uno de mis primeros CGIs, hechos en C, fue precisamente un redireccionador aleatorio (de páginas de astronomía, claro).
Hace más de un año
17 de Mayo de 2005 (14:54)
#2
Alvy
Je, ese es mi segundo script en PHP así que sed misericordiosos... ;-) A ver si aprendiendo aprendiendo llego tan lejos como vos... ;-))))))
Hace más de un año
17 de Mayo de 2005 (14:59)
#3
morri
Muchas gracias, cuando llegue a casa y tenga tiempo lo intento hacer. A ver si saco un ratillo ;)
Hace más de un año
17 de Mayo de 2005 (15:03)
#4
AL
Como dices, lo menos elegante es tener que actualizar la lista de URLs a manopla.
Una función "dir" sobre vuestra carpeta "archivo" que filtre para quedarse con los de extensión .html podría valer.
Se puede usar el código de los comentarios de la sección Funciones de Directorio de PHP.
Hastaluego,
Hace más de un año
17 de Mayo de 2005 (17:11)
#5
Julio Alonso
Alvy,
En MT puedes usar una plantilla para que te genere el listado de URLs de tus archivos y no tener que ir pescándolas por los directorios. De hecho, todo el script puede ser el output de una plantilla índice.
Hace más de un año
17 de Mayo de 2005 (19:10)
#6
Alvy
El truco de #4 es bueno, hoy Jab nos comentó en persona que otra forma de evitar tener que sacar los contenidos a manubrio sería hacer una query a la base de datos de contenidos eligiendo un registro al azar, y otra haciendo desde el PHP una especie de 'dir' o 'ls' y quedándote procesando el resultado...
... PERO la solución de Julio #5 en Movable Type (probablemente para otros sistemas sea similar) es realmente la más ingeniosa y mata TODOS los pájaros de un tiro: puedes hacer que esa plantilla se regenere cada vez que creas un post nuevo (espero que no sea muy lento, si no bastaría republicarlo a mano de vez en cuando), puedes tener todos los nombres de archivo ya publicados correctamente, etc. También si quieres añadir otras URLs que no correspondan al post podrías añadirlas a mano... y Además puedes darle como fichero de salida a esta plantilla el propio nombre de archivo /salto-al.azar.php y siempre estará actualizado.
Es una solución completa y elegante, se puede resolver en unas pocas líneas más... así que voy a probarla y os paso cómo quedaría... ¡Gracias Julio!
Hace más de un año
17 de Mayo de 2005 (19:50)
#7
Alvy
OK, el código [para una plantilla de Movable Type] entonces sería este:
...
<?php
// Random Post Hyperjump
// v2.02 for PHP and Movable Type
// by Alvy for http://www.microsiervos.com
// improved with an idea by J. Alonso http://www.merodeando.com
//
// License is granted if this attribution is fully included
$urls = array (
<MTEntries lastn="99999">
'<$MTEntryPermalink$>',
</MTEntries>
);
$go= $urls[rand(0,count($urls)-2)];
header ("Location: $go");
?>
...
Recapitulando en plan paso a paso: (1) Hay que generar una plantilla en TEMPLATES > INDEX TEMPLATE (2) en el apartado OUTPUT FILE de esa plantilla hay que llamarlo como quieras llamar al archivo (en mi ejemplo: microsiervos-al-azar.php (3) importante, NO hay que poner nada en LINK THIS TEMPLATE... (4) Se puede marcar el [x] Rebuild this template... para que se regenere con los demás índices o no hacerlo y reconstruir de vez en cuando manualmente.
Notas: El lastn=99999 es para que salgan todos los posts posibles, se puede limitar por otros parámetros (por días, etc.) pero este valor es OK si quieres todos los posts.
¡Gracias Julio!
Hace más de un año
17 de Mayo de 2005 (20:11)
#8
Esteban
Alvy, de todos modos cuidado con la función rand() como la estás utilizando.
Esta función te va a dar un aleatorio entre el 0 y el total de elementos del array (3 en el ejemplo), pero como seguro que sabes, el array tiene 3 elementos, pero el último índice es el 2 (0,1,2) por lo que cuando el valor de $i sea 3, no mostrará ninguna URL y te llevará la la URL definida por defecto en $site.
Más info: http://es.php.net/rand
Hace más de un año
17 de Mayo de 2005 (20:14)
#9
Alvy
Aha, entonces le ponemos un -1 para que salga bien.
Hace más de un año
17 de Mayo de 2005 (20:26)
#10
Alvy
Quiero decir, un rand entre 1 y el numero de elementos, aunque el ultimo acaba en , así que debe ser uno vacío... mmm lo chequearé, así parece que funciona. En nuestro MT está generando como 1600+ URLs correctamente.
Hace más de un año
17 de Mayo de 2005 (20:29)
#11
Alvy
mmm que lío, debería ser entonces
$go= $urls[rand(0,count($urls))-2];
es decir, entre cero y el numero de elementos -1 pero -1 extra porque el último está vacío (es decir, -2)
Hace más de un año
17 de Mayo de 2005 (20:31)
#12
Esteban
Alvy (parezco un pesado)... he visto otro pequeño bug.
La resta de 2, debe de hacerse dentro de la función count() ya que es ahí donde limita por el final el total de items de array.
En vez de:
$go = $urls[rand(0,count($urls))-2];
Debería de ser:
$go = $urls[rand(0,count($urls)-2)];
Hace más de un año
17 de Mayo de 2005 (21:13)
#13
Alvy
cierto cierto, gracias!
Hace más de un año
17 de Mayo de 2005 (21:16)
#14
morri
Quizá para Blogger también se puede hacer el nuevo truco, lo intentaré ;)
Hace más de un año
17 de Mayo de 2005 (21:59)
#15
WhisKiTo
Entonces, podria copiar ese cacho de codigo e implementarlo en mi blog de blogger?
Hace más de un año
17 de Mayo de 2005 (22:24)
#16
Alvy
En blogger te va a pasar que si no puedes cambiar el sufijo .html por .php (que no creo) entonces no hay manera... Tal vez renombrando todas las URLs acabadas en .php aunque eso puede ser un poco lío.
Hace más de un año
17 de Mayo de 2005 (22:24)
#17
Alvy
Además en blogger la plantilla a menos que haya cambiado bastante juraría que es única (a menos que quieres usar la plantilla de 'archivos') y no habría manera... al menos no fácil.
Pero se puede usar el truco normal (el original que he descrito en el post) para Blogger o cualquier otro sistema de publicación, si te haces previamente el listado manual de todas las URLs.
Hace más de un año
17 de Mayo de 2005 (22:26)
#18
WhisKiTo
Yo ahora he cambiado la "plantilla" de blogger y he modificado la interfaz (el "template").
Pero, Blogger no te ofrece un espacio web, aunque de esto tengo yo a patadas por ahi.
Valdria usar un espacio web que no pertenezca a blogger?
¿?¿?
Hace más de un año
17 de Mayo de 2005 (22:52)
#19
morri
Sí Alvy, yo lo decía por no tener que cogerlas a mano que debe ser un palazo, debo de tener 800 posts... A mano me puede dar algo, pero un dia que tenga un rato libre lo hago porque es muy guapo esto del salta! jejeje
Hace más de un año
17 de Mayo de 2005 (23:26)
#20
Alvy
#18 siempre que admita PHP sí, y entonces en Blogger no tienes que cambiar nada, exccepto poner un enlace a tu página de salta
#19 a mano es entrar por FTP o por consola en el directorio del site y listarlo y hacer copy paste realmente, 2 minutos
Hace más de un año
17 de Mayo de 2005 (23:31)
#21
Julio Alonso
Alvy, gracias por la atribución en el código. Es la primera vez que aparezco en los créditos de algo de soft aunque sea un script simple y elegante :)
Hace más de un año
17 de Mayo de 2005 (23:43)
#22
Alvy
¡Es divertido programar entre varios aunque sea una chorrada de script como este! ¡¡Y esa aportación era buenísima!!
Hace más de un año
17 de Mayo de 2005 (23:58)
#23
alidhaey
Programación colaborativa en los comentarios de un blog. ¿Bajo que licencia esta el desarrollo?
Hace más de un año
18 de Mayo de 2005 (00:03)
#24
Alvy
pues busqué algo tipo Creative Commons y GPL etc y me pareció muy complejo!! por eso puse lo de "licenciable con sólo mantener la cita de atribución" que es lo mismo que he visto en muchos scripts que hay por ahí circulando. En otras palabras: cópiatelo si quieres, pero deja intacta la mención a la fuente original
Hace más de un año
18 de Mayo de 2005 (00:06)
#25
sosa
hace tiempo usé un script parecido para hacer un blogroll aleatorio en el blog de un aamiga, chequenlo www.nolimit-studio.com/lafamosax
Hace más de un año
18 de Mayo de 2005 (01:18)
#26
Franc
Con mis casi nulas habilidades he puesto un script basado en Salta!, pero para Wordpress :D
Saludos!
Hace más de un año
19 de Mayo de 2005 (05:57)
#27
Alvy
Genial, ¡felicidades!
Hace más de un año
19 de Mayo de 2005 (08:33)
#28
jhonny
calida
Hace más de un año
23 de Mayo de 2005 (03:25)
#29
superporcel
Aqui explico como hacerlo con Textpattern.
Hace más de un año
10 de Julio de 2005 (01:53)
#30
... hmmm ...
He creado un script para WordPress, pues la versión que hizo J. Francisco de "Todo lo que nunca quisiste saber" no funciona correctamente en muchos casos.
Salta para WordPress
Hace más de un año
10 de Julio de 2005 (12:08)