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