Página 1 de 1

Descarga LCO del FTP del SAT

Publicado: Mié Oct 12, 2016 11:48 am
por criss25
Buenas tardes,
alguien me puede apoyar con la descarga de los archivos de LCO del SAT, tengo un proceso desarrollado en .NET para su descarga diaria, pero desde hace días estoy tratando de descargarlo y el servidor del SAT me cierra la conexión; y los necesito para validar las facturas y no depender tanto del servidor del SAT al momento de validarlas ya que se satura mucho.

Estos son los sitios de donde hago la descarga:

ftp://ftp2.sat.gob.mx/agti_servicio_ftp ... obante_ftp
ftp://ftp2.sat.gob.mx/agti_ftp/cfds_ftp/

Alguien tiene algun otra solución para esto?

Saludos..

Re: Descarga LCO del FTP del SAT

Publicado: Mié Oct 12, 2016 3:33 pm
por Dado
Recuerdo haber visto aqui en el foro un mensaje donde mencionaba que ya se podian descargar de un blob del SAT con el protocolo http

Dale una buscada por aqui

O si alguien del foro recuerda mas informacion que nos pueda compartir

Re: Descarga LCO del FTP del SAT

Publicado: Jue Oct 13, 2016 7:52 am
por fortiz
Buen dia

Yo uso este programa para descargar la LCO

Código: Seleccionar todo

<?php
echo "Inicia proceso ".date("c")."\n";
$fech = date("Y-m-d");
$url = "https://cfdisat.blob.core.windows.net/lco?restype=container&comp=list&prefix=LCO_$fech";
echo "$url\n";
$opts = array('http' => array('method'=>'GET', 
                              'timeout' => 5,
                              'protocol_version' => 1.1,
                              'header' => 'Connection: close'
                          )
             );
$ctx = stream_context_create($opts);
$xmltxt = file_get_contents($url,false,$ctx);
file_put_contents("lista.xml",$xmltxt);
$xml = new DOMDocument("1.0","UTF-8");
$xml->loadXML($xmltxt);
$Blob = $xml->getElementsByTagName('Blob');
foreach ($Blob as $file) {
    $name = leenodo($file,"Name");
    $url = leenodo($file,"Url");
    $md5 = leenodo($file,"Content-MD5");
    echo "\n----------------\nnombre=$name\nurl=$url\nhash=$md5\n\n";
    $ok = leeurl($name, $url, $md5);
}
echo "Termina proceso ".date("c")."\n";

function leenodo($node,$name) {
    $paso = $node->getElementsByTagName($name);
    foreach ($paso as $otro) {
        $ret = $otro->nodeValue;
    }
    return $ret;
}

function leeurl($name,$url,$md5) {
    echo "Inicia $name : ".date("c")."\n";
    $data = file_get_contents($url);
    file_put_contents($name,$data);
    $hash = base64_encode(md5($data,true));
    if ($hash == $md5) {
        echo "Ok\n";
        $ret = true; 
    } else {
       echo  "Hash no coincide $hash\n";
       $ret = false; 
    }
    echo "Termina $name : ".date("c")."\n";
    return $ret;
}
?>
Y para verificar, descomprimir y extraer los datos en formato delimitado por pipes y concatenarlo en un solo archivo uso este script

Código: Seleccionar todo

#!/bin/bash
dia=`date +%Y-%m-%d`
rm -f sin.csv sin_*.xml sin_*.csv
for parte in 1 2 3 4 5
do
  file=LCO_${dia}_${parte}.XML
  rm -f $file
  if [ -r $file.gz ]
  then
    echo $file
    gunzip $file.gz
    openssl smime -verify -in $file -inform der -noverify -out sin_${parte}.xml
    xsltproc sql.xslt sin_${parte}.xml  >sin_${parte}.csv
    cat sin_${parte}.csv >>sin.csv
  fi
done
echo listo
El xsltproc usa este pequeño archivo xslt para convertir el xml en csv en un formato amigable para ser incorporado a mi base de datos

Código: Seleccionar todo

<xsl:stylesheet version = '1.0'
    xmlns:xsl='http://www.w3.org/1999/XSL/Transform'
    xmlns:lco='http:/www.sat.gob.mx/cfd/LCO'>

<xsl:output method = "text" />

<xsl:template match="/">
    <xsl:apply-templates select="//lco:Contribuyente"/>
</xsl:template>

<xsl:template match="lco:Contribuyente">
    <xsl:apply-templates select="lco:Certificado">
        <xsl:value-of select="@RFC"/>
        <xsl:with-param name="rfc" select="@RFC" />
    </xsl:apply-templates>
</xsl:template>

<xsl:template match="lco:Certificado">
    <xsl:param name="rfc" />
    <xsl:value-of select="$rfc"/>|<xsl:value-of select="@ValidezObligaciones"/>|<xsl:value-of select="@EstatusCertificado"/>|<xsl:value-of select="@noCertificado"/>|<xsl:value-of select="@FechaFinal"/>|<xsl:value-of select="@FechaInicio"/><xsl:text>
</xsl:text>
</xsl:template>

</xsl:stylesheet>
Y ya deja el archivo en este formato

Código: Seleccionar todo

$ head sin.csv 
&RA040119JFA|1|A|00001000000202200752|2016-10-24T15:19:49|2012-10-24T15:19:49
AAAA610822FX3|1|A|00001000000306562027|2019-03-26T22:16:51|2015-03-26T22:16:51
AAA9806257B2|1|A|00001000000202620356|2016-12-15T20:13:34|2012-12-15T20:13:34
AAA1006245L7|1|A|00001000000401177121|2020-01-14T18:03:20|2016-01-14T18:03:20
AAA990902AK4|1|A|00001000000202722501|2017-01-03T17:39:40|2013-01-03T17:39:40
AAA940629JM4|1|A|00001000000402789351|2020-06-10T21:59:15|2016-06-10T21:59:15
AAAA660929KC2|1|A|00001000000303464744|2018-03-25T18:21:23|2014-03-25T18:21:23
AAAA430111S64|1|A|00001000000301988192|2017-12-23T17:00:41|2013-12-23T17:00:41
A&A060722994|1|A|00001000000302615471|2018-01-24T02:26:11|2014-01-24T02:26:11
AAA130705KX0|1|A|00001000000301128269|2017-10-24T15:47:34|2013-10-24T15:47:34
Bitácora de ejecución

Código: Seleccionar todo

$ php descarga_lco.php 
Inicia proceso 2016-10-13T08:47:15-05:00
https://cfdisat.blob.core.windows.net/lco?restype=container&comp=list&prefix=LCO_2016-10-13

----------------
nombre=LCO_2016-10-13_1.XML.gz
url=https://cfdisat.blob.core.windows.net/lco/LCO_2016-10-13_1.XML.gz
hash=s3XT2Q5KNyHfE2EbGP4QaQ==

Inicia LCO_2016-10-13_1.XML.gz : 2016-10-13T08:47:15-05:00
Ok
Termina LCO_2016-10-13_1.XML.gz : 2016-10-13T08:48:12-05:00

----------------
nombre=LCO_2016-10-13_2.XML.gz
url=https://cfdisat.blob.core.windows.net/lco/LCO_2016-10-13_2.XML.gz
hash=dQFv9anqqT+kKLygjasnJw==

Inicia LCO_2016-10-13_2.XML.gz : 2016-10-13T08:48:13-05:00
Ok
Termina LCO_2016-10-13_2.XML.gz : 2016-10-13T08:48:53-05:00
Termina proceso 2016-10-13T08:48:53-05:00
[ortiz@pac-devel lco]$ ./procesa_xml.sh 
LCO_2016-10-13_1.XML
Verification successful
LCO_2016-10-13_2.XML
Verification successful
listo
[ortiz@pac-devel lco]$ ll
total 2731832
-rw-rw-r-- 1 ortiz dev 611741767 Oct 13 08:48 LCO_2016-10-13_1.XML
-rw-rw-r-- 1 ortiz dev 446515714 Oct 13 08:48 LCO_2016-10-13_2.XML
-rw-rw-r-- 1 ortiz dev      1534 Oct 13 08:47 descarga_lco.php
-rw-rw-r-- 1 ortiz dev      1214 Oct 13 08:47 lista.xml
-rwxrwxr-x 1 ortiz dev       395 Oct 13 08:47 procesa_xml.sh
-rw-rw-r-- 1 ortiz dev 340414409 Oct 13 08:50 sin.csv
-rw-rw-r-- 1 ortiz dev 196743628 Oct 13 08:50 sin_1.csv
-rw-rw-r-- 1 ortiz dev 611740073 Oct 13 08:49 sin_1.xml
-rw-rw-r-- 1 ortiz dev 143670781 Oct 13 08:50 sin_2.csv
-rw-rw-r-- 1 ortiz dev 446514020 Oct 13 08:50 sin_2.xml
-rw-rw-r-- 1 ortiz dev       857 Oct 13 08:47 sql.xslt
Saludos

Re: Descarga LCO del FTP del SAT

Publicado: Jue Oct 13, 2016 11:35 am
por criss25
Si Funciona tu Solución

Muchas Gracias.. ;)

Re: Descarga LCO del FTP del SAT

Publicado: Jue Oct 20, 2016 4:45 am
por Sinchi
Funciona muy bien. Nomas le agregaría al PHP al principio la siguiente linea para los que estamos en otra zona horaria.

date_default_timezone_set('America/Mexico_City');

Y al bash script también lo correspondiente