feat: Implementação completa do NoIdle - Cliente, Backend e Scripts
- Cliente Windows com modo silencioso e auto-start robusto - Backend Node.js + API REST - Frontend Next.js + Dashboard - Scripts PowerShell de configuração e diagnóstico - Documentação completa - Build scripts para Windows e Linux - Solução de auto-start após reinicialização Resolução do problema: Cliente não voltava ativo após reboot Solução: Registro do Windows + Task Scheduler + Modo silencioso
This commit is contained in:
179
PROBLEMA_MONITORACAO.md
Normal file
179
PROBLEMA_MONITORACAO.md
Normal file
@@ -0,0 +1,179 @@
|
||||
# 🚨 Problema: Monitoração não está capturando dados reais
|
||||
|
||||
## ❌ Situação Atual
|
||||
|
||||
O cliente Windows `DESKTOP-BC16GDH` está enviando dados, mas apenas:
|
||||
- `window_title`: `"[IDLE]"`
|
||||
- `application_name`: `"System Idle"`
|
||||
|
||||
**Resultado:** Todas as atividades aparecem como "System Idle" na interface, mesmo quando o usuário está usando aplicativos.
|
||||
|
||||
---
|
||||
|
||||
## 🔍 O que está acontecendo
|
||||
|
||||
### Backend (Servidor) ✅
|
||||
- ✅ Está recebendo os dados corretamente
|
||||
- ✅ Está salvando no banco de dados
|
||||
- ✅ Está detectando e avisando quando recebe dados inválidos
|
||||
- ✅ Logs mostram: `⚠️ ATENÇÃO: Recebendo atividade com window_title inválido: "[IDLE]"`
|
||||
|
||||
### Cliente Windows (DESKTOP-BC16GDH) ❌
|
||||
- ❌ Não está capturando o título real da janela ativa
|
||||
- ❌ Não está capturando o executável real do processo
|
||||
- ❌ Está enviando valores fixos "System Idle" e "[IDLE]"
|
||||
|
||||
---
|
||||
|
||||
## ✅ Solução: Atualizar o Cliente Windows
|
||||
|
||||
O código do cliente precisa ser modificado para capturar dados reais usando APIs do Windows.
|
||||
|
||||
### 1. Capturar Janela Ativa e Processo
|
||||
|
||||
**Código C# necessário:**
|
||||
|
||||
```csharp
|
||||
using System;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Text;
|
||||
using System.Diagnostics;
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
static extern IntPtr GetForegroundWindow();
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
|
||||
|
||||
[DllImport("user32.dll")]
|
||||
static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
|
||||
|
||||
// Função para obter dados da janela ativa
|
||||
public (string windowTitle, string applicationName) GetActiveWindowInfo()
|
||||
{
|
||||
try
|
||||
{
|
||||
// Obter janela ativa
|
||||
IntPtr hwnd = GetForegroundWindow();
|
||||
|
||||
if (hwnd == IntPtr.Zero)
|
||||
{
|
||||
return ("[IDLE]", "System Idle");
|
||||
}
|
||||
|
||||
// Obter título da janela
|
||||
StringBuilder windowTitle = new StringBuilder(256);
|
||||
GetWindowText(hwnd, windowTitle, 256);
|
||||
|
||||
// Obter processo
|
||||
uint processId;
|
||||
GetWindowThreadProcessId(hwnd, out processId);
|
||||
|
||||
Process process = Process.GetProcessById((int)processId);
|
||||
string appName = process.ProcessName + ".exe";
|
||||
|
||||
// Se não conseguiu obter título, usar nome do processo
|
||||
string title = windowTitle.ToString();
|
||||
if (string.IsNullOrWhiteSpace(title))
|
||||
{
|
||||
title = appName;
|
||||
}
|
||||
|
||||
// NÃO retornar "System Idle" se há uma janela ativa
|
||||
return (title, appName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine($"Erro ao obter janela ativa: {ex.Message}");
|
||||
return ("[ERRO]", "Unknown");
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. Enviar Dados Reais
|
||||
|
||||
**Antes (ERRADO):**
|
||||
```json
|
||||
{
|
||||
"window_title": "[IDLE]",
|
||||
"application_name": "System Idle"
|
||||
}
|
||||
```
|
||||
|
||||
**Depois (CORRETO):**
|
||||
```json
|
||||
{
|
||||
"window_title": "Documento - Word",
|
||||
"application_name": "WINWORD.EXE"
|
||||
}
|
||||
```
|
||||
|
||||
ou
|
||||
|
||||
```json
|
||||
{
|
||||
"window_title": "Visual Studio Code",
|
||||
"application_name": "Code.exe"
|
||||
}
|
||||
```
|
||||
|
||||
ou
|
||||
|
||||
```json
|
||||
{
|
||||
"window_title": "YouTube",
|
||||
"application_name": "chrome.exe"
|
||||
}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Checklist para o Desenvolvedor do Cliente
|
||||
|
||||
- [ ] Implementar `GetForegroundWindow()` para obter janela ativa
|
||||
- [ ] Implementar `GetWindowText()` para obter título da janela
|
||||
- [ ] Implementar `GetWindowThreadProcessId()` para obter processo
|
||||
- [ ] Usar `Process.GetProcessById()` para obter nome do executável
|
||||
- [ ] **NÃO** enviar "System Idle" quando há uma janela ativa
|
||||
- [ ] Enviar dados reais mesmo quando o usuário está trabalhando
|
||||
- [ ] Testar com diferentes aplicativos (Chrome, Word, VS Code, etc.)
|
||||
|
||||
---
|
||||
|
||||
## 🔧 Como Testar
|
||||
|
||||
1. **No Cliente Windows:**
|
||||
- Abra o Visual Studio Code
|
||||
- Verifique se o cliente está enviando: `window_title: "Visual Studio Code"` e `application_name: "Code.exe"`
|
||||
- Abra o Chrome
|
||||
- Verifique se está enviando: `window_title: "Título da aba"` e `application_name: "chrome.exe"`
|
||||
|
||||
2. **No Servidor (verificar logs):**
|
||||
```bash
|
||||
pm2 logs pointcontrol-api --lines 20
|
||||
```
|
||||
|
||||
Procure por:
|
||||
- ✅ `✅ Atividade registrada: chrome.exe - YouTube` (correto)
|
||||
- ❌ `⚠️ ATENÇÃO: Recebendo atividade com window_title inválido` (errado)
|
||||
|
||||
3. **Na Interface Web:**
|
||||
- Acesse `https://admin.noidle.tech/activities`
|
||||
- Deve aparecer os nomes reais dos aplicativos e janelas
|
||||
|
||||
---
|
||||
|
||||
## 📄 Documentação Completa
|
||||
|
||||
Veja o arquivo `ESPECIFICACAO_CLIENTE_WINDOWS.md` para a especificação completa de todos os endpoints e campos necessários.
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Resumo
|
||||
|
||||
**O problema NÃO está no servidor.** O servidor está funcionando perfeitamente e recebendo os dados.
|
||||
|
||||
**O problema ESTÁ no cliente Windows** que precisa ser atualizado para capturar dados reais dos aplicativos e janelas ativas.
|
||||
|
||||
**Ação necessária:** Atualizar o código do cliente Windows para usar as APIs do Windows e capturar dados reais.
|
||||
|
||||
Reference in New Issue
Block a user