Ler DANFE pelo site da NFE

Projeto [x]Harbour - Compilador de código aberto compatível com o Clipper.

Moderador: Moderadores

frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Ler DANFE pelo site da NFE

Mensagem por frazato »

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
Anexos
leitura_html.txt
(9.54 KiB) Baixado 667 vezes
edmarfrazao
Usuário Nível 3
Usuário Nível 3
Mensagens: 185
Registrado em: 06 Dez 2005 11:16

Re: Ler DANFE pelo site da NFE

Mensagem por edmarfrazao »

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.
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Re: Ler DANFE pelo site da NFE

Mensagem por frazato »

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
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Re: Ler DANFE pelo site da NFE

Mensagem por frazato »

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.



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. 
 
 
 
 
 
 
end
athayde
Colaborador
Colaborador
Mensagens: 166
Registrado em: 14 Fev 2007 16:54

Re: Ler DANFE pelo site da NFE

Mensagem por athayde »

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

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
aproveitando alguem teve sucesso em fazer a consulta do status da NFe pelo pocketsoap?

[]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)
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Re: Ler DANFE pelo site da NFE

Mensagem por frazato »

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
athayde
Colaborador
Colaborador
Mensagens: 166
Registrado em: 14 Fev 2007 16:54

Re: Ler DANFE pelo site da NFE

Mensagem por athayde »

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
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)
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Re: Ler DANFE pelo site da NFE

Mensagem por frazato »

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
Anexos
danfehtml.prg
(9.67 KiB) Baixado 376 vezes
athayde
Colaborador
Colaborador
Mensagens: 166
Registrado em: 14 Fev 2007 16:54

Re: Ler DANFE pelo site da NFE

Mensagem por athayde »

agora esta com um melhor entendimento, só falta converter o corpo para texto/dbf/banco,...

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.)
nao da para anexar o exe por mesmo compactado passa dos 100k

[]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)
frazato
Usuário Nível 3
Usuário Nível 3
Mensagens: 219
Registrado em: 08 Jul 2004 07:45

Re: Ler DANFE pelo site da NFE

Mensagem por frazato »

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.
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Ler DANFE pelo site da NFE

Mensagem por fladimir »

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.
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.
Avatar do usuário
Roberto Evangelista
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 02 Fev 2011 15:26
Localização: teresina/pi

Ler DANFE pelo site da NFE

Mensagem por Roberto Evangelista »

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
Roberto Evangelista, Teresina-PI
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

Ler DANFE pelo site da NFE

Mensagem por 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
:%
Avatar do usuário
fladimir
Colaborador
Colaborador
Mensagens: 2445
Registrado em: 15 Nov 2006 20:21

Ler DANFE pelo site da NFE

Mensagem por fladimir »

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.
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.
Avatar do usuário
Roberto Evangelista
Usuário Nível 1
Usuário Nível 1
Mensagens: 5
Registrado em: 02 Fev 2011 15:26
Localização: teresina/pi

Ler DANFE pelo site da NFE

Mensagem por Roberto Evangelista »

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...

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. )
Responder