Leer RSS con PHP y mostrar su contenido

Aprovechando que en mi empresa hemos hecho un fondo para jugar a Euromillones, decidí que la mejor forma de saber los aciertos era automatizar la comprobación de la combinación jugada.

Para ello, nos serviremos del RSS de loteriasyapuestas.es, donde podemos obtener los resultados del último sorteo y adicionalmente, podemos obtener el escrutinio y calcular nuestras posibles ganancias.

Desde la propia página de loteriasyapuestas encontramos que el FEED que nos interesa está en la siguiente URL: «http://www.loteriasyapuestas.es/es/euromillones/resultados/.formatoRSS«.

Como se puede ver, podríamos comprobar el resultado de otros sorteos, pero para el ejemplo, nos vamos a centrar en el sorteo de Euromillones.

Podéis descargar el código completo desde el siguiente enlace: Ejemplo de lectura de euromillones

Y se puede ver el ejemplo funcionando en: http://raularin.com/euromillones/

Para ello, usaremos un pequeño código en PHP que meteremos en un fichero llamado classRSS.php que contrendrá la manera de leer el RSS y su tratamiento básico (extracción del título, url y cuerpo de cada entrada).

<? class RssReader { var $url; var $data; function RssReader ($url){ $this->url;
$this->data = implode («», file ($url));
}

function get_items (){
preg_match_all («/.*<\/item>/xsmUi», $this->data, $matches);
$items = array ();
foreach ($matches[0] as $match){
$items[] = new RssItem ($match);
}
return $items;
}
}

class RssItem {
var $title, $url, $description;

function RssItem ($xml){
$this->populate ($xml);
}

function populate ($xml){
preg_match («/(.*) <\/title>/xsmUi», $xml, $matches); $this->title = $matches[1]; preg_match («/ (.*) <\/link>/xsmUi», $xml, $matches); $this->url = $matches[1]; preg_match («/ (.*) <\/description>/xsmUi», $xml, $matches); $this->description = $matches[1]; }

function get_title (){
return $this->title;
}

function get_url (){
return $this->url;
}

function get_description (){
return $this->description;
}
}
?>

Usando este fichero como base, los siguientes pasos son muy sencillos:

1.- Lectura del contenido del RSS:

Para ello simplemente crearemos un objeto de la clase mencionada anteriormente, pasándole como parámetro la URL de FEED que queremos leer:

$rss = new RssReader («http://www.loteriasyapuestas.es/es/euromillones/resultados/.formatoRSS»);

2.- Una vez obtenido el contenido del RSS, pasaremos a leer cada una de las entradas, en nuestro caso, sólo nos interesa la primera, que corresponderá al último sorteo, por lo que nada más leer el contenido de la primera, salimos del blucle:

foreach ($rss->get_items () as $item){ //bucle para leer cada una de las entradas del feed
$claves = preg_split(«//», $item->get_description());
$numeros = preg_split(«/<\/b>/», $claves[1]);
$numeros = preg_split(«/ – /», $numeros[0]);
$numerosEstrella = preg_split(«/<\/b>/», $claves[2]);
$numerosEstrella = preg_split(«/ – /», $numerosEstrella[0]);
break;
}

Cada ítem tiene la forma:

<item>
	<title>Euromillones: premios y ganadores del viernes 12 de junio de 2015</title>
	<pubDate>Fri, 12 Jun 2015 22:21:14 +0200</pubDate>
	<link>http://www.loteriasyapuestas.es/es/euromillones/escrutinios/euromillones%2Dpremios%2Dy%2Dganadores%2Ddel%2Dviernes%2D12%2Dde%2Djunio%2Dde%2D2015</link>
	<description><![CDATA[
	<p>En el sorteo de <strong><a href="/es/euromillones">Euromillones</a></strong> del viernes 12 de junio de 2015, la combinación ganadora ha correspondido a los siguientes números:</p>
	
	<p><b>05 - 08 - 10 - 11 - 37</b> Estrellas: <b>07 - 09</b></p>
	
	<p>El reparto de premios queda como sigue:</p>
	
	<div class="detalleSorteo euromillones fondoBuscador buscadorAvanzado">
	<div class="cuerpoRegionInf tablaPremios">
	<div class="contenidoRegion">
	<table cellspacing="0" cellpadding="0" border="0" class="tablaDetalle"><tbody>
	<tr>
	<th>Categoría</th>
	<th>Acertantes</th>
	<th>Premios</th>
	<th>Acertantes Europa</th>
	</tr>
	
	<tr class="par">
	<td class="izquierda">1ª 5 + 2</td>
	<td>0</td>
	<td>129.204.405.00 €</td>
	<td>1</td>
	</tr>
	
	<tr class="impar">
	<td class="izquierda">2ª 5 + 1</td>
	<td>1</td>
	<td>319.955.44 €</td>
	<td>8</td>
	</tr>
	
	<tr class="par">
	<td class="izquierda">3ª 5 + 0</td>
	<td>4</td>
	<td>85.321.45 €</td>
	<td>10</td>
	</tr>
	
	<tr class="impar">
	<td class="izquierda">4ª 4 + 2</td>
	<td>21</td>
	<td>3.496.78 €</td>
	<td>122</td>
	</tr>
	
	<tr class="par">
	<td class="izquierda">5ª 4 + 1</td>
	<td>350</td>
	<td>172.98 €</td>
	<td>2.158</td>
	</tr>
	
	<tr class="impar">
	<td class="izquierda">6ª 4 + 0</td>
	<td>779</td>
	<td>82.27 €</td>
	<td>4.537</td>
	</tr>
	
	<tr class="par">
	<td class="izquierda">7ª 3 + 2</td>
	<td>1.049</td>
	<td>47.27 €</td>
	<td>5.641</td>
	</tr>
	
	<tr class="impar">
	<td class="izquierda">8ª 2 + 2</td>
	<td>15.156</td>
	<td>15.85 €</td>
	<td>77.391</td>
	</tr>
	
	<tr class="par">
	<td class="izquierda">9ª 3 + 1</td>
	<td>16.787</td>
	<td>12.10 €</td>
	<td>96.955</td>
	</tr>
	
	<tr class="impar">
	<td class="izquierda">10ª 3 + 0</td>
	<td>30.777</td>
	<td>10.57 €</td>
	<td>186.751</td>
	</tr>
	
	<tr class="par">
	<td class="izquierda">11ª 1 + 2</td>
	<td>78.411</td>
	<td>8.93 €</td>
	<td>387.954</td>
	</tr>
	
	<tr class="impar">
	<td class="izquierda">12ª 2 + 1</td>
	<td>238.625</td>
	<td>6.98 €</td>
	<td>1.344.197</td>
	</tr>
	
	<tr class="par">
	<td class="izquierda">13ª 2 + 0</td>
	<td>424.613</td>
	<td>3.84 €</td>
	<td>2.496.652</td>
	</tr>
	
	</tbody></table>
	</div>
	</div>
	</div>
	
	<div class="enlace negrita"><a href="/es/euromillones">Toda la información oficial sobre este sorteo de Euromillones</a></div>
	]]>
	</description>
	<comments></comments>
	<guidisPermaLink="false">20150612222114d8fa57ceb15ed41067ceb15ed410cdab1bacRCRD</guid>
</item>

A través de la clase classRSS.php, por cada item podríamos obtener el título (echo($item->get_title()), la url (echo($item->get_url()) y la ‘descripción’ (echo($item->get_description()) que en nuestro caso, contiene tanto el resultado del sorteo, como el escrutinio, es por ello, que obtenemos la descripción y tratamos el contenido para extraer los datos que necesitamos:
$claves = separa el contenido por , para poder acceder rápidamente al resto del contenido.
$numeros = números premiados.
$numerosEstrella = números estrella premiados.

3.- El siguiente paso sería calcular los aciertos obtenidos, para ello, tendremos en una variable nuestros números, en otra nuestros números estrella, y los comprobaremos contra los obtenidos en el paso anterior:

//numeros jugados
$numerosJugados = Array(1,2,3,4,5);
$numerosEstrellaJugados = Array(1,2);
$aciertos = 0;
$aciertosEstrella = 0;
//calcula aciertos
for($i = 0; $i < count($numerosJugados); ++$i) {
for($j = 0; $j < count($numeros); ++$j) {
$valor1 = intval($numeros[$j]);
$numeros[$j] = intval($numeros[$j]);
$valor2 = intval($numerosJugados[$i]);
if ( $valor1 == $valor2) {$aciertos +=1;}
}
}
//calcula aciertos estrella
for($i = 0; $i < count($numerosEstrellaJugados); ++$i) {
for($j = 0; $j < count($numerosEstrella); ++$j) {
$valor1 = intval($numerosEstrella[$j]);
$numerosEstrella[$j] = intval($numerosEstrella[$j]);
$valor2 = intval($numerosEstrellaJugados[$i]);
if ( $valor1 == $valor2) {$aciertosEstrella +=1;}
}
}

El código es bastante sencillo, recorremos los Arrays y aumentamos el número de aciertos en caso de que coincidan. Usamos la función intval() para extraer el valor del número y así obtener un 1 en lugar de 01.

4.- Como último paso, trataremos el cuerpo de la descripción para extraer los premios del escrutinio (lo tendremos en $claves[2]).

Limpiaremos el código html para poder tratarlo más cómodamente, eliminando clases y números ordinales, dejando la tabla sólo con etiquetas html.

$borrar = array(«10ª «, «11ª «, «12ª «, «13ª «, «14ª «, «15ª «,»1ª «, «2ª «, «3ª «, «4ª «, «5ª «, «6ª «, «7ª «, «8ª «, «9ª «, ‘ class=»par»‘, ‘ class=»impar»‘, ‘ class=»izquierda»‘);
$tratado = str_replace($borrar, «», $claves[2]);

<tr>
<td>5 + 2</td>
<td>0</td>
<td>129.204.405.00 €</td>
<td>1</td>
</tr>

Una vez tratado dividiremos por filas de la tabla:

$claves = preg_split(«/<tr>/», $tratado);

Y rellenamos el array con los premios:

    $premio[«‘0 + 0′»]=»0.00 €»;
$premio[«‘1 + 0′»]=»0.00 €»;
$premio[«‘0 + 1′»]=»0.00 €»;
$premio[«‘0 + 2′»]=»0.00 €»;
for($i = 2; $i < count($claves); ++$i) {
$claveInterna = preg_split(«/<td>/», $claves[$i]);
$importePremiado = substr($claveInterna[1],0,5);
$premio[trim(«‘».$importePremiado.»‘»)]=$claveInterna[3];
}

Lo único que tenemos en cuenta es añadir los no premiados (0 – 0, 1 – 0, 0 – 1, 0 – 2) para que siempre muestre un valor.

Y con esto ya lo tenemos todo, realmente, es más largo de explicar que de hacer, añado los dos ficheros necesarios para poder probar el funcionamiento (Ejemplo de lectura de euromillones).

Pensé que la lectura de un RSS y su tratamiento sería más complicado, pero realmente fue bastante sencillo.

Saludos!

CategoríasPHP

Deja una respuesta

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