GithubHelp home page GithubHelp logo

chapeupreto / sinesp Goto Github PK

View Code? Open in Web Editor NEW
142.0 35.0 39.0 281 KB

:oncoming_automobile: API em PHP para consultar informações de veículos na base de dados do SINESP Cidadão

License: MIT License

PHP 100.00%
sinesp placa captcha veiculos governo php api seguranca frete mercosul

sinesp's Introduction

Sinesp Cidadão PHP

Latest stable release Software license Total downloads

View my other packages and projects Follow @chapeupreto on Twitter Share this package on Twitter

SINESP Cidadão é uma base de dados pública de veículos brasileiros muito útil para identificar carros ou motos roubados ou suspeitos.

Sinesp PHP API Client

Infelizmente, o governo não mantém uma API pública para realizar esse tipo de consulta. Até então, a única maneira de visualizar as informações de um determinado veículo era através do site do Sinesp respondendo a perguntas de verificação (captchas) para cada uma das requisições. Assim, houve a necessidade de desenvolver uma API de modo a facilitar o acesso a essas informações.

Informações Disponíveis

Se um veículo com a placa especificada for encontrado, o servidor irá retornar com as seguintes informações:

  • codigoRetorno: código de retorno da consulta
  • mensagemRetorno: mensagem de retorno da consulta
  • codigoSituacao: código da situação do veículo
  • situacao: mensagem da situação do veículo
  • modelo: modelo do veículo
  • marca: marca do veículo
  • cor: cor do veículo
  • ano: ano de fabricação do veículo
  • anoModelo: ano do modelo do veículo
  • placa: placa consultada
  • data: data e hora da consulta
  • uf: estado ou unidade federativa do veículo
  • municipio: município ou cidade do veículo
  • chassi: chassi do veículo
  • dataAtualizacaoCaracteristicasVeiculo: data atualização das características do veículo
  • dataAtualizacaoRouboFurto: data atualização de informações sobre roubo ou furto
  • dataAtualizacaoAlarme:

Essas informações estarão disponíveis por meio de um array associativo ou como atributo do objeto.

Requisitos

  • PHP 5.4+
  • cURL
  • libxml / XML

Instalação

Instale a versão mais recente com:

composer require chapeupreto/sinesp

Utilização

Abaixo um exemplo simples e geral de utilização da biblioteca:

<?php

require 'vendor/autoload.php';

use Sinesp\Sinesp;

$veiculo = new Sinesp;

try {
    $veiculo->buscar('GWW-6471');
    if ($veiculo->existe()) {
        print_r($veiculo->dados());
    }
} catch (\Exception $e) {
    echo $e->getMessage();
}

O método buscar() deve ser o primeiro método a ser invocado. Esse método é empregado para localizar informações do veiculo com a placa informada.

Após a chamada ao método buscar(), o método dados() irá retornar um array associativo contendo todas as informações do veículo.

Ainda, ao invés de utilizar todo o array retornado pelo método dados(), pode-se também recuperar uma informação isoladamente acessando-a como atributo do objeto:

echo 'O municipio do veiculo é ', $veiculo->municipio;

Proxy

O SINESP pode bloquear conexões vindas de fora do país. Caso a consulta não retorne resultados por erro de conexão (por exemplo, erro de timeout), pode-se realizar uma consulta usando proxy.

Existem diversos proxy gratuitos (e.g., http://proxylist.hidemyass.com/) que podem ser encontrados facilmente na Internet. Um exemplo de utilização com proxy encontra-se abaixo:

$veiculo = new Sinesp;
$veiculo->proxy('177.54.144.208', '80'); // Com proxy, esse metodo deve ser chamado antes do metodo buscar()

$veiculo->buscar('GWW-6471');
print_r($veiculo->dados());

Opcionalmente, ao invés de usar o metodo proxy($ip, $porta), pode-se utilizar um array associativo com as chaves ip e porta como segundo argumento do método buscar():

$veiculo = new Sinesp;
$veiculo->buscar('GWW-6471', ['ip' => '177.54.144.208', 'porta' => '80']); // a consulta usara o proxy especificado

print_r($veiculo->dados());

Timeout

Uma vez que o SINESP não mata sua requisição após bloqueio, é provável que você acabe se deparando com erro(s) 504. A fim de evitar transtorno, foi disponibilizado o método timeout para definir um tempo máximo de resposta:

$veiculo->timeout(5); // tempo em segundos

Dica: Em combinação com o proxy (fazendo múltiplas tentativas com diferentes proxies), isso poderá aumentar consideravelmente suas chances de sucesso para múltiplas requisições

Múltiplos erros 504 com diferentes proxies, mas sem timeout Com diferentes proxies, mas sem timeout

Maior parte dos 504 contornados usando proxy + timeout Com diferentes proxies e timeout

Agradecimentos

sinesp's People

Contributors

chapeupreto avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

sinesp's Issues

Falta executar o CURL

No código está:
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_close($ch);

Falta o $this->response = curl_exec($ch); antes do curl_close($ch);

Além disso, toda placa consultada resulta em:
Array ( [codigoRetorno] => 1 [mensagemRetorno] => Erro no processamento da consulta. )

> Boa Tarde Pessoal alguém conseguiu implementar em PHP para compartilhar conosco ?

Boa Tarde Pessoal alguém conseguiu implementar em PHP para compartilhar conosco ?

O processo é fácil mas voce tem que implementar, vou postar o passo a passo

1 Etapa - registrando o aplicativo no cloud via api
POST /checkin HTTP/1.1
Host: android.clients.google.com
Host: android.clients.google.com
content-length: 70
Connection: keep-alive
cache-control: no-cache

	{
	"userSerialNumber": 0, 
	"checkin":
	{
		"type": 1 
	},
	"version": 49
	}

2 Etapa - gerando o token firebase

POST /c2dm/register3 HTTP/1.1
Host: android.clients.google.com
Authorization: AidLogin 4110676151848553255:2997152737904869802
app: br.gov.sinesp.cidadao.android
Host: android.clients.google.com

sender=905942954488&app=br.gov.sinesp.cidadao.android&device=4110676151848553255&app_ver=49&X-appid=eFMtyJXP3459&X-subtype=905942954488&X-app_ver=49&cert=daf1d792d60867c52e39c238d9f178c42f35dd98

3 Etapa - fazendo a consulta.
Lembra de pegar a secreta "#8.1.0#0KnlVSWHxOih3zKXBWlo" e fazer o hash_hmac

POST /sinesp-cidadao/mobile/consultar-placa/v5 HTTP/1.1
Host: cidadao.sinesp.gov.br
Authorization: Token eFMtyJXP3459:APA91bENYracfIE0WduGFhfBeSDqzZ7V77NJbIsz374cbidjAuuLDRyGlFm3rvXwN8NrbYK1Cb_9V5djo_bsmsTblysyBiIxxrSqzLKf-A38S-_93kGU34Cyw0w5SYkvxZI8pdJ6eUJh
Content-Type: text/xml
Host: cidadao.sinesp.gov.br
cookie: JSESSIONID=UMeSkul4N14lAm9UK35DNRxg.cidadao1; cw_aplicacao_cidadao=1.cidadao1; cw_aplicacao_mandado=1.cidadao1; cw_aplicacao_desaparecidos=1.cidadao1
accept-encoding: gzip, deflate
content-length: 617
Connection: keep-alive
cache-control: no-cache

<v:Envelope xmlns:v="http://schemas.xmlsoap.org/soap/envelope/">
<v:Header>
<b>samsung GT-I9192</b>
<c>ANDROID</c>
<d>8.1.0</d>
<e>5.1</e>
<f>192.168.0.11</f>
<g>1d25306ef40c954de17356916447159e751deac8</g>
<h>0.0</h>
<i>0.0</i>
<k></k>
<l>16-07-2019 14:05:37</l>
<m>8797e74f0d6eb7b1ff3dc114d4aa12d3</m>
<n>eFMtyJXP3459</n>
</v:Header>
<v:Body>
<n0:getStatus xmlns:n0="http://soap.ws.placa.service.sinesp.serpro.gov.br/">
<a>PJP2356</a>
</n0:getStatus>
</v:Body>
</v:Envelope>

Originally posted by @maycon1038 in #37 (comment)

ERRO AO CONSULTAR

Boa tarde, não estou conseguindo efetuar as pesquisas está dando o seguinte erro

O servidor retornou nenhuma resposta!

alguém consegue me ajudar?

Qual Versão do PHP devo utilizar ?> > > Então agora pra quem usava com PHP não tem mais solução ?

Então agora pra quem usava com PHP não tem mais solução ?

Você já conseguiu fazer funcionar em PHP?
Se precisar eu fiz um fork, não tenho problemas em te passar.

Eu não consegui ainda se vc puder ajudar.
Passe o Link para eu fazer o download dele em PHP obrigado memso

Fiz o convite para você poder baixar meu repositório, não vou deixar público pois é apenas uma versão de teste, mas como você precisa vai te servir.
Fiz o favor de adicionar novas funções como a geração de Token a cada vez que a requisição falhar.
Minhas recomendações são: capturar requisição de registro para que tu tenha um ID único e possa gerar Tokens unicamente em seu sistema, adicionar um proxy (está no index.php, tem uma linha comentada com '//' se você retira-lá poderá adicionar um proxy sem ele, se hospedado em sites pode a requisição não funcionar, tem que ser um IP casual brasileiro (ainda estudando a natureza certa do IP).
Para consultar é necessário alterar o documento mas o meio de pesquisa pode ser alterado usando por exemplo um framework como o Slim por exemplo para a criação de uma API REST, ou até mesmo usando uma variável trazendo o valor GET, seria mais ou menos como "$placa = $_GET['placa']" e passando a placa como index.php?placa=GGG-9996...
Há algumas coisas que precisam de melhorias mas não tenho tempo para investir nessa lib pois não é para a linguagem da qual eu faço uso, fiz algumas melhorias para lhe ajudar e não posso mais investir tanto tempo nela, as melhorias deverão ser percebidas e corrigidas, mas eu testei e está funcionado tudo muito bem.

Originally posted by @jeffduarte97 in #37 (comment)

Legalidade

Olá pessoa, tenho uma duvida..
Ate que ponto é legal eu usar a api no meu sistema pras pessoas usarem ?

Obrigado!

Não funciona

Já tentei usar diferentes proxies e continua:

Com proxy:
O servidor retornou nenhuma resposta!

Sem proxy:
Array ( [codigoRetorno] => 1 [mensagemRetorno] => Erro no processamento da consulta. ) Array ( [codigoRetorno] => 1 [mensagemRetorno] => Erro no processamento da consulta. )

API parou de funcionar 28-08-2018

API começou a parar de funcionar no final desde domingo. Alguém mais com esse problema? será se é a secret key novamente? a api de vcs estão funcionando corretamente?

Usando código default - O servidor retornou nenhuma resposta!

{data: "O servidor retornou nenhuma resposta![]↵", status: 200, headers: ƒ, config: {…}, statusText: "OK"}

expandido

{data: "O servidor retornou nenhuma resposta![]↵", status: 200, headers: ƒ, config: {…}, statusText: "OK"}
config
:
{method: "POST", transformRequest: Array(1), transformResponse: Array(1), paramSerializer: ƒ, jsonpCallbackParam: "callback", …}
data
:
"O servidor retornou nenhuma resposta![]↵"
headers
:
ƒ (i)
status
:
200
statusText
:
"OK"
proto
:
Object

Versão desatualizada

Esta retornando essa mensagem ao consultar uma placa:

Array ( [codigoRetorno] => 7 [mensagemRetorno] => Versão desatualizada. Favor atualizar aplicativo. ) A non-numeric value encountered

Problemas com a Atualização do Sinesp

Amigo, provavelmente o sinesp atualizou algo para a sua API parar de funcionar....
Será que consegue descobrir a diferença e atualiza-la?

Comecei a utilizar sua API recentemente e agora parou...

Aproveitando o comentário....
O que é a variavel $secret ?
Onde você a cadastra ou altera...

Obrigado desde já...
Ótimo trabalho.

como alterar a placa digitada num form

Ola, como eu faco para nao vir preenchido o campo $veiculo->buscar('$AAA0000');
pois no modelo atual a placa fica definida e nao consigo alterar, sempre...

tenho uma pagina onde precisava digitar a placa num form com outras info.. ao digitar no campo placa ele faz a consulta neste sistema acima, e preenche os demais campos do meu form que tem carro, ano e cor...

o sistema em si eu sei dar o print_r($veiculo->dados()); para exibir os dados
mas nao conseguir implementar essa acao que mencionei...

obrigado

Informações adicionais

Olá, primeiramente excelente a sua API, funcionou perfeitamente!
Gostaria de saber se existe a possibilidade de adicionar 2 informações pertinentes aos veículos.
Tipo de combustível: Alcool, Gasolina, Flex, Diesel etc.
e Tipo de veiculo: Passeio, Comercia, etc.

Mais uma vez parabéns pela API.

Placas Mercosul

O novo padrão de placas já está sendo usado no Rio de Janeiro, e já preciso fazer a validação delas.
O modelo segue o padrão LLL NL NN para carros e LLL NN LN para motos, onde L é letra e N é número.

Ignorei a função validar($placa), que o preg_match não bate, retornando true nela manualmente. Aí recebo o erro "Erro no processamento da consulta". Alguma ajuda?

:(

Array ( [codigoRetorno] => 7 [mensagemRetorno] => Versão desatualizada. Favor atualizar aplicativo. ) O ano do veiculo eh

O servidor retornou nenhuma resposta!

Boa tarde!

Primeiro: parabéns pela API!
Meu problema: rodando localmente (IP do Brasil) funciona perfeitamente com qualquer proxy da lista https://www.proxynova.com/proxy-server-list/country-br , funciona sem proxy e funciona com o proxy de exemplo, porém quando uso a aplicação no servidor da Digital Ocean (IP dos EUA) o servidor retorna sempre "O servidor retornou nenhuma resposta!" independente do proxy que eu use ( testei vários) e sem proxy retorna "Limite de consultas excedido. Tente novamente mais tarde." após pouco mais de uma centena de consultas
Me parece que o proxy não está funcionando, alguma dica?

Atualização quebrou a api :(

Tá retornando o código

{"codigoRetorno":"7","mensagemRetorno":"Vers\u00e3o desatualizada. Favor atualizar aplicativo."}

Sistema atualizado e parou de repente

Pessoal , alguém sabe o motivo do sistema parar de repente de funcionar ?

esta atualizado e estava rodando perfeitamente.

segue o erro abaixo

"

Fatal error: Uncaught exception 'Exception' with message 'O servidor retornou nenhuma resposta!' in /home/v1010375/placa.com/vendor/chapeupreto/sinesp/src/Sinesp.php:84
Stack trace:
#0 /home/v1010375/placa.com/vendor/chapeupreto/sinesp/src/Sinesp.php(49): Sinesp\Sinesp->tratarResposta()
#1 /home/v1010375/placa.com/vendor/chapeupreto/sinesp/src/Sinesp.php(22): Sinesp\Sinesp->exec()
#2 /home/v1010375/placa.com/placa.php(16): Sinesp\Sinesp->buscar('numero da placa')
#3 {main}
thrown in /home/v1010375/placa.com/vendor/chapeupreto/sinesp/src/Sinesp.php on line 84

"

Funcionando em 22/04/2018?

Estou tentando adaptar o código para outra linguagem e gostaria de saber se a API de vocês está funcionando hoje, 22/04/2018.

Obrigado!

Esta retornando esse erro.

Curl erro: Operation timed out after 5000 milliseconds with 0 out of 0 bytes received.

Como posso resolver?

O projeto parou de funcionar esse ano de 2018.

Aparece esse erro ao usar essas rotinas, as mesmas estavam funcionando até o final de 2017, e em 2018 parou.

{"codigoRetorno":"7","mensagemRetorno":"Versão desatualizada. Favor atualizar aplicativo."}

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.