Autor: Jardel Godinho
-
Proof of Participation
Proof of Participation – Sistema Tokenizado em Blockchain para Prova de Presença
O Problema com os Sistemas de Comprovação de Presença Atuais
Os métodos tradicionais de comprovação de presença são amplamente vulneráveis a fraudes e ineficiências. Muitas vezes, participantes conseguem validar sua presença mesmo sem estar fisicamente no local, utilizando sistemas suscetíveis a falhas humanas ou técnicas, como listas manuais, aplicativos pouco seguros ou cartões de ponto. Isso não apenas compromete a credibilidade do evento ou treinamento, mas também prejudica a rastreabilidade e a transparência para organizadores e participantes.
Em um contexto onde confiança, segurança e automação são imprescindíveis, um sistema inovador de prova de presença presencial baseado em blockchain se torna não apenas uma solução, mas um padrão a ser seguido.
A Solução: Proof of Participation
O Proof of Participation é uma plataforma tokenizada que registra presenças em eventos, cursos, treinamentos, hackathons, inspeções, trabalho e outras atividades presenciais de forma automatizada e imutável. Utilizando blockchain como base para autenticação, o sistema garante que a presença registrada não pode ser alterada ou falsificada.
Simplicidade de Uso: A Jornada do Usuário
- Ao chegar no evento, o participante escaneia um QR Code exibido no local.
- O sistema solicita apenas o endereço de e-mail e, de forma automática, registra dados como geolocalização, horário e IP.
- O usuário recebe um e-mail com um link único para finalizar seu cadastro e pode inserir informações adicionais, como nome completo.
- Durante o evento, outros QR Codes permitem registrar a participação em atividades específicas.
- Ao término do evento os certificados são gerados e enviados automaticamente por e-mail aos participantes.
- Os certificados podem ser verificados publicamente por qualquer pessoa, utilizando a blockchain como prova de autenticidade.
Sem necessidade de apps, senhas ou processos complexos. Um celular com acesso à internet é suficiente para participar e gerenciar os dados.
Por que o Sistema é Revolucionário?
- Segurança: Certificados registrados em blockchain são imutáveis e auditáveis.
- Simplicidade: Interface amigável sem a necessidade de aplicativos ou senhas.
- Automação: Geração automática de certificados com validação de autenticidade integrada.
- Rastreabilidade: Cada registro de presença é documentado com geolocalização, horário e IP.
Tecnologias e Ferramentas Utilizadas
- AWS CloudFront: Distribuição de conteúdo com alta disponibilidade e baixo custo.
- Amazon S3: Armazenamento de arquivos, incluindo a imagem dos certificados e metadados JSON.
- Amazon DynamoDB: Banco de dados NoSQL para armazenar chaves públicas, metadados e registros do usuário.
- API Gateway: Gerenciamento seguro das APIs que conectam o frontend ao backend.
- AWS Lambda: Execução de rotinas serverless para manipulação de dados, interação com blockchain e geração de certificados.
- Pillow (Python): Biblioteca gráfica para criação de certificados personalizados a partir de camadas gráficas.
- React: Frontend responsivo e intuitivo para interações do usuário.
- Blockchain: Registro imutável de certificados, garantindo autenticidade e rastreabilidade.
Por que este Sistema Deve Ser um Padrão?
O Proof of Participation redefine como a presença é registrada e validada, eliminando vulnerabilidades dos sistemas tradicionais. Ao adotar esta tecnologia:
- Organizadores ganham credibilidade e automação.
- Participantes têm acesso rápido e seguro aos seus certificados.
- Empresas e instituições reduzem custos operacionais e fraudes.
Criado pela Comunidade Python Floripa, este projeto representa uma abordagem colaborativa, inovadora e de impacto social, alinhada com os princípios de código aberto. Ele está aberto a voluntários interessados em contribuir para o avanço da tecnologia blockchain e a melhoria contínua da plataforma.
Evolução do Projeto
Primeiro Meeting – 06/11/24
Segundo Meeting – 13/11/24
Terceiro Meeting – 20/11/24
Release da Reunião – Proof of Participation
Data: 20/11/2024
Duração: 98 minutos
Participantes: Jardel Godinho, Lucas Oliveira, Luiz Bruno Vianna, Ricardo MayDefinições
1. Estratégia para Contribuições Comunitárias:
- Publicação das tarefas no GitHub com prazos definidos (deadlines).
- Após o prazo, caso não haja contribuições, a equipe interna assume a execução da tarefa.
- Incentivar a comunidade por meio de divulgação ativa, destacando os benefícios de participar.
2. Arquitetura e Uso de Tecnologias:
- Continuidade com o uso do Amazon S3 como principal solução de armazenamento.
- Consideração de uso complementar do IPFS (InterPlanetary File System) para distribuição descentralizada de arquivos.
- Implementação inicial de serviços serverless com AWS Lambda e API Gateway.
3. Certificados:
- Utilização da biblioteca Pillow (Python) para manipulação de camadas gráficas e geração de certificados em formato otimizado para divulgação (PNG/JPEG).
- Certificados serão públicos, com dados sensíveis mascarados, mas autenticação e validação garantidas pela blockchain.
4. Divulgação e Identidade Visual:
- Os certificados terão elementos visuais padronizados que remetam à identidade da Python Floripa, garantindo autenticidade e divulgação da marca.
- As empresas ou eventos parceiros poderão personalizar elementos gráficos (e.g., logo, selos), respeitando os padrões estabelecidos.
5. Princípios de Segurança e Confiança:
- Blockchain como base para garantir autenticidade imutável dos certificados.
- Redundância no armazenamento para mitigar riscos de perda de dados.
Próximos Passos
1. Tarefas de Prioridade:
- Configuração inicial de GitHub para organização das tarefas e controle de versões.
- Implementação do fluxo de autenticação (código 2FA enviado por e-mail).
- Desenvolvimento do serviço para validação de tokens enviados ao usuário.
2. Estruturação do MVP:
- Implementação do processo de check-in e registro de presença.
- Geração de certificados em lotes ao término do evento.
- Armazenamento de certificados prontos no S3 para otimização de consultas futuras.
3. Divulgação e Envolvimento Comunitário:
- Preparação de postagens para redes sociais (Instagram, LinkedIn) incentivando a contribuição ao projeto.
- Realização de um release para atrair mais desenvolvedores, detalhando as tarefas disponíveis e os próximos marcos.
Compromissos Assumidos
Jardel Godinho:
- Coordenar a publicação de tarefas no GitHub e definir deadlines.
- Preparar materiais para divulgação nas redes sociais.
- Prototipar templates de certificados com elementos visuais definidos.
Lucas Oliveira:
- Desenhar fluxo detalhado de comunicação do backend com blockchain.
- Validar tokens recebidos no backend e garantir a segurança do fluxo.
- Garantir a conformidade com os princípios de blockchain e segurança.
Luiz Bruno Vianna:
- Testar e avaliar o uso do IPFS para armazenamento complementar e propor cenários de uso.
- Desenvolver métodos, modelos e definir cadencia de comunicação por e-mail com o usuário, dispensando uso de senhas.
- Prototipar e apresentar soluções para montagem dinâmica de certificados.
Ricardo May:
- Estruturar o esquema inicial do banco de dados no DynamoDB.
- Avaliar estratégias para redundância no armazenamento de arquivos.
- Propor melhorias para integração entre backend e blockchain.
- Desenvolver estratégias de otimização dos serviços AWS.
A reunião reforçou o comprometimento da equipe com prazos e a importância de envolver a comunidade no projeto. Com um MVP bem definido, a Python Floripa visa tornar este sistema um padrão em eventos presenciais, garantindo segurança, eficiência e simplicidade.
Quarto Meeting – 27/11/24
Release da Reunião – 27/11/2024
Data: 27/11/2024
Duração: 93 minutos
Participantes: Jardel Godinho, Jonathan Batista, Luiz Bruno Vianna, Maxson Almeida, Otavio Augusto, Ricardo May
A reunião teve como objetivo discutir o desenvolvimento de um sistema para geração e validação de certificados digitais durante eventos, com foco em usabilidade, eficiência e integração com tecnologias modernas, como blockchain. Durante o encontro, foram apresentadas as soluções já implementadas, testados fluxos e definidos próximos passos para evolução do projeto.Definições
1. Estrutura do Sistema:
O sistema será composto por três níveis de usuários:
- Participante: Responsável por acessar e atualizar seus próprios dados.
- Colaborador do Evento: Com capacidade de visualizar e corrigir informações de participantes no contexto do evento.
- Administrador do Evento: Pode cadastrar eventos, gerenciar participantes e colaboradores, além de finalizar eventos para a geração de certificados.
•Os certificados incluirão selos de atividades realizadas pelos participantes, destacando sua participação nas palestras e trilhas do evento.
2. Login por Magic Link:
Foi validado o fluxo de autenticação sem senha via magic link, enviado para o e-mail do usuário. O processo foi bem recebido e será mantido como padrão.
3. Geração de Certificados:
Cada certificado conterá:
- Nome completo do participante.
- Códigos de validação únicos em formato hexadecimal.
- Selos das atividades realizadas.
- Os certificados serão gerados e enviados de forma cadenciada, para otimizar recursos e evitar bloqueios por servidores de e-mail.
4. Registro de Localização e Horário:
Durante o check-in nas atividades, será registrado o horário e a localização do usuário, proporcionando maior confiabilidade aos certificados.
5. Uso de Blockchain:
Por enquanto, um simulador de blockchain será utilizado para armazenar os dados. Futuramente, a solução será migrada para redes reais, como a Stellar, devido à sua eficiência energética e econômica.
Próximos Passos
1. Teste no Evento de 30/11/2024:
O sistema será testado no 81º Encontro Python Floripa, enviando certificados ao término do evento e observando a reação dos participantes.
Verificar adesão e engajamento dos usuários com os certificados, especialmente publicações em redes sociais como LinkedIn.
2. Evolução do Sistema:
Implementar interface administrativa para geração e gerenciamento de QR Codes associados às atividades do evento.
Explorar o registro de check-out dos participantes para futuros eventos que demandem controle de tempo de permanência.
3. Aprimoramento da Infraestrutura:
Estudar soluções para reduzir o impacto no envio de e-mails em massa, incluindo escalonamento por filas e melhorias na credibilidade do domínio.
Avaliar ferramentas mais performáticas para manipulação de imagens e geração de certificados.
4. Benchmarking Energético:
Avaliar o consumo energético do sistema atual e realizar comparações entre Stellar, Ethereum e Bitcoin para fundamentar decisões futuras.
A reunião consolidou pontos críticos do projeto e definiu um caminho claro para os próximos testes e melhorias. O sistema será validado em um ambiente real no evento de 30/11/2024, proporcionando insights valiosos para ajustes futuros.Release da Reunião – 11/12/2024
Data: 11/12/2024
Duração: 81 minutos
Participantes: Jardel Godinho, Jonathan Batista, Luiz Bruno Vianna, Ricardo MayA reunião teve como objetivo discutir o desenvolvimento do sistema de emissão e validação de certificados com integração a blockchain, explorando pontos técnicos, desafios de implementação e privacidade, além de definir os próximos passos e responsabilidades para os membros da equipe.
Definições
1. Estrutura do Certificado:
- O certificado será representado por um hash único gerado a partir da imagem ou dos dados.
- Incluirá informações básicas como nome do evento, data, hora e localização (latitude/longitude).
- Um hash será registrado na blockchain para validação posterior, preservando a privacidade do usuário.
- O hash será enviado ao usuário, garantindo validação do certificado na primeira versão.
- Avanços de versão devem prever o envio da chave publica e privada permitindo a portabilidade e validação independente.
2. Privacidade e LGPD:
Nenhum dado pessoal, como nome ou e-mail, será armazenado diretamente na blockchain. Hashs derivados desses dados serão utilizados para preservar a privacidade.
3. Intermediação da Plataforma:
A plataforma será a intermediária no registro e validação dos certificados, mas a estrutura será preparada para futura descentralização, permitindo independência do sistema.
4. Interfaces do Usuário:
Painel Administrador do Evento
- Registrar / Editar Evento: Data, Horário, Local, Atividades, Background Certificado, Logo, Selos (referente as atividades), Definir dados do form pós-checkin, Incluir Staff, Checkout (S/N).
- Gera URLs / QR-CODEs de checkin, atividades e checkout.
- Gerar Certificados (validar se os dados necessários existem e submeter apenas os com dados completos) e Lista de presença.
Painel Participante do Evento
- Enriquecer / Editar dados pessoais, ver os proprios certificados, definir se deseja dar acesso publico ao certificado ou não.
Página do usuario
- Exibe certificados públicos do usuário.
Pagina de validação do certificado
- Permite que qualquer pessoa valide um certificado a partir do seu código.
5. Blockchain e Registro:
Serão realizados testes com uma rede blockchain de teste (Stellar). O hash será gerado com base na imagem ou dados do certificado e registrado para validação futura.
Próximos Passos
1. Interface do Usuário:
Jonathan Batista desenvolverá as telas principais em React, incluindo cadastro de eventos, check-in/check-out e validação de certificados.
2. Fluxo de Validação:
Luiz Bruno Vianna criará um fluxograma detalhado do processo de validação e registro, destacando o uso de blockchain e hash. Também iniciará os testes de integração com a Stellar.
3. Geração de Certificados:
Jardel Godinho coordenará ajustes na geração de certificados com Maxson, com propósito de aperfeiçoar o processo que já funcionou bem nos testes preliminares realizados durante o ultimo Python Floripa.
4. Segurança e Testes:
Ricardo May se ocupará de integrar com o Jonathan o serviço de Magic Link e disparos automatizados de e-mails com a submição dos forms de checkin e confirmações de atualização de dados.
A próxima reunião será em 18/12/2024, com o objetivo de revisar as entregas de cada membro e será avaliado o início de testes de integração entre as funcionalidades desenvolvidas.Release da Reunião – 18/12/2024
Data: 18/12/2024
Duração: 91 minutos
Participantes: Jardel Godinho, Jonathan Batista, Luiz Bruno Vianna, Ricardo MayA reunião focou em detalhar os fluxos de geração e validação de certificados digitais integrados a blockchain, bem como as definições de arquitetura e próximos passos para o desenvolvimento do projeto.
Definições
1. Arquitetura do Sistema:
- O sistema usará AWS DynamoDB para armazenamento de dados com partições específicas para eventos, organizações e usuários.
- Haverá quatro perfis de usuário: participante, staff do evento, administrador do evento e super administrador.
- As operações do sistema serão distribuídas via AWS Lambda, garantindo escalabilidade e manuseio de falhas com SQS (fila).
- Os certificados serão gerados como imagens, armazenados no S3, apartir das quais serão geradas hash’s para serem vinculadas à blockchain para validação pública.
2. Fluxo de Participantes:
- Participantes realizarão check-in via QR Code ou URL, validando identidade por Magic Link enviado por e-mail.
- Serão gerados certificados automaticamente para todos os inscritos no evento.
- O acesso aos certificados será feito por um painel com login protegido, exibindo uma lista de eventos e certificados.
3. Geração de Certificados:
- Certificados serão processados em lotes utilizando SQS e AWS Lambda para evitar sobrecarga e custos elevados.
- Será usado um sistema de controle de concorrência para evitar duplicidades ou falhas.
- Hashes dos certificados serão gerados e registrados na blockchain para garantir autenticidade.
4. Painel Administrativo:
- Administração incluirá criação de eventos, cadastro de atividades e geração de certificados com relatórios de participantes.
- Painel exibirá estatísticas de eventos e permitirá gerenciar a emissão e envio de certificados.
- Funcionalidade de envio automático de e-mails com certificados para participantes ao término do evento.
5. Validação de Certificados:
- Certificados poderão ser validados publicamente por um código único associado a cada hash na blockchain.
- A interface de validação será acessível a todos e integrada ao sistema de armazenamento.
Próximos Passos
1. Fluxo de Participantes:
- Jonathan Batista desenvolverá telas e fluxos para participantes, staff, administradores de evento e painel de certificados.
2. Integração com Blockchain:
- Luiz Bruno Vianna realizará testes com o registro de hashes na blockchain e ajustes na integração com Stellar.
3. Geração de Certificados:
- Jardel Godinho definirá os ajustes finais para geração de certificados em lotes e validação do fluxo de emissão.
4. Testes e Segurança:
- Ricardo May implementará validações adicionais para garantir consistência e segurança nos fluxos de autenticação e geração de certificados.
A próxima reunião será em 08/01/2025 para revisão de tarefas, validação de implementações e preparação para testes iniciais do sistema.
Release da Reunião – 29/01/2025
Data: 29/01/2025
Duração: 65 minutos
Participantes: Daniel Soares Martins, Jardel Godinho, Jonathan Batista, Luiz Bruno Vianna, Ricardo May
A reunião teve como objetivo discutir a implementação dos fluxos de autenticação e geração de certificados digitais, além das integrações necessárias com serviços AWS e blockchain.
Definições
1. Arquitetura do Sistema:
• A estrutura será baseada em serviços AWS (S3, API Gateway, Lambda, Cognito e DynamoDB).
• O armazenamento das informações será feito em buckets S3 e na base de dados DynamoDB.
• Front-end utilizará React, distribuído por meio do CloudFront, com comunicação via API Gateway.
• AWS Lambda será utilizada para processamento de funções específicas, incluindo autenticação e geração de certificados.
• O registro dos certificados será feito em lote na blockchain Stellar.
2. Fluxo de Participantes:
• O check-in será feito por QR Code ou URL, validando o e-mail do participante com Magic Link.
• Os dados geográficos (latitude e longitude) serão coletados automaticamente no check-in.
• Em caso de falha na verificação de localização, o sistema registrará a tentativa no banco de dados, mas sem bloquear o processo.
3. Geração e Validação de Certificados:
• Os certificados serão gerados em lotes após o término dos eventos, com uma hash registrada na blockchain.
• O certificado incluirá dados como nome, evento, data, local e hash para validação futura.
• A validação dos certificados será feita via QR Code, com verificação cruzada entre as informações armazenadas na blockchain e no banco de dados.
4. Painel Administrativo:
• O painel permitirá o gerenciamento de eventos, configuração de atividades e emissão de certificados.
• Haverá opções para ativar ou desativar requisitos como validação de localização.
• Relatórios de participação e logs de validação estarão disponíveis no painel.
Próximos Passos
1. Integração e Implementação:
• Jonathan Batista: Desenvolverá as telas do front-end, com foco no login e fluxo de check-in.
• Luiz Bruno Vianna: Irá desenvolver o Smart Contract para registro das hashes na blockchain.
• Daniel Soares Martins: Assumirá a documentação dos micro serviços (APIs, endpoints e respostas) usando OpenAPI.
• Ricardo May: Criará a estrutura para funções Lambda, aprimorando as integrações com API Gateway e Cognito.
Considerações Gerais:
• O projeto terá etapas iterativas, com validações constantes para ajuste da arquitetura.
• A documentação do sistema será essencial para garantir consistência no desenvolvimento.
• A equipe buscará expandir a aplicação do sistema para outros cenários além de eventos, como validações presenciais em locais remotos.
Encerramento:
A reunião foi concluída às 16h01min, com a definição das tarefas imediatas e próximos pontos de validação.
-
Python Floripa no Hackathon Summit Saúde 2024 – Lista dos Participantes
É com grande orgulho que anunciamos a lista de membros da nossa comunidade que estarão participando do maior hackathon de saúde de Santa Catarina, o Hackathon Summit Saúde 2024!
Nosso grupo de desenvolvedores está pronto para enfrentar desafios, colaborar com especialistas do setor e criar soluções inovadoras que podem transformar a saúde e salvar vidas.
Veja os membros da Python Floripa que participaram desta edição
Jardel Godinho
End-to-End Developer
Rodolfo Barbosa
Data Engineer
Sofia Godinho
Web Developer
Otávio Augusto
Backend Developer
Felipe Angeli
Software Engineer
Daniel Martins
Senior Python Developer
Bento Luiz
Fullstack Developer
Enrico Tomaselli
Fullstack Developer
Bruno Vianna
Systems Analyst
Léo Moraes
Software Engineer
Felipe Escobar
Data Scientist
Iuli Hardt
Data Scientist
Jonathan Batista
Software Engineer
Queremos convidar toda a comunidade Python Floripa a acompanhar este evento e torcer pelo sucesso dos nossos representantes! Sua participação e apoio são fundamentais para motivar e inspirar nossos membros durante essa jornada.
Fique ligado em nossas redes e acompanhe as histórias, conquistas e aprendizados dessa experiência incrível!
Vamos mostrar toda a força e união da Python Floripa e torcer para que nossos membros brilhem no evento!
Alguns Insights
Como usamos LLM para extrair dados estruturados de um relato de atendimento médico
Formulário Base
<!-- Forms --> <div class="container"> <!-- Top Bar with Icons (Tabs) --> <div class="top-bar"> <!-- Tab for 'Relato' --> <div class="section-icon active" data-section="relato"> <!-- Icon for 'Relato' --> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <path d="M256 32c14.2 0 27.3 7.5 34.5 19.8l216 368c7.3 12.4 7.3 27.7 .2 40.1S486.3 480 472 480L40 480c-14.3 0-27.6-7.7-34.7-20.1s-7-27.8 .2-40.1l216-368C228.7 39.5 241.8 32 256 32zm0 128c-13.3 0-24 10.7-24 24l0 112c0 13.3 10.7 24 24 24s24-10.7 24-24l0-112c0-13.3-10.7-24-24-24zm32 224a32 32 0 1 0 -64 0 32 32 0 1 0 64 0z" fill="currentColor"/> </svg> <span>Relato</span> </div> <!-- Tab for 'Dados' --> <div class="section-icon" data-section="dados"> <!-- Icon for 'Dados' --> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512"> <path d="M192 96a48 48 0 1 0 0-96 48 48 0 1 0 0 96zm-8 384l0-128 16 0 0 128c0 17.7 14.3 32 32 32s32-14.3 32-32l0-288 56 0 64 0 16 0c17.7 0 32-14.3 32-32s-14.3-32-32-32l-16 0 0-64 192 0 0 192-192 0 0-32-64 0 0 48c0 26.5 21.5 48 48 48l224 0c26.5 0 48-21.5 48-48l0-224c0-26.5-21.5-48-48-48L368 0c-26.5 0-48 21.5-48 48l0 80-76.9 0-65.9 0c-33.7 0-64.9 17.7-82.3 46.6l-58.3 97c-9.1 15.1-4.2 34.8 10.9 43.9s34.8 4.2 43.9-10.9L120 256.9 120 480c0 17.7 14.3 32 32 32s32-14.3 32-32z" fill="currentColor"/> </svg> <span>Dados</span> </div> </div> <!-- Forms --> <!-- Relato Form --> <form id="relatoForm" data-section="relato" class="dynamicForm active" method="post"> <section id="relato-section"> <label class="form-label">Relato do Atendimento</label> <textarea name="relato_text" class="form-textarea relato-comments"></textarea> <button type="button" id="saveRelatoBtn">Salvar</button> </section> </form> <!-- Dados Form --> <form id="dadosForm" data-section="dados" class="dynamicForm" method="post" style="display: none;"> <section id="dados-section"> <!-- Dados Pessoais --> <h3>Dados Pessoais</h3> <div class="personal-data-section"> <div class="column"> <label>Nome do Paciente</label> <input type="text" name="nome_paciente" required> <label>Idade do Paciente</label> <input type="number" name="idade_paciente" required> </div> <div class="column"> <label>Data do Atendimento</label> <input type="date" name="data_atendimento" required> <label>Horário do Atendimento</label> <input type="time" name="horario_atendimento" required> </div> </div> <!-- Seção SOAP --> <h3>SOAP</h3> <div class="soap-section"> <div class="quadrant"> <h3>Subjetivo</h3> <label>Queixa Principal</label> <textarea name="queixa_principal" required></textarea> <label>Histórico Médico Relevante</label> <textarea name="historico_medico"></textarea> <label>Sintomas e Características</label> <textarea name="sintomas_caracteristicas"></textarea> <label>Histórico Familiar Relevante</label> <textarea name="historico_familiar"></textarea> <label>Estilo de Vida / Hábitos</label> <textarea name="estilo_vida"></textarea> </div> <div class="quadrant"> <h3>Objetivo</h3> <label>Pressão Arterial (PA)</label> <input type="text" name="pressao_arterial"> <label>Frequência Cardíaca (FC)</label> <input type="text" name="frequencia_cardiaca"> <label>Temperatura Corporal</label> <input type="text" name="temperatura_corporal"> <label>Saturação de Oxigênio</label> <input type="text" name="saturacao_oxigenio"> <label>Exame Físico e Observações Objetivas</label> <textarea name="exame_fisico"></textarea> <label>Resultados de Exames</label> <textarea name="resultados_exames"></textarea> </div> <div class="quadrant"> <h3>Avaliação</h3> <label>Diagnóstico Principal</label> <textarea name="diagnostico_principal"></textarea> <label>Diagnósticos Diferenciais</label> <textarea name="diagnosticos_diferenciais"></textarea> <label>Problemas Ativos Relacionados</label> <textarea name="problemas_ativos"></textarea> </div> <div class="quadrant"> <h3>Plano</h3> <label>Tratamento Prescrito / Medicações</label> <textarea name="tratamento_prescrito"></textarea> <label>Acompanhamento e Retorno</label> <textarea name="acompanhamento_retorno"></textarea> <label>Exames Solicitados</label> <textarea name="exames_solicitados"></textarea> <label>Encaminhamentos</label> <textarea name="encaminhamentos"></textarea> <label>Instruções e Orientações para o Paciente</label> <textarea name="instrucoes_orientacoes"></textarea> </div> </div> <!-- Botão Salvar --> <button type="button" id="saveDadosBtn">Salvar</button> </section> </form> <!-- Search Bar --> <div class="search-area"> <div class="search-container"> <div class="search-bar"> <textarea rows="1" placeholder="Faça o relato do atendimento" id="searchText"></textarea> <div class="icons" id="searchIcons"> <!--<button class="icon-button" id="attachBtn"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"> <path d="M364.2 83.8c-24.4-24.4-64-24.4-88.4 0l-184 184c-42.1 42.1-42.1 110.3 0 152.4s110.3 42.1 152.4 0l152-152c10.9-10.9 28.7-10.9 39.6 0s10.9 28.7 0 39.6l-152 152c-64 64-167.6 64-231.6 0s-64-167.6 0-231.6l184-184c46.3-46.3 121.3-46.3 167.6 0s46.3 121.3 0 167.6l-176 176c-28.6 28.6-75 28.6-103.6 0s-28.6-75 0-103.6l144-144c10.9-10.9 28.7-10.9 39.6 0s10.9 28.7 0 39.6l-144 144c-6.7 6.7-6.7 17.7 0 24.4s17.7 6.7 24.4 0l176-176c24.4-24.4 24.4-64 0-88.4z" fill="currentColor"></path> </svg> </button>--> <button class="icon-button" id="microphoneBtn"> <!-- Microphone icon SVG --> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 384 512"> <path d="M96 96v160c0 53 43 96 96 96s96-43 96-96V96c0-53-43-96-96-96S96 43 96 96zm224 144v16c0 70.7-57.3 128-128 128S64 326.7 64 256v-40c0-13.3-10.7-24-24-24S16 202.7 16 216v40c0 89.1 66.2 162.7 152 174.4V464h-48c-13.3 0-24 10.7-24 24s10.7 24 24 24h192c13.3 0 24-10.7 24-24s-10.7-24-24-24h-48v-33.6c85.8-11.7 152-85.3 152-174.4v-40c0-13.3-10.7-24-24-24s-24 10.7-24 24v24z" fill="currentColor"></path> </svg> </button> </div> </div> <div class="send-button-container"> <button class="send-button" id="sendBtn"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"> <path d="M16.1 260.2c-22.6 12.9-20.5 47.3 3.6 57.3L160 376l0 103.3c0 18.1 14.6 32.7 32.7 32.7c9.7 0 18.9-4.3 25.1-11.8l62-74.3 123.9 51.6c18.9 7.9 40.8-4.5 43.9-24.7l64-416c1.9-12.1-3.4-24.3-13.5-31.2s-23.3-7.5-34-1.4l-448 256zm52.1 25.5L409.7 90.6 190.1 336l1.2 1L68.2 285.7zM403.3 425.4L236.7 355.9 450.8 116.6 403.3 425.4z" fill="currentColor"/> </svg> </button> </div> </div> </div> <!-- Indicador de Carregamento --> <div id="loadingIndicator" class="loading-indicator" aria-live="assertive" aria-busy="true"> <div class="spinner"></div> <p>Processando, por favor aguarde...</p> </div> </div>Fluxo em JS para enviar dados para o backend
/* ====== Evento para o Botão Salvar no Relato ====== */ document.getElementById('saveRelatoBtn').addEventListener('click', function() { const relatoText = document.querySelector('textarea[name="relato_text"]').value.trim(); if (relatoText === '') { alert('Por favor, insira o relato do atendimento.'); return; } // Exibir o indicador de carregamento document.getElementById('loadingIndicator').classList.add('active'); // Desabilitar o formulário de dados enquanto aguarda document.getElementById('dadosForm').classList.add('disabled'); // Enviar o texto via AJAX fetch(medicoAjax.ajaxurl, { method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, body: new URLSearchParams({ action: 'processar_relato_medico', relato_text: relatoText, nonce: medicoAjax.nonce }) }) .then(response => response.json()) .then(data => { // Ocultar o indicador de carregamento document.getElementById('loadingIndicator').classList.remove('active'); if (data.success) { // Preencher o formulário com os dados recebidos preencherFormularioDados(data.data.dados); // Navegar para a próxima seção setActiveSection('dados'); } else { alert('Erro ao processar o relato: ' + data.data.message); } }) .catch(error => { console.error('Erro:', error); alert('Erro na solicitação. Verifique a conexão ou tente novamente.'); // Ocultar o indicador de carregamento document.getElementById('loadingIndicator').classList.remove('active'); }); });Handler AJAX – recebe do frontend e prepara prompt
<?php /* ====== Handler para o AJAX do Relato Médico ====== */ function processar_relato_medico() { // Verificar o nonce de segurança check_ajax_referer('medico_nonce', 'nonce'); // Obter o texto do relato $relato_text = isset($_POST['relato_text']) ? sanitize_text_field($_POST['relato_text']) : ''; if (empty($relato_text)) { wp_send_json_error(['message' => 'Relato vazio.']); } // Montar o prompt para a OpenAI $prompt = "# Extraia as seguintes informações do relato médico fornecido e retorne em formato JSON com os seguintes campos: { \"nome_paciente\": \"\", \"idade_paciente\": \"\", \"queixa_principal\": \"\", \"historico_medico\": \"\", \"sintomas_caracteristicas\": \"\", \"historico_familiar\": \"\", \"estilo_vida\": \"\", \"pressao_arterial\": \"\", \"frequencia_cardiaca\": \"\", \"temperatura_corporal\": \"\", \"saturacao_oxigenio\": \"\", \"exame_fisico\": \"\", \"resultados_exames\": \"\", \"diagnostico_principal\": \"\", \"diagnosticos_diferenciais\": \"\", \"problemas_ativos\": \"\", \"tratamento_prescrito\": \"\", \"acompanhamento_retorno\": \"\", \"exames_solicitados\": \"\", \"encaminhamentos\": \"\", \"instrucoes_orientacoes\": \"\" } # Se alguma informação não estiver disponível no relato, preencha com \"Não informado\". # Relato: \"$relato_text\""; // Chamar a API da OpenAI $messages = [ ['role' => 'system', 'content' => 'Você é um assistente que extrai informações de relatos médicos.'], ['role' => 'user', 'content' => $prompt], ]; $response = openai_gpt_35_turbo($messages); // Verificar se houve erro na resposta if (strpos($response, 'Erro') === 0) { wp_send_json_error(['message' => $response]); } // Verificar se a resposta está vazia if (empty($response)) { wp_send_json_error(['message' => 'Resposta vazia da OpenAI.']); } // Remover delimitadores de código, como ```json e ``` $cleaned_response = preg_replace('/^```json|```$/', '', trim($response)); // Tentar decodificar o JSON retornado $dados = json_decode($cleaned_response, true); // Tratamento de erros de decodificação JSON if (json_last_error() !== JSON_ERROR_NONE) { error_log("Erro ao decodificar JSON da OpenAI: " . json_last_error_msg()); error_log("Resposta da OpenAI: " . $cleaned_response); // Registrar a resposta completa para depuração wp_send_json_error(['message' => 'Erro ao decodificar a resposta da OpenAI.']); } // Verificar se a estrutura esperada está presente if (!is_array($dados) || empty($dados)) { wp_send_json_error(['message' => 'Estrutura de resposta inesperada da OpenAI.']); } // Retornar os dados decodificados para o frontend wp_send_json_success(['dados' => $dados]); } add_action('wp_ajax_processar_relato_medico', 'processar_relato_medico'); add_action('wp_ajax_nopriv_processar_relato_medico', 'processar_relato_medico'); ?>Chamada de API padrão OpenAi
<?php /* ====== Envia Solicitação para a API da OpenAI ==== */ function openai_gpt_35_turbo($messages, $temperature = 0.5) { $url = "https://api.openai.com/v1/chat/completions"; $api_key = OPENAI_API_KEY; if (empty($api_key) || $api_key === 'OPENAI_API_KEY') { error_log('OpenAI API key not defined or placeholder used.'); return 'Erro: Chave da API OpenAI não definida.'; } $request_data = json_encode([ 'model' => 'gpt-4o-mini', //'gpt-3.5-turbo', 'messages' => $messages, 'temperature' => $temperature, 'max_tokens' => 3500 ]); error_log('OpenAI request data: ' . mb_substr($request_data, 0, 300) . '...'); $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, [ 'Content-Type: application/json', 'Authorization: Bearer ' . $api_key ]); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $request_data); $response = curl_exec($ch); if ($response === false) { $error_message = curl_error($ch); curl_close($ch); error_log('OpenAI request error: ' . $error_message); return 'Erro na solicitação da OpenAI: ' . $error_message; } error_log('OpenAI response: ' . mb_substr($response, 0, 500) . '...'); curl_close($ch); $response_data = json_decode($response, true); if (isset($response_data['choices'][0]['message']['content'])) { error_log('OpenAI response content retrieved successfully'); return trim($response_data['choices'][0]['message']['content']); } else { error_log('Unexpected OpenAI response: ' . print_r($response_data, true)); return 'Erro: Resposta inesperada da OpenAI.'; } } ?>Dica extra – Use o Web Speech API direto no front para receber o relato em audio e converter em texto.
-
Participe do Hackathon Summit Saúde 2024
⚠️ Inscrições Encerradas ⚠️
Quer participar do maior hackathon de saúde em SC sem custo? Desenvolvedores da Python Floripa podem aplicar gratuitamente para o Hackathon Summit Saúde, e ganhar ingressos oferecidas pela ACM e parceiros para os Membros da Comunidade Python Floripa.
Está pronto para uma experiência transformadora? No Hackathon Summit Saúde você pode criar soluções inovadoras para desafios reais no setor de saúde em SC!
Por que Participar pela Python Floripa
Ao se inscrever pelo nosso link, você pode garantir sua vaga gratuitamente. Temos uma cota especial de inscrições isentas, que aumentará conforme a comunidade se engaja. Quanto mais membros aplicarem e interagirem em redes sociais, mais ingressos gratuitos conseguiremos para o evento! Esse é o momento de mostrar o Python Power e conquistar mais vagas para nossa comunidade.
Propósito e Impacto
Este hackathon vai além de uma competição: é sua chance de usar suas habilidades para resolver problemas concretos, com impacto direto na saúde das pessoas. Profissionais do setor estarão ao lado de desenvolvedores para transformar ideias em soluções aplicáveis.
Benefícios e Oportunidades
Desenvolva sua rede de contatos com médicos, gestores e investidores. O evento conta com mais de mil especialistas prontos para apoiar ideias promissoras, e as equipes mistas permitirão unir forças para criar soluções com potencial real de aplicação.
Veja a Lista dos Participantes
Compromisso e Inscrição
Inscreva-se apenas se você puder se comprometer em estar presente nos dias 08 (sexta) e 09 (sábado) de novembro, das 8h00 às 18h30. Se você for selecionado pela Python Floripa, participará de graça! Para aplicar preencha o formulário de inscrição abaixo. Não esqueça de detalhar como você acredita que pode contribuir para soluções na saúde.
Mas se você não puder participar, ajude a aumentar nossa cota de vagas comentando e compartilhando nossas postagens sobre o evento no Instagram e no (novo) LinkedIn da Comunidade Python Floripa.
[summitsaude_application] -
Dicas para Autores
Como Incluir Blocos de Código, Slides e Vídeos
Este artigo irá mostrar como você, autor, pode incorporar blocos de código com destaque de sintaxe, apresentações de slides do Google Drive e vídeos do YouTube em suas postagens no Python Floripa.
1. Incorporar um Bloco de Código com Destaque de Sintaxe (Prism.js)
Se você deseja exibir um trecho de código em diferentes linguagens (Python, C, PHP, Go, JavaScript) e garantir que ele tenha destaque de sintaxe, você pode usar a estrutura abaixo:
Passo 1: Utilizando a Tag “code”
Insira um bloco do tipo HTML no editor de posts do WordPress, utilize a tag <code> para envolver seu código, definindo a classe de acordo com a linguagem, como no exemplo abaixo:
<code class="language-python"># Python def check(): if pessoas > tecnologias: # continue else: return </code>Passo 2: Linguagens Suportadas
Aqui estão alguns exemplos para várias linguagens de programação:
- Python:
<code class="language-python"># Python def check(): if pessoas > tecnologias: # continue else: return </code>- C:
<code class="language-c">// C #include <stdio.h> void check() { if (pessoas > tecnologias) { // continue } else { return; } } </code>- PHP:
<code class="language-php"><?php // PHP function check() { if ($pessoas > $tecnologias) { // continue } else { return; } } ?> </code>- Go:
<code class="language-go">// Go func check() { if pessoas > tecnologias { // continue } else { return } } </code>- JavaScript:
<code class="language-javascript">// JavaScript function check() { if (pessoas > tecnologias) { // continue } else { return; } } </code>Exemplo aplicado:
# Python def check(): if pessoas > tecnologias: # continue else: return2. Incorporar Apresentações de Slides do Google Drive
Se você deseja incorporar uma apresentação de slides do Google Drive, siga os passos abaixo:
Passo 1: Obter o Código de Incorporação
- Abra sua apresentação no Google Slides.
- No menu, vá para Arquivo > Publicar na web.
- Selecione a aba Incorporar.
- Configure as opções, como o tempo entre as transições de slides e se deseja que a apresentação reinicie automaticamente.
- Clique em Publicar e confirme.
- Copie o ID da apresentação da URL de incorporação gerada. O ID é a parte entre
presentation/d/e/embedna URL.
Passo 2: Usar o Shortcode
Depois de obter o ID da apresentação, você pode incorporar o slide usando o shortcode abaixo. Substitua o valor de
idpelo ID da sua apresentação:[slides id="e/2PACX-1CqgfLm23R25ZHDQ1iwZSFcI__UHIjmu85MFlrWHmtkI"]Exemplo Aplicado:
3. Incorporar Vídeos do YouTube com Controle de Início e Fim
Para incorporar vídeos do YouTube e definir um ponto de início e término, siga os passos abaixo:
Passo 1: Obter o Código de Incorporação
- No YouTube, vá até o vídeo que você deseja incorporar.
- Abaixo do vídeo, clique em Compartilhar e depois em Incorporar.
- Copie o ID do vídeo, que é a parte final da URL do vídeo (por exemplo,
PeelAmozMxY).
Passo 2: Usar o Shortcode com Parâmetros de Tempo
Você pode especificar o tempo de início e término do vídeo usando os parâmetros
starteenddentro do shortcode. Exemplo:[video id="PeelAmozMxY" start="30" end="90"]Este shortcode iniciará o vídeo aos 30 segundos e o encerrará aos 90 segundos.
Exemplo Aplicado:
4. Incorporar PDF
Para incorporar PDF’s armazenados no Google Drive, siga as instruções abaixo:
Passo 1: Obter o ID do Arquivo PDF
- Suba o arquivo PDF para o Google Drive.
- Torne o arquivo público ou compartilhe com quem tiver o link:
Clique com o botão direito no arquivo e selecione Compartilhar.
No modal, escolha Qualquer pessoa com o link e copie a URL. - Identifique o ID do arquivo na URL copiada.
Exemplo de URL:
https://drive.google.com/file/d/1ABCDEFGH12345678/view
O ID do arquivo é a parte entre /d/ e /view:1ABCDEFGH12345678Passo 2: Usar o Shortcode no Seu Post
Depois de obter o ID do arquivo PDF, você pode incorporá-lo ao site utilizando o shortcode:
[google_pdf id="1ABCDEFGH12345678"]Resumo
Agora você tem as ferramentas necessárias para incorporar blocos de código, slides do Google Drive e vídeos do YouTube com personalização de tempo. Aqui estão exemplos completos para referência:
- Bloco de Código em Python:
<code class="language-python"># Python def check(): if pessoas > tecnologias: # continue else: return </code>- Incorporar Slides:
[slides id="e/2PACX-1CqgfLm23R25ZHDQ1iwZSFcI__UHIjmu85MFlrWHmtkI"]- Incorporar Vídeo:
[video id="PeelAmozMxY" start="30" end="90"]- Incorporar PDF:
[google_pdf id="1D5zmllNstgFYuFIg5htv5SXRpsqAKE5d"]Com estas instruções, você pode facilmente adicionar conteúdos dinâmicos e interativos às suas postagens no Python Floripa.