Ler DANFE pelo site da NFE
Moderador: Moderadores
Ler DANFE pelo site da NFE
Bom dia!
Como tenho vários problemas com várias empresas que por vários motivos não me enviam o arquivo XML da Nfe que importo para o meu sistema ERP, tenho que ficar digitando a nota manualmente e isso dificulta bem o serviço, e também o site da receita não libera o XML para donwload, resolvi pesquisar se ja existia alguma rotina para baixar o XML e também não encontrei ai desenvolvi uma rotina para leitura do DANFE(produtos) baseado no codigo HTML salvo pelo navegador, a ideia e bem simples:
1 - Entro no siste com o Nr da NFe e visualizo os produtos, vejo o codigo fonte e salvo em uma pasta, pronto.
2 - Executo a rotina em anexo para leitura do Html salvo e crio o DBF com os itens.
Estou tentando achar uma solução para capturar a pagina HTML( codigo ) pelo xharbour , caso alguem tenha uma solução fico muito grato.
Frazato
Como tenho vários problemas com várias empresas que por vários motivos não me enviam o arquivo XML da Nfe que importo para o meu sistema ERP, tenho que ficar digitando a nota manualmente e isso dificulta bem o serviço, e também o site da receita não libera o XML para donwload, resolvi pesquisar se ja existia alguma rotina para baixar o XML e também não encontrei ai desenvolvi uma rotina para leitura do DANFE(produtos) baseado no codigo HTML salvo pelo navegador, a ideia e bem simples:
1 - Entro no siste com o Nr da NFe e visualizo os produtos, vejo o codigo fonte e salvo em uma pasta, pronto.
2 - Executo a rotina em anexo para leitura do Html salvo e crio o DBF com os itens.
Estou tentando achar uma solução para capturar a pagina HTML( codigo ) pelo xharbour , caso alguem tenha uma solução fico muito grato.
Frazato
- Anexos
-
leitura_html.txt- (9.54 KiB) Baixado 667 vezes
-
edmarfrazao
- Usuário Nível 3

- Mensagens: 185
- Registrado em: 06 Dez 2005 11:16
Re: Ler DANFE pelo site da NFE
Olha o site da receita não retorna 100% das tag mas ja da para buscar bastante coisas.
Não serve como copia oficial do xml(este o fornecedor tem que enviar)
abaixo o link de uma rotina feita em delphi
http://www.forumweb.com.br/foruns/index ... ntry350762
Talvez ajude em alguma coisa.
o que é feito o sistema le a pagina html mostrar o captcha para o usuário, o usuário digita as letras do captch o sitema informar na pagina e le as tag retornadas e monta o xml.
Não serve como copia oficial do xml(este o fornecedor tem que enviar)
abaixo o link de uma rotina feita em delphi
http://www.forumweb.com.br/foruns/index ... ntry350762
Talvez ajude em alguma coisa.
o que é feito o sistema le a pagina html mostrar o captcha para o usuário, o usuário digita as letras do captch o sitema informar na pagina e le as tag retornadas e monta o xml.
Re: Ler DANFE pelo site da NFE
Legal! estava procurando por isso a um bom tempo, mais tem um problema ele retorna bem menos dados do item do que o meu retirando pelo código fonte e quando ele monta o XML, fica faltando muita coisa, seria legal se o " recuperadorxml" salvasse o código HML e a gente lia apartir dele.
Observação: E possivel fazer isso em xharbour?
Frazato
Observação: E possivel fazer isso em xharbour?
Frazato
Re: Ler DANFE pelo site da NFE
Tive dando um pesquisa na WEB e encontre em um site este codigo em Delphi, como não sei nada do mesmo, gostaria de saber se e possivel fazer isso em xharbour, pelo pouco que entendi deste codigo ele mapea os formularios e salva em algum lugar.
Hj estou tendo que entrar na pagina formulario por formulario e ir salvando o codigo fonte dentre arquivos txt para posterior leitura agora se consegui fazer direto ficaria bem mais simples.
Hj estou tendo que entrar na pagina formulario por formulario e ir salvando o codigo fonte dentre arquivos txt para posterior leitura agora se consegui fazer direto ficaria bem mais simples.
Código: Selecionar todos
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, OleCtrls, SHDocVw, StdCtrls, xmldom, XMLIntf, msxmldom, XMLDoc,
WebDisp,MSHtml;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Label1: TLabel;
WebBrowser1: TWebBrowser;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure WebBrowser1ProgressChange(Sender: TObject; Progress,
ProgressMax: Integer);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
function WebFormGet(const formNumber: integer; const document: IHTMLDocument2): IHTMLFormElement;
var
Form1: TForm1;
implementation
{$R *.dfm}
function FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean;
var
i, j: Integer;
FormItem: Variant;
begin
Result := False;
//no form on document
if WebBrowser.OleObject.document.all.tags('FORM').Length = 0 then
begin
Exit;
end;
//count forms on document
for I := 0 to WebBrowser.OleObject.document.forms.Length - 1 do
begin
FormItem := WebBrowser.OleObject.document.forms.Item(I);
for j := 0 to FormItem.Length - 1 do
begin
try
//when the fieldname is found, try to fill out
if FormItem.Item(j).Name = FieldName then
begin
FormItem.Item(j).Value := Value;
Result := True;
end;
except
Exit;
end;
end;
end;
end;
function WebFormGet(const formNumber: integer; const document: IHTMLDocument2): IHTMLFormElement;
var
forms : IHTMLElementCollection;
begin
forms := document.Forms as IHTMLElementCollection;
result := forms.Item(formNumber,'') as IHTMLFormElement
end;
procedure WebFormSubmit(
const document: IDispatch;
const formNumber: integer);
var
form : IHTMLFormElement;
field: IHTMLElement;
begin
form := WebFormGet(formNumber, Document AS IHTMLDocument2) ;
form.submit;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('https://www.nfe.fazenda.gov.br/PORTAL/FormularioDePesquisa.aspx?tipoconsulta=completa');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
WebFormSubmit(WebBrowser1.Document, 0);
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
FillForm(WebBrowser1, 'ctl00$ContentPlaceHolder3$chaveAcesso', edit1.Text);
end;
procedure TForm1.WebBrowser1ProgressChange(Sender: TObject; Progress,
ProgressMax: Integer);
begin
if ProgressMax = 0 then
begin
label1.Caption := '';
Exit;
end;
try
if (Progress <> -1) and (Progress <= ProgressMax) then
label1.Caption := IntToStr((Progress * 100) div ProgressMax) + '% loaded...'
else
label1.Caption := '';
except
on EDivByZero do Exit;
end;
end;
procedure TForm1.Button4Click(Sender: TObject);
begin
end;
end.
endRe: Ler DANFE pelo site da NFE
aqui esta um esboço funciona de maneira para desenvolvedor
só nao consegui fazer o download do captcha ainda, se alguem puder dar uma colaboração
e falta o tratamento do retorno da pagina da nfe para xml ou txt
aproveitando alguem teve sucesso em fazer a consulta do status da NFe pelo pocketsoap?
[]s
Fernando
só nao consegui fazer o download do captcha ainda, se alguem puder dar uma colaboração
e falta o tratamento do retorno da pagina da nfe para xml ou txt
Código: Selecionar todos
IF ( oIE := win_oleCreateObject( "InternetExplorer.Application" ) ) != NIL
oIE:Visible := .T.
oIE:Navigate( "https://www.nfe.fazenda.gov.br/portal/FormularioDePesquisa.aspx?tipoconsulta=completa" )
WHILE oIE:ReadyState != 4
* HB_IDLESLEEP( 0 )
ENDDO
* IF oIE:LocationURL = 'https://www.nfe.fazenda.gov.br/portal/FormularioDePesquisa.aspx?tipoconsulta=completa'
* for k := 0 to oIE:Document:Images:Length - 1
* cSource := oIE:Document:Images:Item(k):Src
* if cSource = 'https://www.nfe.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image'
* oHttp:= TIpClientHttp():new( "https://www.nfe.fazenda.gov.br/portal/FormularioDePesquisa.aspx?tipoconsulta=completa" )
* oHttp:open()
* dest := 'd:\fjempresa\bugs\captcha.gif'
* oHttp:ReadToFile( dest, , Nil )
* oHttp:close()
* endif
* next
* ENDIF
a=" "
@ 0,0 GET a PICT "@X"
READ
a=ALLTRIM(a)
oIE:Document:All('ctl00$ContentPlaceHolder3$chaveAcesso', 0):value := '35101206995064000156550010000000430000000430' //edtChaveNFe.Text;
oIE:Document:All('ctl00$ContentPlaceHolder3$intercepta', 0):value := a
oIE:Document:All('ctl00$ContentPlaceHolder3$btcontinuar', 0):click()
WHILE oIE:ReadyState != 4
* HB_IDLESLEEP( 0 )
ENDDO
wait
IF oIE:LocationURL = 'https://www.nfe.fazenda.gov.br/portal/visualizacaoNFe/completa/Default.aspx'
oIE:Navigate( 'https://www.nfe.fazenda.gov.br/PORTAL/visualizacaoNFe/completa/impressao.aspx' )
WHILE oIE:ReadyState != 4
* HB_IDLESLEEP( 0 )
ENDDO
IF oIE:LocationURL = 'https://www.nfe.fazenda.gov.br/PORTAL/visualizacaoNFe/completa/impressao.aspx'
textoNFe := oIE:Document:body:innerHTML
* ? TextoNFE
? "OKKKKKKK"
INKEY(0)
ENDIF
ENDIF
? "ok"
wait
ELSE
? "Error. IExplorer not available.", win_oleErrorText()
ENDIF
[]s
Fernando
projeto hbNFe NFe para [x]Harbour venha fazer parte do time http://www.pctoledo.com.br/forum/viewforum.php?f=54
Harbour 3.2 + Hwgui (HBIDE)
Harbour 3.2 + Hwgui (HBIDE)
Re: Ler DANFE pelo site da NFE
Bom dia!
Não consegui gerar o executavel atraves de vosso codigo fonte é possivel vc me enviar o executavel para testar e oque vc usou para gera-lo que aqui usando o xharbour 99.70 da erro, na linha:
IF ( oIE := win_oleCreateObject( "InternetExplorer.Application" ) ) != NIL
Nao existe a funcao Win_oleCreateObject, colocando apenas CreateObject compila mais nao funciona.
Tenho parte de um codigo que transforma o codigo Html dos itens da NFE em DBF, não e 100% mais ajuda muito posso envir para vc dar uma olhada uso quando o fornecedor nao envia o xml.. entro na pagina consulto e salvo o codigo fonte e transformo em DBf.
Obrigado.
Frazato
Não consegui gerar o executavel atraves de vosso codigo fonte é possivel vc me enviar o executavel para testar e oque vc usou para gera-lo que aqui usando o xharbour 99.70 da erro, na linha:
IF ( oIE := win_oleCreateObject( "InternetExplorer.Application" ) ) != NIL
Nao existe a funcao Win_oleCreateObject, colocando apenas CreateObject compila mais nao funciona.
Tenho parte de um codigo que transforma o codigo Html dos itens da NFE em DBF, não e 100% mais ajuda muito posso envir para vc dar uma olhada uso quando o fornecedor nao envia o xml.. entro na pagina consulto e salvo o codigo fonte e transformo em DBf.
Obrigado.
Frazato
Re: Ler DANFE pelo site da NFE
hbmk2 arquivofonte -lhbwin
hbwin tem essa funcao
seria interessante o esquema do html para dbf
nao uso dbf mas da para eu jogar na memoria
estou penando para baixar o gif captcha https é dureza nao consegui com hbtip
tentei com clipboard, mas capturar CF_BITMAP nao é minha praia
[]s
Fernando
hbwin tem essa funcao
seria interessante o esquema do html para dbf
nao uso dbf mas da para eu jogar na memoria
estou penando para baixar o gif captcha https é dureza nao consegui com hbtip
tentei com clipboard, mas capturar CF_BITMAP nao é minha praia
[]s
Fernando
projeto hbNFe NFe para [x]Harbour venha fazer parte do time http://www.pctoledo.com.br/forum/viewforum.php?f=54
Harbour 3.2 + Hwgui (HBIDE)
Harbour 3.2 + Hwgui (HBIDE)
Re: Ler DANFE pelo site da NFE
Bom dia! Não tenho o harbour instalado e não domino muito bem ela tambem, seria possivél vc me enviar o executavel para captura do Html para eu ir testando e montando a transformação de Html para DBF/TXT.
Segue codigo que uso para leitura de produtos, os demais não tive tempo para fazer ainda, pois uso a leitura via xml que e bem mais completa, pois as vezes a leitura pelo HTML nao retorna todos os dados corretamente.
Frazato
Segue codigo que uso para leitura de produtos, os demais não tive tempo para fazer ainda, pois uso a leitura via xml que e bem mais completa, pois as vezes a leitura pelo HTML nao retorna todos os dados corretamente.
Frazato
- Anexos
-
danfehtml.prg- (9.67 KiB) Baixado 376 vezes
Re: Ler DANFE pelo site da NFE
agora esta com um melhor entendimento, só falta converter o corpo para texto/dbf/banco,...
nao da para anexar o exe por mesmo compactado passa dos 100k
[]s
Fernando
Código: Selecionar todos
* teste para leitura de nfe da web
* Fernando Athayde
PROCEDURE Main()
Exm_IExplorer()
RETURN
STATIC PROCEDURE Exm_IExplorer()
oIE := win_oleCreateObject( "InternetExplorer.Application" ) // INICIA OLE
IF oIE == NIL
? "Error. IExplorer not available.", win_oleErrorText()
ENDIF
lErroCaptcha := .F.
DO WHILE .T.
abreFormularioNFe("inicio")
IF !abreCaptcha()
lErroCaptcha := .T.
EXIT
ENDIF
cCaptcha=" "
@ 0,0 GET cCaptcha PICT "@X"
READ
cCaptcha=ALLTRIM(cCaptcha)
IF LASTKEY() = 27
EXIT
ENDIF
IF !abreFormularioNFe("preencimento")
LOOP
ENDIF
cCorpoNfe := ""
IF !mostraImpressao(.F.)
LOOP
ELSE
// OK
MEMOWRIT("corpo.html",cCorpoNfe)
EXIT
ENDIF
ENDDO
IF lErroCaptcha
? "erro ao obter captcha"
ENDIF
oIE:Quit()
RETURN
FUNCTION abreFormularioNFe(cTipo)
IF cTipo == "inicio"
oIE:Visible := .F.
oIE:menubar = .F.
oIE:toolbar = .F.
oIE:statusbar = .F.
oIE:Navigate( "https://www.nfe.fazenda.gov.br/portal/FormularioDePesquisa.aspx?tipoconsulta=completa" )
WHILE oIE:ReadyState != 4
HB_IDLESLEEP( 0 )
ENDDO
ELSE
oIE:Visible := .F.
oIE:GoBack()
WHILE oIE:ReadyState != 4
HB_IDLESLEEP( 0 )
ENDDO
IF oIE:LocationURL = 'https://www.nfe.fazenda.gov.br/portal/FormularioDePesquisa.aspx?tipoconsulta=completa'
oIE:Document:All('ctl00$ContentPlaceHolder3$chaveAcesso', 0):value := '35101206995064000156550010000000430000000430'
oIE:Document:All('ctl00$ContentPlaceHolder3$intercepta', 0):value := cCaptcha
oIE:Document:All('ctl00$ContentPlaceHolder3$btcontinuar', 0):click()
WHILE oIE:Busy
HB_IDLESLEEP( 0 )
ENDDO
IF ! oIE:LocationURL == 'https://www.nfe.fazenda.gov.br/portal/visualizacaoNFe/completa/Default.aspx' //nao preencheu corretamente
RETURN(.F.)
ENDIF
ELSE
RETURN(.F.)
ENDIF
ENDIF
RETURN(.T.)
FUNC abreCaptcha()
IF ! oIE:LocationURL == 'https://www.nfe.fazenda.gov.br/portal/FormularioDePesquisa.aspx?tipoconsulta=completa'
RETURN(.F.)
ENDIF
oIE:left = 0
oIE:top = 0
oIE:height = 180
oIE:width = 260
oIE:Visible := .T.
oIE:Navigate( "https://www.nfe.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image" )
WHILE oIE:ReadyState != 4
HB_IDLESLEEP( 0 )
ENDDO
RETURN(.T.)
FUNC mostraImpressao(lMostra)
IF lMostra
oIE:Visible := .T.
oIE:left = 0
oIE:top = 0
oIE:height = 600
oIE:width = 800
ENDIF
oIE:Navigate( 'https://www.nfe.fazenda.gov.br/PORTAL/visualizacaoNFe/completa/impressao.aspx' )
WHILE oIE:ReadyState != 4
HB_IDLESLEEP( 0 )
ENDDO
IF oIE:LocationURL = 'https://www.nfe.fazenda.gov.br/PORTAL/visualizacaoNFe/completa/impressao.aspx'
cCorpoNfe := oIE:Document:body:innerHTML
ELSE
RETURN(.F.)
ENDIF
RETURN(.T.)
[]s
Fernando
projeto hbNFe NFe para [x]Harbour venha fazer parte do time http://www.pctoledo.com.br/forum/viewforum.php?f=54
Harbour 3.2 + Hwgui (HBIDE)
Harbour 3.2 + Hwgui (HBIDE)
Re: Ler DANFE pelo site da NFE
Estou compilando o exemplo que vc postou e deu certo o problema e que não está funcionando fica o tempo todo pedindo para digitar o CAPTCHA, até consegui mudar algumas coisas no exemplo para não digitar o CAPTCHa e tem hora que funciona e hora que não funciona.. outra coisa ele ficar pedindo uma solitação de autorização do windows para continuar a pagina..
Frazato.
Frazato.
Ler DANFE pelo site da NFE
Olá Colegas, td bem.. qdo executo o código acima ele da o erro: ERRO AO OBTER O CAPTHA
Alguém saberia dizer o q ocorre?
Sds.
Alguém saberia dizer o q ocorre?
Sds.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop
Celular Android/iOS Windev Mobile
WEB Windev Web
Sejamos gratos a Deus.
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop
Celular Android/iOS Windev Mobile
WEB Windev Web
Sejamos gratos a Deus.
- Roberto Evangelista
- Usuário Nível 1

- Mensagens: 5
- Registrado em: 02 Fev 2011 15:26
- Localização: teresina/pi
Ler DANFE pelo site da NFE
Peguei esse exemplo e tambem estava com esse mesmo erro.
Para corrigir ele é só trocar os link da pagina de consulta:
https://www.nfe.fazenda.gov.br/portal/F ... a=completa
por:
http://www.nfe.fazenda.gov.br/portal/co ... a=completa
Para corrigir ele é só trocar os link da pagina de consulta:
https://www.nfe.fazenda.gov.br/portal/F ... a=completa
por:
http://www.nfe.fazenda.gov.br/portal/co ... a=completa
Roberto Evangelista, Teresina-PI
Ler DANFE pelo site da NFE
:'(
Olá pessoal, eu compilei o exemplo com com as correções sugeridas, abre a janelinha do CAPTCHA eu digito, digito, digito, dig... e não vai para frente, fica em um loop, ai troquei a chave para uma nf-e que sei está autoriza e tal, mesmo assim não sai do loop, o que poderá ser ?
Hasa
:%
Olá pessoal, eu compilei o exemplo com com as correções sugeridas, abre a janelinha do CAPTCHA eu digito, digito, digito, dig... e não vai para frente, fica em um loop, ai troquei a chave para uma nf-e que sei está autoriza e tal, mesmo assim não sai do loop, o que poderá ser ?
Hasa
:%
Ler DANFE pelo site da NFE
Obrigado Evangelista pela resposta, mas eu esqueci de mencionar na minha postagem anterior q eu ja tinha trocado da forma q vc mencionou e o erro ocorre mesmo com o link correto.
Sds.
Sds.
Sun Tzu há mais de três mil anos cita nas epígrafes de seu livro “A Arte da Guerra“:
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop
Celular Android/iOS Windev Mobile
WEB Windev Web
Sejamos gratos a Deus.
“Concentre-se nos pontos fortes, reconheça as fraquezas, agarre as oportunidades e proteja-se contra as ameaças”.
“Se não é vantajoso, nunca envie suas tropas; se não lhe rende ganhos, nunca utilize seus homens; se não é uma situação perigosa, nunca lute uma batalha precipitada”.
Até 2017 Desktop Console [ Legado ] Harbour | MinGW | DBF | CDX | FastReport | MySQL
Novos Projetos:
Desktop Visual Windev Desktop
Celular Android/iOS Windev Mobile
WEB Windev Web
Sejamos gratos a Deus.
- Roberto Evangelista
- Usuário Nível 1

- Mensagens: 5
- Registrado em: 02 Fev 2011 15:26
- Localização: teresina/pi
Ler DANFE pelo site da NFE
Bem gente dei uma melhorada no código do Athayde, e coloquei um pequeno exemplo aqui!
E estou implementando na minha aplicação em MiniGUI. Esta ficando show...
E estou implementando na minha aplicação em MiniGUI. Esta ficando show...
Código: Selecionar todos
/*
* Teste para leitura de nfe da web
* Autor : Fernando Athayde
* Melhorias : Roberto Evangelista
*/
function Main()
private cMaskChave := '99-9999-99.999.999/9999-99-99-999-999.999.999-999.999.999-9'
private lLoop := .T., cTextoNFE := ""
private cChave := space( 44 ), cCaptCha := space( 4 )
private cURL_ConsultaCompleta := "http://www.nfe.fazenda.gov.br/PORTAL/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8="
private oIE := NIL
set score off
set console off
setcolor( '+w/b' )
clear
@ 001, 001 say ' Chave:'
@ 002, 001 say 'CaptCha:'
@ 003, 001 to 023, 078
cChave := '35110709339936000205550140000601181554427688'
oIE := Win_OleCreateObject( 'InternetExplorer.Application' )
oIE:Visible := .F.
while( lLoop )
cCaptCha := space( 4 )
setcolor( '+w/b, +w/n,,, +w/b' )
@ 004, 002 clear to 022, 077
if( oIE == NIL )
if( alert( { 'Erro. IExplorer indisponivel.', ;
Win_OleErrorText() , ;
'' , ;
'Deseja continuar?' }, { 'Sim', 'Nao' } ) == 1 )
oIE := Win_OleCreateObject( 'InternetExplorer.Application' )
else
lLoop := .F.
endif
else
oIE:Visible := .T.
lOk := AbreFormularioNFe( cURL_ConsultaCompleta, "Inicio" )
iif( lOk, msg( 'Mensagem: Obtendo o CaptChar, Aguarde...' ), NIL )
lOk := iif( lOk, AbreCaptCha( cURL_ConsultaCompleta ), lOk )
keyboard chr( 0 )
if( lOk )
setcolor( 'n/w, +w/n,,, n/w,, n/w' )
@ 001, 009 get cChave picture '@R@K ' + cMaskChave when msg( 'Mensagem: Digite a chave da NFe' )
@ 002, 009 get cCaptCha picture '@K' when msg( 'Mensagem: Digite o CaptChar' )
read
endif
if( lastkey() == 27 )
lLoop := .F.
else
AbreFormularioNFe( cURL_ConsultaCompleta, "Preenchimento", cChave, cCaptCha, @cTextoNFE )
if( !empty( cTextoNFE ) )
setcolor( '+gr/b' )
memoedit( cTextoNFE, 004, 002, 021, 77, .F.,, 1000, 3 )
endif
endif
endif
end while
iif( oIE != NIL, oIE:Quit(), NIL )
return( NIL )
/****
*/
function AbreFormularioNFe( cURL_Consulta, cTipo, cChave, cCaptChar, cTexto )
local nCol, nTempo, lOk := .T., cHtml := ""
if( lower( cTipo ) == "inicio" )
oIE:Visible := .F.
oIE:menubar := .F.
oIE:toolbar := .F.
oIE:statusbar := .F.
oIE:Navigate2( cURL_Consulta )
while( oIE:ReadyState != 4 )
HB_IDLESLEEP( 0 )
end while
else
cTexto := ""
oIE:Visible := .F.
oIE:GoBack()
while( oIE:ReadyState != 4 )
HB_IdleSleep( 0 )
end while
lOk := ( cURL_Consulta == oIE:LocationURL )
while( oIE:Busy )
HB_IdleSleep( 0 )
end while
if( lOk )
oIE:Document:All( 'ctl00$ContentPlaceHolder1$txtChaveAcessoCompleta', 0 ):Value := cChave
oIE:Document:All( 'ctl00$ContentPlaceHolder1$txtCaptcha' , 0 ):Value := cCaptcha
oIE:Document:All( 'ctl00$ContentPlaceHolder1$btnConsultar' , 0 ):click()
nTempo := TString( seconds() )
nCol := col()
while( oIE:Busy .and. lastkey() != 27 )
HB_IdleSleep( 0 )
msg( 'Mensagem: ' + ElapTime( nTempo, TString( seconds() ) ) )
nTecla := inkey()
end while
if( oIE:LocationURL == cURL_Consulta )//nao preencheu corretamente
msg( 'Mensagem: Codigo invalido!' )
lOk := .F.
endif
if( lOk )
oElemento := oIE:Document
aElemento := { { "ContentPlaceHolder1_tcnConsultaCompleta_tpnNFe" , "CABECALHO DA NFE" }, ;
{ "ContentPlaceHolder1_tcnConsultaCompleta_ptnEmitente" , "DADOS DO EMITENTE" }, ;
{ "ContentPlaceHolder1_tcnConsultaCompleta_tpnDestinatario" , "DADOS DO DESTINATARIO" }, ;
{ "ContentPlaceHolder1_tcnConsultaCompleta_tpnProdutosServicos", "PRODUTOS / SERVICOS" }, ;
{ "ContentPlaceHolder1_tcnConsultaCompleta_tpnTotais" , "TOTAIS" }, ;
{ "ContentPlaceHolder1_tcnConsultaCompleta_tpnTotais" , "COMERCIO EXTERIOR" }, ;
{ "ContentPlaceHolder1_tcnConsultaCompleta_tpnTransporte" , "TRANSPORTE" }, ;
{ "ContentPlaceHolder1_tcnConsultaCompleta_tpnCobranca" , "COBRANCA" }, ;
{ "ContentPlaceHolder1_tcnConsultaCompleta_tpnInfoAdicionais" , "INFORMACOES ADICIONAIS" }, ;
{ "ContentPlaceHolder1_tcnConsultaCompleta_tpnAvulsa" , "AVULSA" } }
if( oElemento != NIL )
for nA := 1 to len( aElemento )
// Captura o HTML da Tabela Form Cabecalho da NFE
oID := oElemento:getElementById( aElemento[ nA, 1 ] )
if( oID != NIL )
// Retorna o HTML do Objeto
cHtml := oID:innerHtml
aDados := ExtraiDados( cHtml )
cTexto += "---------------------- " + aElemento[ nA, 2 ] + " ---------------------------" + HB_OSNewLine()
for nB := 1 to len( aDados )
cTexto += aDados[ nB, 1 ] + ": " + aDados[ nB, 2 ] + HB_OSNewLine()
next nB
endif
cTexto += iif( nA != len( aElemento ), HB_OSNewLine(), "" )
next nA
nFile := fCreate( "nota.hmtl" )
fWrite( nFile, cHtml, len( cHtml ) )
fClose( nFile )
endif
endif
endif
endif
return( lOk )
/****
* Abre a imagem CaptChar
*/
function AbreCaptcha( cURL_Consulta )
local lOk := .F.
if( oIE:LocationURL == cURL_Consulta )
lOk := .T.
oIE:left := 0
oIE:top := 0
oIE:height := 180
oIE:width := 260
oIE:Visible := .T.
oIE:Navigate( "https://www.nfe.fazenda.gov.br/scripts/srf/intercepta/captcha.aspx?opt=image" )
while( oIE:ReadyState != 4 )
HB_IdleSleep( 0 )
end while
endif
return( lOk )
/****
* Função que extrai os dados do HTML e retorno num array[ campo, valor ]
*/
function ExtraiDados( cHtml )
local nLinha, cLinha, aDados := {}, cField := '', cValues := '', nItem := 0
local cTField := '<SPAN class=TextoFundoBrancoNegrito>', ;
cTValue := '<SPAN class=linha>'
for nLinha := 1 to mlcount( cHtml )
cValues := ''
nPos := 0
cLinha := alltrim( memoline( cHtml, 1000, nLinha ) )
if( '<TD ' $ cLinha )
cLinha := strtran( cLinha, '<TD ', '' ) ; cLinha := strtran( cLinha, '</TD>' , '' )
cLinha := strtran( cLinha, '<I>' , '' ) ; cLinha := strtran( cLinha, '</I>' , '' )
cLinha := strtran( cLinha, '<' + 'BR' + '>', '' ) ; cLinha := strtran( cLinha, ' ', '' )
lItem := ( !( cTField $ cLinha ) .and. ( cTValue $ cLinha ) )
if( cTField $ cLinha .or. cTValue $ cLinha )
if( !lItem )
cField := left( cLinha, at( '</SPAN>', cLinha ) + 7 )
cLinha := substr( cLinha, len( cField ) )
cField := substr( cField, at( cTField, cField ) + len( cTField ) )
cField := left( cField, at( '</SPAN>', cField ) - 1 )
else
cField := 'ITEM'
endif
while( cTValue $ cLinha )
if( cTValue $ cLinha )
cValue := left( cLinha, at( '</SPAN>', cLinha ) + 7 )
cLinha := substr( cLinha, len( cValue ) )
cValue := substr( cValue, at( cTValue, cValue ) + len( cTValue ) )
cValue := left( cValue, at( '</SPAN>', cValue ) - 1 )
cValues += cValue
else
exit
endif
cValues += iif( cTValue $ cLinha, " | ", "" )
end while
if( cField == 'ITEM' .and. len( aDados ) > 0 .and. aDados[ len( aDados ), 1 ] == "ITEM" )
nPos1 := len( aDados )
else
nPos1 := 0 ; nPos++
endif
if( !empty( cField ) .and. !empty( cValues ) .and. nPos1 == 0 )
aadd( aDados, { cField, cValues, nPos } )
elseif( !empty( cField ) .and. !empty( cValues ) .and. nPos1 > 0 )
aDados[ nPos1, 2 ] += " | " + cValues
endif
endif
endif
next nLinha
return( aDados )
/****
* Função de mensagem
*/
function msg( cMsg, nLinha, nColuna, cCor )
local oldCor
cMsg := iif( cMsg == NIL, '' , cMsg )
nLinha := iif( nLinha == NIL, 024 , nLinha )
nColuna := iif( nColuna == NIL, 001 , nColuna )
cCor := iif( cCor == NIL, '+w/b', cCor )
oldCor := setcolor( cCor )
@ 024, 000 clear
devPos( nLinha, nColuna )
devOut( cMsg )
setcolor( oldCor )
return( .T. )
