Este script se proporciona únicamente a modo de ejemplo. Esta escrito en lenguaje php pero es fácilmente trasladable a cualquier otro lenguaje. Con el puede descargarse el XML del diario y todos los documentos PDF a él asociados. Si dispone del entorno PHP en su ordenador puede ejecutarlo de la siguiente forma.
php -f traer_boe.php [fecha_desde [fecha_hasta]]
Si no se le pasa ningún valor descargará el diario del día y sus PDF.
Si se le pasa el valor fecha_desde en formato aaaammdd descargará todos los diarios desde esa fecha hasta el día actual. Por ejemplo:
php -f traer_boe.php 20140101
En este caso se descargará desde el 1 de enero de 2014 hasta el día de hoy.
Si se le pasan los valores fecha_desde y fecha_hasta en formato aaaammdd descargará todos los diarios entre ambas fechas. Por ejemplo:
php -f traer_boe.php 20090101 20091231
En este caso se descargará el año 2009 completo.
El script tiene ajustados los valores de timeout para que funcione desde una conexión ADSL convencional.
<? $boe_url = 'https://boe.es'; //Incluya la carpeta de destino de su sistema $destino_local_raiz = '/carpeta_de_destino'; $destino_local = $destino_local_raiz.'/boe/dias'; $boe_api_sumario = $boe_url.'/diario_boe/xml.php?id=BOE-S-'; //Establecemos la zona horaria para el calculo con las fechas date_default_timezone_set('Europe/Madrid'); $hoy = date('Ymd'); //Leemos los argumentos (fecha_desde y fecha_hasta) if(isset($argv[1])) { $desde = $argv[1]; if(isset($argv[2])) { $hasta = $argv[2]; } else { $hasta = $hoy; } } else { $desde = $hoy; $hasta = $hoy; } $diff1Dia = new DateInterval('P1D'); $fecha = new DateTime(); $fecha->setDate(substr($desde,0,4),substr($desde,4,2),substr($desde,6,2)); $fecha_Ymd = $fecha->format('Ymd'); while($fecha_Ymd <= $hasta) { echo 'Fecha: '.$fecha_Ymd, PHP_EOL; $fecha_anno = substr($fecha_Ymd,0,4); $fecha_mes = substr($fecha_Ymd,4,2); $fecha_dia = substr($fecha_Ymd,6,2); //Creamos las carpetas necesarias en nuestro sistema if(!file_exists($destino_local.'/'.$fecha_anno.'/'.$fecha_mes.'/'.$fecha_dia)) { if (!mkdir($destino_local.'/'.$fecha_anno.'/'.$fecha_mes.'/'.$fecha_dia, 0777, true)) { die('Error creando carpetas '.$destino_local.'/'.$fecha_anno.'/'.$fecha_mes.'/'.$fecha_dia); } } if(!file_exists($destino_local.'/'.$fecha_anno.'/'.$fecha_mes.'/'.$fecha_dia.'/pdfs')) { if (!mkdir($destino_local.'/'.$fecha_anno.'/'.$fecha_mes.'/'.$fecha_dia.'/pdfs', 0777, true)) { die('Error creando carpetas '.$destino_local.'/'.$fecha_anno.'/'.$fecha_mes.'/'.$fecha_dia.'/pdfs'); } } $fichero_sumario_xml = $destino_local.'/'.$fecha_anno.'/'.$fecha_mes.'/'.$fecha_dia.'/index.xml'; //Si existe lo borramos if(file_exists($fichero_sumario_xml)) unlink($fichero_sumario_xml); echo 'Solicitando '.$boe_api_sumario.$fecha_Ymd.' --> '.$fichero_sumario_xml, PHP_EOL; traer_documento($boe_api_sumario.$fecha_Ymd, $fichero_sumario_xml); $tamano_sumario_xml = filesize($fichero_sumario_xml); echo 'Recibidos: '.$tamano_sumario_xml.' bytes', PHP_EOL; if($tamano_sumario_xml < 10) die('ERROR: Sumario XML erroneo o incompleto'); $xmlSumario = new DOMDocument(); if(!$xmlSumario->load($fichero_sumario_xml)) die('ERROR: Sumario XML no pudo ser procesado'."\n"); if($xmlSumario->documentElement->nodeName == 'error') { unlink($fichero_sumario_xml); rmdir($destino_local.'/'.$fecha_anno.'/'.$fecha_mes.'/'.$fecha_dia.'/pdfs'); rmdir($destino_local.'/'.$fecha_anno.'/'.$fecha_mes.'/'.$fecha_dia); echo 'AVISO: No existen boletines para la fecha '.$fecha_Ymd."\n"; } else { $pdfs = $xmlSumario->getElementsByTagName('urlPdf'); foreach($pdfs as $pdf) { $fichero_pdf = $destino_local_raiz.$pdf->nodeValue; $fichero_pdf_tamano_xml = $pdf->getAttribute('szBytes'); //Si ya existe el PDF y el tamanno coincide pasamos al siguiente if(file_exists($fichero_pdf)) { if (filesize($fichero_pdf) == $fichero_pdf_tamano_xml) continue; else unlink($fichero_pdf); } echo 'Solicitando '.$boe_url.$pdf->nodeValue.' --> '.$fichero_pdf, PHP_EOL; $intentos = 0; $max_intentos = 5; do { if($intentos != 0) { sleep(5); echo "Intento $intentos\n"; } traer_documento($boe_url.$pdf->nodeValue, $fichero_pdf); $intentos++; } while ($fichero_pdf_tamano_xml != filesize($fichero_pdf) and $intentos < $max_intentos); if($fichero_pdf_tamano_xml != filesize($fichero_pdf)) { die('ERROR: El tamano del fichero PDF descargado no coincide con el del XML del Sumario (Descargado: '.filesize($fichero_pdf).' <> XML: '. $fichero_pdf_tamano_xml . ')'); } } } //Dia siguiente $fecha->add($diff1Dia); $fecha_Ymd = $fecha->format(Ymd); } function traer_documento($origen, $destino) { $fp = fopen($destino, 'w'); $max_intentos = 5; $intentos = 0; do { $ch = curl_init($origen); curl_setopt($ch, CURLOPT_FILE, $fp); curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); curl_setopt($ch, CURLOPT_TIMEOUT, 900); curl_exec($ch); $errno = curl_errno($ch); curl_close($ch); $intentos++; } while ($errno > 0 && $intentos < $max_intentos); fclose($fp); } ?>
Agencia Estatal Boletín Oficial del Estado
Avda. de Manoteras, 54 - 28050 Madrid