Survival LLM
인터넷 없이도 동작하는 무료 AI 어시스턴트와 150만 건 오프라인 자료를 제공, 답변 출처 표시, Mac·Windows 지원
GPS(Olho Vivo, SPTrans)로 2차 투표일 버스와 노선 운행 횟수를 평일·일요일과 비교
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.
기타HTML · PythonGitHub @travahacker온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기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.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다.
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.