📖 Manual do Sistema PubMed
Documentação completa: pesquisa, alertas, monitor e manutenção
Índice
1. Visão geral ↑ topo
O módulo PubMed é um agregador pessoal de literatura científica que consulta a API pública do NCBI PubMed. Permite:
- Pesquisar artigos usando termos configuráveis (afiliações, autores, MeSH, etc.)
- Receber alertas automáticos quando surgem novos artigos correspondentes a esses termos
- Marcar artigos como favoritos, visitados, atribuir classificação por estrelas e adicionar notas
- Consultar estatísticas e os artigos melhor avaliados
analytics), reduzindo chamadas à API e permitindo acesso offline aos metadados já descarregados.
A arquitectura é simples: um script Python corre via cron e alimenta a base de dados; as páginas PHP consomem essa BD e chamam a API PubMed apenas quando necessário (ex: abstracts ainda não em cache).
2. Páginas do módulo ↑ topo
| URL | Ficheiro | Função | Acesso |
|---|---|---|---|
| /pubmed/ | index.php |
Pesquisa interactiva de artigos. Selecciona termos por chips, filtra por ano, ordena por data ou relevância, pagina resultados. | Público |
| /pubmed/alertas.php | alertas.php |
Lista os artigos novos detectados pelo monitor. Mostra ponto verde nos não lidos. Permite marcar todos como vistos. | Público |
| /pubmed/guardados.php | guardados.php |
Artigos marcados como favoritos, visitados ou avaliados. Filtrável por tag e texto. Vista pessoal de curadoria. | Público |
| /pubmed/stats.php | stats.php |
Estatísticas da BD local: artigos por termo, por ano, top journals, tipos de publicação, actividade dos alertas por semana, top avaliados. | Público |
| /pubmed/termos.php | termos.php |
Gerir os termos de pesquisa: criar, editar, activar/desactivar, eliminar, reordenar por drag-and-drop. | 🔒 Login |
| /pubmed/manual.php | manual.php |
Esta página. | Público |
3. Como usar a pesquisa ↑ topo
Chips de termos
No topo da página de pesquisa aparecem chips para cada termo activo. Por omissão todos estão seleccionados (fundo accent). Clica num chip para o desactivar — os artigos desse termo deixam de aparecer nos resultados.
Filtros de data
Os campos De e Até limitam os resultados por ano de publicação. O botão 📅 Último mês activa um filtro para artigos publicados nos últimos 30 dias (limpa os filtros de ano).
Ordenação
- Data ▼ — ordem cronológica inversa (mais recentes primeiro)
- Relevância — ordenação do PubMed por relevância para os termos da query
Campo de texto livre
Adiciona termos adicionais em linguagem natural ou com qualificadores PubMed ([Author], [MeSH Terms], etc.). É combinado com os chips seleccionados via AND. Premindo Enter pesquisa imediatamente.
Acções por artigo
- ❤️ Favorito — guarda nas listas pessoais (ver Guardados)
- 👁 Marcar visitado — o card fica com opacidade reduzida; activa-se automaticamente ao abrir o abstract
- ★★★★★ — classificação pessoal de 1 a 5 estrelas
- 📝 Notas — campo de texto livre, guardado ao sair do campo (blur)
- PubMed ↗ / DOI ↗ / PMC ↗ — links externos para o artigo original
Clicar no título do artigo abre o abstract (descarregado da API em tempo real, com cache automática) e marca-o como visitado.
Paginação
25 artigos por página. A navegação rola automaticamente para o topo da lista ao mudar de página.
4. Termos de pesquisa e sintaxe PubMed ↑ topo
Os termos são geridos em /pubmed/termos.php (requer login). Cada termo tem:
- Nome — etiqueta curta exibida nos chips e nos alertas (ex: FMUP)
- Query PubMed — expressão enviada directamente à API NCBI
- Descrição — texto explicativo opcional
- Activo/Inactivo — toggle; termos inactivos não aparecem nos chips nem são pesquisados pelo monitor
Termos activos de momento
| Nome | Query | Descrição |
|---|---|---|
| FMUP | "FMUP"[Affiliation] OR "Faculdade de Medicina da Universidade do Porto"[Affiliation] |
Faculdade de Medicina UP |
| CINTESIS | "CINTESIS"[Affiliation] |
Centro de Investigação em Tecnologias e Serviços de Saúde |
| Universidade do Porto | "Universidade do Porto"[Affiliation] |
|
| Rise Health | "Rise Health"[Affiliation] |
Rise Health |
Sintaxe das queries PubMed
O PubMed suporta qualificadores de campo entre parêntesis rectos. Exemplos úteis:
| Qualificador | Exemplo | Significado |
|---|---|---|
[Affiliation] | "FMUP"[Affiliation] | Afiliação dos autores contém "FMUP" |
[Author] | "Silva J"[Author] | Autor com esse nome |
[MeSH Terms] | cardiology[MeSH Terms] | Indexado com esse termo MeSH |
[Title/Abstract] | "machine learning"[Title/Abstract] | Palavra no título ou abstract |
[Journal] | "Lancet"[Journal] | Publicado nessa revista |
[Publication Type] | "Review"[Publication Type] | Tipo de publicação |
Operadores lógicos: AND, OR, NOT. Múltiplos termos num mesmo chip devem ser ligados com OR:
"CINTESIS"[Affiliation] OR "CINTESIS"[Author Affiliation]
"Universidade do Porto"[Affiliation] AND "cardiology"[MeSH Terms]
5. Alertas de novos artigos ↑ topo
Sempre que o monitor detecta um artigo que ainda não foi alertado, insere um registo em pubmed_alertas com visto=0. Esse registo aparece em /pubmed/alertas.php com um ponto verde.
Marcar como visto
- Clicar no título de um alerta marca-o automaticamente como visto (via JavaScript)
- O botão ✓ Marcar todos como vistos actualiza todos de uma vez
Badge na navbar
O número de alertas não vistos aparece como badge laranja no menu de navegação, ao lado de "Alertas". Actualiza a cada carregamento de página.
Limite de apresentação
A página mostra os 200 alertas mais recentes (o histórico completo fica na BD). Os artigos sem metadados na cache aparecem apenas com o PMID até que o monitor os processe.
6. Serviço de monitorização (monitor.py) ↑ topo
Localização e configuração
/home/pi/pubmed/monitor.py # script principal
/home/pi/pubmed/monitor.log # log de execuções
A configuração está no dicionário CONFIG no início do ficheiro:
| Parâmetro | Valor actual | Descrição |
|---|---|---|
pubmed.api_key | (vazio) | Chave NCBI opcional — sem chave: 3 req/s; com chave: 10 req/s |
pubmed.email | jagsilva+pubmed@gmail.com | Obrigatório pela política NCBI (identifica o utilizador) |
pubmed.retmax | 100 | Máximo de PMIDs por termo por execução |
pubmed.dias_atras | 7 | Janela de pesquisa: artigos publicados nos últimos N dias |
email.enabled | False | Envio de email ao encontrar novos artigos (ver secção 7) |
Agendamento (cron)
Corre 4 vezes por dia, de 6 em 6 horas, com output para o log:
0 0,6,12,18 * * * /usr/bin/python3 /home/pi/pubmed/monitor.py >> /home/pi/pubmed/monitor.log 2>&1
O que o monitor faz em cada execução
- Lê os termos activos da BD (
pubmed_termos WHERE ativo=1) - Para cada termo: chama
esearch.fcgicom a query + filtro de data (últimos 7 dias) → obtém lista de PMIDs - Descarta os PMIDs já presentes em
pubmed_alertas - Para os novos: chama
esummary.fcgiem lotes de 50 para obter metadados - Insere os artigos em
pubmed_artigose cria registo empubmed_alertascomvisto=0 - Associa o artigo ao termo em
pubmed_artigo_termos - Faz commit à BD e (se configurado) envia email
Correr manualmente
python3 /home/pi/pubmed/monitor.py
Ver o log em tempo real
tail -f /home/pi/pubmed/monitor.log
Exemplo de output normal:
2026-06-07 06:00:01 [INFO] === Monitor PubMed iniciado ===
2026-06-07 06:00:01 [INFO] A pesquisar: FMUP
2026-06-07 06:00:02 [INFO] → 16 PMIDs encontrados
2026-06-07 06:00:02 [INFO] → 2 novos (não alertados ainda)
2026-06-07 06:00:03 [INFO] A pesquisar: CINTESIS
2026-06-07 06:00:04 [INFO] → 10 PMIDs encontrados
2026-06-07 06:00:04 [INFO] → 0 novos (não alertados ainda)
2026-06-07 06:00:07 [INFO] Total de novos artigos: 4
2026-06-07 06:00:07 [INFO] === Monitor concluído ===
Obter uma API Key NCBI (opcional)
Sem chave o monitor respeita o limite de 3 req/s (pause de 350 ms entre pedidos). Com chave sobe para 10 req/s. Para activar:
- Regista conta em ncbi.nlm.nih.gov/account
- Vai a Settings → API Key Management e gera uma chave
- Em
/home/pi/pubmed/monitor.py, edita:"api_key": "TUA_CHAVE_AQUI"
7. Notificações por email ↑ topo
O monitor pode enviar um email sempre que encontra artigos novos. Por omissão está desactivado. Para activar, edita /home/pi/pubmed/monitor.py:
"email": {
"enabled": True, # activar
"smtp_host": "smtp.gmail.com",
"smtp_port": 587,
"user": "tua_conta@gmail.com", # conta de envio
"password": "password_app_gmail", # password de app (não a da conta)
"para": "jagsilva+pubmed@gmail.com",
},
O email lista até 20 artigos com título truncado e link directo para o PubMed.
8. Estrutura da base de dados ↑ topo
Todas as tabelas estão na base de dados analytics e são criadas automaticamente na primeira execução de db.php.
pubmed_termos
| Coluna | Tipo | Descrição |
|---|---|---|
id | INT PK | Identificador |
nome | VARCHAR(200) | Nome curto exibido nos chips |
query | VARCHAR(1000) | Expressão PubMed enviada à API |
descricao | VARCHAR(500) | Texto explicativo opcional |
ativo | TINYINT(1) | 1 = activo; 0 = ignorado pelo monitor |
ordem | SMALLINT | Posição nos chips (drag-and-drop) |
pubmed_artigos
Cache local dos metadados vindos da API NCBI esummary.fcgi.
| Coluna | Tipo | Descrição |
|---|---|---|
pmid | INT PK | Identificador PubMed único |
titulo | TEXT | Título completo |
autores | TEXT (JSON) | Array JSON de nomes de autores |
journal | VARCHAR(500) | Nome completo da revista |
journal_abrev | VARCHAR(200) | Abreviatura da revista (NLM) |
volume / numero / paginas | VARCHAR | Localização bibliográfica |
doi | VARCHAR(300) | Digital Object Identifier |
data_pub / ano | DATE / SMALLINT | Data e ano de publicação |
abstract | MEDIUMTEXT | Texto do abstract (preenchido via efetch.fcgi) |
keywords | TEXT | Palavras-chave do autor |
tipos_pub | TEXT (JSON) | Array JSON de tipos (Journal Article, Review, etc.) |
pmc_id | VARCHAR(50) | ID PubMed Central (acesso ao texto integral) |
cached_at / updated_at | TIMESTAMP | Controlo de cache |
pubmed_interacoes
Dados pessoais por artigo — um registo por PMID.
| Coluna | Descrição |
|---|---|
pmid | PK, referência ao artigo |
favorito | 1 = marcado como favorito |
visitado | 1 = abstract aberto pelo menos uma vez |
visitado_em | Data/hora da primeira visita |
rating | Classificação de 0 a 5 estrelas |
notas | Texto livre pessoal |
tags | JSON array de tags (ex: ["revisão","metodologia"]) |
pubmed_alertas
| Coluna | Descrição |
|---|---|
id | PK auto-increment |
pmid | PMID do artigo (UNIQUE — cada artigo alerta uma vez) |
termo_id | Termo que gerou o alerta |
visto | 0 = novo (ponto verde); 1 = já visto |
created_at | Data em que o monitor detectou o artigo |
pubmed_artigo_termos
Tabela de ligação many-to-many entre artigos e termos (para os badges coloridos nos cards).
Consultas úteis
# Alertas por ver
mysql -u jagsilva -praspberry analytics \
-e "SELECT COUNT(*) FROM pubmed_alertas WHERE visto=0;"
# Artigos em cache
mysql -u jagsilva -praspberry analytics \
-e "SELECT COUNT(*) FROM pubmed_artigos;"
# Últimos alertas detectados
mysql -u jagsilva -praspberry analytics \
-e "SELECT pmid, termo_id, created_at FROM pubmed_alertas ORDER BY created_at DESC LIMIT 10;"
9. API REST (endpoints) ↑ topo
Todos os endpoints estão em /pubmed/api/ e devolvem JSON.
| Endpoint | Método | Auth | Descrição |
|---|---|---|---|
/pubmed/api/termos.php |
GET | — | Lista todos os termos activos |
/pubmed/api/termos.php |
POST | 🔒 | Cria novo termo. Body JSON: {nome, query, descricao} |
/pubmed/api/termos.php?id=N |
PUT | 🔒 | Actualiza termo. Body JSON com campos a alterar |
/pubmed/api/termos.php?id=N |
DELETE | 🔒 | Elimina termo |
/pubmed/api/pesquisa.php |
GET | — | Pesquisa no PubMed. Parâmetros: termos (IDs separados por vírgula), q (texto livre), pagina, por_pag, sort (pub_date|relevance), ano_de, ano_ate, reldate (dias) |
/pubmed/api/abstract.php?pmid=N |
GET | — | Devolve abstract (da cache BD ou busca na API NCBI) |
/pubmed/api/interacao.php |
POST | 🔒 | Grava interacção pessoal. Body JSON: {pmid, favorito?, visitado?, rating?, notas?, tags?} |
/pubmed/api/alerta.php |
POST | 🔒 | Marca alerta como visto. Body JSON: {id} |
HTTP 401 com {"error":"Não autenticado"} se não houver sessão activa.
10. Manutenção e diagnóstico ↑ topo
Verificar se o cron está configurado
crontab -l | grep pubmed
Deve aparecer: 0 0,6,12,18 * * * /usr/bin/python3 /home/pi/pubmed/monitor.py ...
Verificar a última execução
tail -20 /home/pi/pubmed/monitor.log
Correr o monitor manualmente e ver output
python3 /home/pi/pubmed/monitor.py
O monitor não encontra artigos novos
- Normal se a janela de 7 dias não tiver artigos novos para esses termos
- Verifica se os termos estão activos em /pubmed/termos.php
- Testa a query directamente no PubMed para confirmar que devolve resultados
- Aumenta
dias_atrastemporariamente para verificar se a query funciona
Erro de ligação à API NCBI
O log mostrará [ERROR] Erro NCBI esearch.fcgi: .... Causas comuns:
- Sem ligação à internet no Raspberry Pi
- Rate limit excedido (aguarda alguns minutos e tenta de novo)
- API Key inválida (experimenta sem chave, deixando
api_key: "")
Limpar alertas antigos
# Apagar alertas com mais de 6 meses já marcados como vistos
mysql -u jagsilva -praspberry analytics \
-e "DELETE FROM pubmed_alertas WHERE visto=1 AND created_at < DATE_SUB(NOW(), INTERVAL 6 MONTH);"
Ficheiros relevantes
| Caminho | Função |
|---|---|
/home/pi/pubmed/monitor.py | Script Python de monitorização |
/home/pi/pubmed/monitor.log | Log de todas as execuções |
/var/www/html/pubmed/db.php | Ligação à BD e criação das tabelas |
/var/www/html/pubmed/api/pesquisa.php | Proxy para a API PubMed (pesquisa) |
/var/www/html/pubmed/api/abstract.php | Proxy para abstracts + cache BD |