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.
翻譯準備中
尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證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.