Survival LLM
A free AI assistant and survival library (1.5 million offline articles) that runs on your own computer, with no internet. Shows the source of every answer. Mac and Windows.
Medição própria por GPS (API Olho Vivo, SPTrans) de quantos ônibus e linhas rodaram no 2º turno, comparada a domingos normais e dias úteis.
Translation pending
OtherHTML · PythonGitHub @travahackerOnlineOwner unconfirmed
Have you tried it? One tap is enough. No sign-in needed.
No updates detected yet. GitHub releases will appear here.
Owners of public repositories under a personal GitHub account can sign in to verify ownership and manage the introduction themselves. No administrator approval is needed.
Sign in, generate a verification file, and commit it to this repository’s default branch within 30 minutes. Files on other branches or forks do not count. Then check the file below to manage the project without administrator approval. Keep the file to retain your access.
If needed, you will go to sign-in. After signing in, return here and press your chosen verification button again.
Run /nomorevibe verify in your project folder to verify ownership and manage the introduction yourself.
Verify in one minuteAsk about other verification options
Auditoria independente dos ônibus de São Paulo na eleição: coleta de GPS da SPTrans (Olho Vivo), hash encadeado e painel comparativo. Python, sem dependências.
Translation pending
Taken from the repository README
Loading the full README.
Read the full README ↗Auditoria independente da circulação dos ônibus municipais de São Paulo, com dados de GPS da SPTrans (API Olho Vivo) e o GTFS oficial. Coleta a posição dos ônibus a cada 2 minutos, guarda cada resposta com hash encadeado (para provar que não foi alterada), e compara o dia da eleição com dias úteis e domingos normais. Só Python (biblioteca padrão), SQLite e JavaScript puro.
Licença MIT · Python 3.9+ · sem dependências externas · painel ao vivo: https://travahacker.com.br/analise-onibus/
Captura do painel em 25/10/2026. O painel publicado continua sendo atualizado.
Palavras-chave: SPTrans, Olho Vivo, ônibus, São Paulo, GPS, GTFS, transparência, dados abertos, eleições 2026, auditoria cidadã, civic tech, LAI.
No segundo turno de 2026 (25/10), a Justiça Eleitoral mandou a Prefeitura de São Paulo operar 100% da frota de ônibus, com programação de dia útil. Houve denúncias de que isso não aconteceu, e não existia série pública de posições de GPS para conferir: a API do Olho Vivo só informa a posição atual. Este projeto é o que coletamos, medimos e publicamos, com o código aberto para que qualquer pessoa possa conferir o método ou repetir a coleta em outro dia.
Resumo do painel, atualizado em 29/10/2026, com as fontes. O painel publicado é a versão que vale.
Conclusão do painel: no período medido circularam cerca de 36% menos ônibus do que num dia útil, com confiança alta para essa faixa horária (mesmo método nos dois lados) e média para o restante do dia, que depende de medições de terceiros. O projeto não conclui se houve descumprimento da ordem (decisão da Justiça) nem a intenção de ninguém. A coleta só começou às 16h30 de 25/10, então a manhã não foi medida por nós.
Uma primeira versão do painel (25/10) usava um indicador de linhas que comparava conjuntos diferentes (linhas só de dia útil contra linhas de domingo) e foi descartado quando houve dias úteis medidos para calibrá-lo. A comparação atual usa o mesmo método e a mesma faixa horária nos dois lados.
git clone https://github.com/travahacker/analise-onibus.git
cd analise-onibus
python3 -m unittest discover -s tests -v # testes
./demo.sh # abre o painel em http://127.0.0.1:8000/
O demo.sh sobe uma API simulada (servidor/api_simulada.py, dados fictícios), faz 4 coletas, agrega, confere a cadeia de hashes e serve o painel. É a forma mais rápida de entender o fluxo inteiro. Em sistemas muito enxutos o módulo zoneinfo pode precisar do pacote tzdata.
A API do Olho Vivo exige credencial. O que funcionou para nós foi o gateway APILIB da Prefeitura de São Paulo (WSO2), e não o endpoint antigo:
export ONIBUS_DATA=/var/lib/analise-onibus # dados brutos e SQLite
export ONIBUS_OUT=/var/www/analise-onibus/data # JSON do painel
export ONIBUS_MODO=gateway
export SPTRANS_CONSUMER_KEY=...
export SPTRANS_CONSUMER_SECRET=...
python3 servidor/coletor.py # uma coleta
python3 servidor/agregar.py # regenera os JSON do painel
python3 servidor/verificar_manifesto.py "$ONIBUS_DATA"
Agende com cron (exemplo em servidor/analise-onibus.cron):
*/2 * * * * set -a; . /etc/analise-onibus.env; set +a; python3 /opt/analise-onibus/coletor.py >> /var/log/analise-onibus.log 2>&1
*/5 * * * * python3 /opt/analise-onibus/agregar.py >> /var/log/analise-onibus.log 2>&1
| Variável | Para que serve |
|---|---|
ONIBUS_MODO | gateway (APILIB, recomendado) ou legado (api.olhovivo.sptrans.com.br, padrão por compatibilidade) |
SPTRANS_CONSUMER_KEY, SPTRANS_CONSUMER_SECRET | Credenciais do gateway, com renovação automática do token |
SPTRANS_ACCESS_TOKEN | Token Bearer fixo, no lugar das chaves (expira em cerca de 1 hora) |
SPTRANS_TOKEN | Token do modo legado |
ONIBUS_DATA | Pasta de dados brutos e SQLite (padrão /var/lib/analise-onibus) |
ONIBUS_OUT | Pasta dos JSON do painel |
OLHOVIVO_BASE | Sobrescreve a URL base da API (usado nos testes e no demo.sh) |
ONIBUS_EVENTO | Data (AAAA-MM-DD) do dia a comparar com os dias úteis em comparacao.json (padrão 2026-10-25) |
Espaço em disco: cada coleta comprimida pesa cerca de 0,9 MB, ou perto de 650 MB por dia. O coletor para sozinho se restarem menos de 5 GB livres.
flowchart LR
A["API Olho Vivo (APILIB)"] -->|"a cada 2 min"| B[coletor.py]
B --> C[("raw/*.json.gz + manifest.jsonl")]
B --> D[("db.sqlite")]
G["GTFS da SPTrans"] --> H[gtfs_ref.py]
D --> E[agregar.py]
E --> F["site/data/*.json"]
H --> F
F --> I["painel estático (HTML e JS)"]
C --> V[verificar_manifesto.py]
Cada resposta bruta fica guardada sem alteração, e o manifest.jsonl encadeia os hashes: encadeado = sha256(encadeado anterior + sha256 da resposta). Alterar uma coleta antiga quebra a cadeia dali em diante, e o verificar_manifesto.py mostra onde. Os formatos estão em docs/DADOS.md.
Coisas que custaram horas e que quem for repetir a coleta deve saber:
POST /Login/Autenticar devolvia false), mesmo com o aplicativo "homologado". Não sabemos se é atraso de sincronização ou migração. O gateway APILIB funcionou./Posicao foi testado com sucesso com a nossa assinatura. /Linha/Buscar deu 403 e não investigamos o motivo./Posicao lista só veículos ligados a uma linha, com GPS ativo. Inclui ônibus parados em ponto final (cerca de 35% ficam parados entre duas coletas) e exclui os que estão na garagem. É uma foto simultânea, nunca o total que rodou no dia.c e cl não são a mesma coisa. c é o letreiro (igual ao route_id do GTFS) e cl é o código por sentido. Compare com o GTFS pelo c.frequencies.txt não distingue o dia, então sábado e domingo saem iguais ao dia útil. Use o GTFS só para saber quais linhas deveriam operar.EVENTOS e J (janela de votação) no início de site/app.js, e os textos do site/index.html.SE) e os raios estão em servidor/coletor.py; a URL do GTFS está em servidor/atualizar_gtfs.sh./Posicao. Os outros arquivos só dependem dos campos c, cl, vs[].p, ta, py e px.servidor/ coletor, agregação, GTFS, verificador e API simulada
site/ painel estático (HTML, CSS e JS puros) e modelo de pedido à SPTrans
tests/ testes (unittest, só biblioteca padrão)
docs/ formato dos dados e captura de tela
exemplos/ amostra fictícia da resposta de /Posicao
demo.sh demonstração local sem credenciais
deploy.sh publicação em um servidor via ssh (adapte ao seu ambiente)
site/pedido-sptrans.txt precisa de revisão antes de ser enviado.Veja CONTRIBUTING.md. Ideias úteis: mediana e percentil 90 dos intervalos entre ônibus, importar históricos obtidos por LAI, exportar agregados em CSV, testes para o JavaScript, adaptação a outras cidades e revisão de metodologia.
An independent audit of São Paulo's municipal bus circulation on election day (2026-10-25), built on the SPTrans Olho Vivo real-time GPS API and the official GTFS feed. A stdlib-only Python collector polls vehicle positions every 2 minutes, stores each raw response with a SHA-256 hash chain for tamper evidence, and a static dashboard compares the election day with weekdays and regular Sundays. Run ./demo.sh for a full local demo against a simulated API, no credentials needed. Notes for anyone using the real API: the legacy endpoint rejected portal keys for us, the APILIB gateway (WSO2, client-credentials Bearer token) worked, and /Posicao shows only vehicles linked to a line with an active GPS, including those parked at terminals. The dashboard text is in Brazilian Portuguese. MIT licensed.
MIT, veja LICENSE. Dados de posição e GTFS: SPTrans / Prefeitura de São Paulo. Medições de terceiros citadas: Cebrap, BusInfo e Instituto Pólis, conforme a imprensa. Projeto da Travahacker.