Agencia Estatal Boletín Oficial del Estado

Ministerio de la Presidencia Agencia Estatal Boletín Oficial del Estado

Está Vd. en

Ejemplo de programa para descarga (BOE)

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.

Ejemplo

	
<?

$boe_url = 'http://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 cálculo 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);
}
?>
	
	
	

Subir

Agencia Estatal Boletín Oficial del Estado

Avda. de Manoteras, 54 - 28050 Madrid - Tel.: (+34) 91 111 4000