fabio Postado 12 Junho Autor Postado 12 Junho Parabéns pela sua descoberta... como você conseguiu achar esse token e url? Eu acredito que se não rejeitar ao tentar declarar é porque esta certa, pra mim quando envio um código gerado (pelo executável) por ex com cnpj errado ele retorna uma rejeição de identificador invalido
gralak Postado 12 Junho Postado 12 Junho Pessoal eu estou com um projeto aqui que esta GERANDO o CIOT para ANTT quando a empresa é ETC. Se alguém precisar me chama lá no privado.
Gm Saldanha Postado 12 Junho Postado 12 Junho 2 horas atrás, fabio disse: Parabéns pela sua descoberta... como você conseguiu achar esse token e url? Eu acredito que se não rejeitar ao tentar declarar é porque esta certa, pra mim quando envio um código gerado (pelo executável) por ex com cnpj errado ele retorna uma rejeição de identificador invalido Com a ajuda do ChatGPT identificamos as funçoes dentro da dll: public class GeradorCIOTService_v3 { public GeradorCIOTService_v3() public string AutenticarEObterTokenAsync() public string GerarCIOT(string cpfCnpj) public string ObterApiKey() public string ValidarCIOT(string ciot) } e tambem o caminho: _apiBaseUrl = "https://mtcuybq605.execute-api.sa-east-1.amazonaws.com/api-ciot-prd/GeradorCIOT" , com isso identificamos a chave: 3UwR]CYTeAQRF que por algum motivo é fixa, entao so precisamos estar enviando a cada requisição por que o token retornado tem que ser sempre diferente. URL := 'https://mtcuybq605.execute-api.sa-east-1.amazonaws.com/api-ciot-prd/GeradorCIOT/gerar'; Http.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + Token; , dai conforme o codigo anterior , basta desmembrar o json retornado e usar lembrando que nas operações de consulta , encerramento e cancelamento é necessario usar o protocolo retornado e não o idoperacaotransporte. então é necessario estar armazenando este retorno para cada mdfe gerado. Ate. 1
MarcosRWeimer Postado 12 Junho Postado 12 Junho 3 horas atrás, Gm Saldanha disse: Com a ajuda do ChatGPT identificamos as funçoes dentro da dll: public class GeradorCIOTService_v3 { public GeradorCIOTService_v3() public string AutenticarEObterTokenAsync() public string GerarCIOT(string cpfCnpj) public string ObterApiKey() public string ValidarCIOT(string ciot) } Conseguiu chamar o metodo GerarCIOT? Estou tentando aqui sem sucesso. -=Ma®©oS=-
MarcosRWeimer Postado 12 Junho Postado 12 Junho (editado) Evolui aqui, utilizando o ILSpy para explorar a DLL e converter o código dela de .NET para Delphi. Objetivo é gerar o código do CIOT (Item B4 do manual: "Código Identificador da Operação de Transporte: deve ser gerado conforme padrão definido pela ANTT, utilizando a DDL/Executável disponibilizada para geração do identificador") que vai no campo IdOperacaoTransporte no serviço DeclaracaoOperacaoTransporte Codigo: 1 - tentei anexar, o forum estava bloqueando achando se tratar de um ataque (estranho não?) 2 - Não consegui anexar, nem como .PAS nem como .TXT, erro 200 3 - Editando e anexando como ZIP foi Agora para chamar/gerar é só fazer assim: procedure TForm1.Button1Click(Sender: TObject); var Gerador: TGeradorCIOTService; begin Gerador := TGeradorCIOTService.Create; try ShowMessage(Gerador.GerarCIOT('AquiVaiOCNPJ')); finally Gerador.Free; end; end; Tem algumas coisas pra acertar ainda (memory leaks), estava em em um app só de teste, agora vou migrar pra dentro do sistema e fazer as melhorias. Unit1.zip Editado 12 Junho por MarcosRWeimer -=Ma®©oS=-
Gm Saldanha Postado 12 Junho Postado 12 Junho 3 horas atrás, MarcosRWeimer disse: Conseguiu chamar o metodo GerarCIOT? Estou tentando aqui sem sucesso. Ja deixei o codigo no post anterior, esta funcionando pra mim.
osmarbentojr Postado 15 Junho Postado 15 Junho Pessoal, bom dia, alguem conseguiu os endpoints de todos os serviços previstos para a geração própria ?
carlos_augusto Postado 15 Junho Postado 15 Junho (editado) 2 horas atrás, osmarbentojr disse: Pessoal, bom dia, alguem conseguiu os endpoints de todos os serviços previstos para a geração própria ? Homologação: https://appservices-hml.antt.gov.br/pefServices/api Produção: https://appservices.antt.gov.br/pefServices/api Editado 15 Junho por carlos_augusto
carlos_augusto Postado 15 Junho Postado 15 Junho Alguém tem tido algum erro de envio do CIOT em homologação?
carlos_augusto Postado 15 Junho Postado 15 Junho 5 minutos atrás, osmarbentojr disse: Sim, e os serviços ai dentro ? O que está na documentação. https://www.gov.br/antt/pt-br/assuntos/cargas/ciot-para-todos-1/dcs_pef_v1-1.pdf
osmarbentojr Postado 15 Junho Postado 15 Junho Obrigado, eu já tenho o exe pronto, estava com BO apenas nos endpoints, vou validar tudo e posto o que deu ou não certo, obrigado
carlos_augusto Postado 15 Junho Postado 15 Junho 1 minuto atrás, osmarbentojr disse: Obrigado, eu já tenho o exe pronto, estava com BO apenas nos endpoints, vou validar tudo e posto o que deu ou não certo, obrigado Se conseguir fazer um envio em homologação, me fala se funcionou. O meu funcionou até sexta-feira, pois, tem dado um erro. Parece ser da ANTT.
rafahot89 Postado 15 Junho Postado 15 Junho 6 horas atrás, carlos_augusto disse: Alguém tem tido algum erro de envio do CIOT em homologação? O meu parou de funcionar em homologaçao tambem, de sexta pra cá, deve ser alguma alteraçao ou indisponibilidade na ANTT
carlos_augusto Postado 15 Junho Postado 15 Junho 44 minutos atrás, rafahot89 disse: O meu parou de funcionar em homologaçao tambem, de sexta pra cá, deve ser alguma alteraçao ou indisponibilidade na ANTT Acabei de conseguir fazer um envio em ambiente de homologação. Talvez tenha restabelecido. 1
Marcio Cenci Postado Quinta as 22:26 Postado Quinta as 22:26 Olá pessoal, gostaria de saber se conseguiram integrar tanto homologação quanto produção direto na ANTT. Estou tentando integrar aqui também, ainda sem sucesso, e NÃO estou usando as DLLs ou o exe da antt.
Gm Saldanha Postado Sexta as 11:28 Postado Sexta as 11:28 12 horas atrás, Marcio Cenci disse: Olá pessoal, gostaria de saber se conseguiram integrar tanto homologação quanto produção direto na ANTT. Estou tentando integrar aqui também, ainda sem sucesso, e NÃO estou usando as DLLs ou o exe da antt. Continua funcionando pra mim usando a url e a key pra gerar o token diretamente. Espero que o codigo ajude. procedure TFRMMDFENEW.BitBtn31Click(Sender: TObject); var Http: TIdHTTP; SSL: TIdSSLIOHandlerSocketOpenSSL; JsonEnvio: TStringStream; Resposta: string; URL: string; ciot, Token: string; JsonResposta: TJSONObject; DadosObj: TJSONObject; begin // 1. OBTER TOKEN URL := 'https://mtcuybq605.execute-api.sa-east-1.amazonaws.com/api-ciot-prd/GeradorCIOT/token'; Http := TIdHTTP.Create(nil); SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil); SSL.SSLOptions.Method := sslvTLSv1_2; SSL.SSLOptions.SSLVersions := [sslvTLSv1_2]; try Http.IOHandler := SSL; Http.Request.ContentType := 'application/json'; Http.Request.Accept := 'application/json'; Http.Request.CustomHeaders.Values['chave'] := '3UwR]CYTeAQRF'; JsonEnvio := TStringStream.Create('{}', TEncoding.UTF8); try Resposta := Http.Post(URL, JsonEnvio); memo4.Lines.Add('Token HTTP: ' + IntToStr(Http.ResponseCode)); memo4.Lines.Add('Resposta Token: ' + Resposta); finally JsonEnvio.Free; end; // Extrai o token JsonResposta := TJSONObject.ParseJSONValue(Resposta) as TJSONObject; if JsonResposta <> nil then begin try Token := JsonResposta.GetValue<string>('token', ''); memo4.Lines.Add('Token obtido: ' + Token); finally JsonResposta.Free; end; end; if Token = '' then begin memo4.Lines.Add('ERRO: Não foi possível obter o token'); Exit; end; // 2. GERAR CIOT URL := 'https://mtcuybq605.execute-api.sa-east-1.amazonaws.com/api-ciot-prd/GeradorCIOT/gerar'; Http.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + Token; JsonEnvio := TStringStream.Create( '{"cpfCnpj":"' + OnlyNumbers(frmmodule.tblempresaCNPJ.Text) + '"}', TEncoding.UTF8 ); try Resposta := Http.Post(URL, JsonEnvio); memo4.Lines.Add('Gerar HTTP: ' + IntToStr(Http.ResponseCode)); memo4.Lines.Add('Resposta Gerar: ' + Resposta); finally JsonEnvio.Free; end; // 3. EXTRAIR O CIOT (CORRIGIDO - está dentro do objeto "dados") JsonResposta := TJSONObject.ParseJSONValue(Resposta) as TJSONObject; if JsonResposta <> nil then begin try memo4.Lines.Add('=== DADOS DO RETORNO ==='); // Verifica se o campo "dados" existe if JsonResposta.TryGetValue<TJSONObject>('dados', DadosObj) then begin // Agora sim, pega o CIOT dentro de "dados" ciot := DadosObj.GetValue<string>('ciot', ''); memo4.Lines.Add('CIOT gerado: ' + ciot); memo4.Lines.Add('CNPJ: ' + DadosObj.GetValue<string>('cnpj', '')); memo4.Lines.Add('Data Geração: ' + DadosObj.GetValue<string>('dataGeracao', '')); end else begin // Se não tiver "dados", tenta mensagem de erro memo4.Lines.Add('Mensagem: ' + JsonResposta.GetValue<string>('mensagem', '')); end; finally JsonResposta.Free; end; end; // 4. SALVAR CIOT if ciot <> '' then begin if MessageDlg('Confirmar Inclusão CIOT ' + ciot + '?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin frmmodule.tblmdfe.Open; frmmodule.tblmdfe.Edit; frmmodule.tblmdfeciot.Text := ciot; frmmodule.tblmdfe.Post; memo4.Lines.Add('CIOT salvo com sucesso: ' + ciot); end; end else begin memo4.Lines.Add('ERRO: CIOT não foi gerado ou não pôde ser extraído'); end; except on E: Exception do begin memo4.Lines.Add('ERRO: ' + E.Message); if Assigned(Http.Response) then memo4.Lines.Add('HTTP: ' + IntToStr(Http.ResponseCode)); end; end; SSL.Free; Http.Free; end; 1
ANDRE LUIZ DOS SANTOS Postado Sábado as 18:47 Postado Sábado as 18:47 Em 19/06/2026 at 08:28, Gm Saldanha disse: Continua funcionando pra mim usando a url e a key pra gerar o token diretamente. Espero que o codigo ajude. procedure TFRMMDFENEW.BitBtn31Click(Sender: TObject); var Http: TIdHTTP; SSL: TIdSSLIOHandlerSocketOpenSSL; JsonEnvio: TStringStream; Resposta: string; URL: string; ciot, Token: string; JsonResposta: TJSONObject; DadosObj: TJSONObject; begin // 1. OBTER TOKEN URL := 'https://mtcuybq605.execute-api.sa-east-1.amazonaws.com/api-ciot-prd/GeradorCIOT/token'; Http := TIdHTTP.Create(nil); SSL := TIdSSLIOHandlerSocketOpenSSL.Create(nil); SSL.SSLOptions.Method := sslvTLSv1_2; SSL.SSLOptions.SSLVersions := [sslvTLSv1_2]; try Http.IOHandler := SSL; Http.Request.ContentType := 'application/json'; Http.Request.Accept := 'application/json'; Http.Request.CustomHeaders.Values['chave'] := '3UwR]CYTeAQRF'; JsonEnvio := TStringStream.Create('{}', TEncoding.UTF8); try Resposta := Http.Post(URL, JsonEnvio); memo4.Lines.Add('Token HTTP: ' + IntToStr(Http.ResponseCode)); memo4.Lines.Add('Resposta Token: ' + Resposta); finally JsonEnvio.Free; end; // Extrai o token JsonResposta := TJSONObject.ParseJSONValue(Resposta) as TJSONObject; if JsonResposta <> nil then begin try Token := JsonResposta.GetValue<string>('token', ''); memo4.Lines.Add('Token obtido: ' + Token); finally JsonResposta.Free; end; end; if Token = '' then begin memo4.Lines.Add('ERRO: Não foi possível obter o token'); Exit; end; // 2. GERAR CIOT URL := 'https://mtcuybq605.execute-api.sa-east-1.amazonaws.com/api-ciot-prd/GeradorCIOT/gerar'; Http.Request.CustomHeaders.Values['Authorization'] := 'Bearer ' + Token; JsonEnvio := TStringStream.Create( '{"cpfCnpj":"' + OnlyNumbers(frmmodule.tblempresaCNPJ.Text) + '"}', TEncoding.UTF8 ); try Resposta := Http.Post(URL, JsonEnvio); memo4.Lines.Add('Gerar HTTP: ' + IntToStr(Http.ResponseCode)); memo4.Lines.Add('Resposta Gerar: ' + Resposta); finally JsonEnvio.Free; end; // 3. EXTRAIR O CIOT (CORRIGIDO - está dentro do objeto "dados") JsonResposta := TJSONObject.ParseJSONValue(Resposta) as TJSONObject; if JsonResposta <> nil then begin try memo4.Lines.Add('=== DADOS DO RETORNO ==='); // Verifica se o campo "dados" existe if JsonResposta.TryGetValue<TJSONObject>('dados', DadosObj) then begin // Agora sim, pega o CIOT dentro de "dados" ciot := DadosObj.GetValue<string>('ciot', ''); memo4.Lines.Add('CIOT gerado: ' + ciot); memo4.Lines.Add('CNPJ: ' + DadosObj.GetValue<string>('cnpj', '')); memo4.Lines.Add('Data Geração: ' + DadosObj.GetValue<string>('dataGeracao', '')); end else begin // Se não tiver "dados", tenta mensagem de erro memo4.Lines.Add('Mensagem: ' + JsonResposta.GetValue<string>('mensagem', '')); end; finally JsonResposta.Free; end; end; // 4. SALVAR CIOT if ciot <> '' then begin if MessageDlg('Confirmar Inclusão CIOT ' + ciot + '?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then begin frmmodule.tblmdfe.Open; frmmodule.tblmdfe.Edit; frmmodule.tblmdfeciot.Text := ciot; frmmodule.tblmdfe.Post; memo4.Lines.Add('CIOT salvo com sucesso: ' + ciot); end; end else begin memo4.Lines.Add('ERRO: CIOT não foi gerado ou não pôde ser extraído'); end; except on E: Exception do begin memo4.Lines.Add('ERRO: ' + E.Message); if Assigned(Http.Response) then memo4.Lines.Add('HTTP: ' + IntToStr(Http.ResponseCode)); end; end; SSL.Free; Http.Free; end; Obrigado pelo compartilhamento, testado aqui e deu certo. Parabéns!!! 1 1
Recommended Posts
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora