Pré-requisitos
- Servidor PHP com Composer instalado.
- Conta no Slack com permissões para criar apps e configurar webhooks.
- Conta na Workana com login e senha válidos para acessar a lista de projetos.
- Navegador Chrome instalado.
Passo 1: Configurar o Webhook no Slack
- Acesse o Slack API.
- Clique em Create New App.
- Escolha From scratch, dê um nome ao app e selecione o workspace onde ele será instalado.
- No menu esquerdo, clique em Incoming Webhooks e ative-os.
- Clique em Add New Webhook to Workspace, selecione o canal onde quer receber as notificações e clique em Allow.
- Copie o Webhook URL gerado. Ele será usado no arquivo
.env
.
Passo 2: Configurar o Ambiente de Desenvolvimento
- Crie o projeto e navegue até o diretório criado no terminal:
mkdir notificador-workana-slack cd notificador-workana-slack
- Inicialize o projeto PHP com o Composer e instale as dependências indicadas:
Crie um arquivocomposer.json
com o conteúdo fornecido e execute o comandocomposer install
para instalar as dependências:{ "require": { "symfony/dotenv": "^7.1", "symfony/panther": "^2.1" }, "require-dev": { "dbrekelmans/bdi": "^1.3", "symfony/var-dumper": "^7.1" } }
- Instale os drivers do Panther usando o
dbrekelmans/bdi
:
Esse pacote instala automaticamente o ChromeDriver e outros drivers necessários:vendor/bin/bdi detect drivers
Passo 3: Configurar as Variáveis de Ambiente
- Crie um arquivo
.env
na raiz do projeto com o seguinte conteúdo:SLACK_WEBHOOK_URL=<Seu_Webhook_URL> WORKANA_LOGIN_URL=https://www.workana.com/login WORKANA_JOBS_URL=https://www.workana.com/jobs?category=it-programming WORKANA_USERNAME=<Seu_Usuario_Workana> WORKANA_PASSWORD=<Sua_Senha_Workana> SENT_JOBS_FILE=sent_jobs.json
Substitua
<Seu_Webhook_URL>
,<Seu_Usuario_Workana>
, e<Sua_Senha_Workana>
pelos valores adequados. - Crie um arquivo vazio
sent_jobs.json
na raiz do projeto para armazenar os links dos jobs enviados:
touch sent_jobs.json
Passo 4: Implementação do Script PHP
- Crie um arquivo
index.php
e adicione o script fornecido anteriormente. Esse script fará o login na Workana, extrairá os novos projetos e enviará notificações para o Slack.<?php require 'vendor/autoload.php'; use Symfony\Component\Dotenv\Dotenv; // Carregar variáveis de ambiente $dotenv = new Dotenv(); $dotenv->load(__DIR__ . '/.env'); // Configurações $slackWebhookUrl = $_ENV['SLACK_WEBHOOK_URL']; $workanaLoginUrl = $_ENV['WORKANA_LOGIN_URL']; $workanaJobsUrl = $_ENV['WORKANA_JOBS_URL']; $workanaUsername = $_ENV['WORKANA_USERNAME']; $workanaPassword = $_ENV['WORKANA_PASSWORD']; $sentJobsFile = __DIR__ . '/' . $_ENV['SENT_JOBS_FILE']; // Função para carregar jobs enviados function loadSentJobs($file) { if (!file_exists($file)) { return []; } $content = file_get_contents($file); return json_decode($content, true) ?? []; } // Função para salvar jobs enviados function saveSentJobs($file, $jobs) { file_put_contents($file, json_encode($jobs, JSON_PRETTY_PRINT)); } // Carrega os jobs já enviados $sentJobs = loadSentJobs($sentJobsFile); // Inicializa o Panther e faz scraping $client = PantherClient::createChromeClient(); $client->request('GET', $workanaLoginUrl); // Preenche o formulário de login $client->submitForm('Login', ['email' => $workanaUsername, 'password' => $workanaPassword,]); $crawler = $client->request('GET', $workanaJobsUrl); // Certifique-se de que o seletor está correto $projectItems = $crawler->filter('#projects .project-item'); if ($projectItems->count() === 0) { echo "Nenhum item encontrado com o seletor '#projects'. Verifique o seletor e o conteúdo da página.\n"; exit; } // Extrai os jobs da página $jobs = $projectItems->each(function (\Symfony\Component\DomCrawler\Crawler $node) { $data = []; $data['title'] = $node->filter('.project-header .project-title a')->text(); $data['link'] = 'https://www.workana.com' . (string)$node->filter('.project-title a')->attr('href'); $data['description'] = str_replace(' ... Ver mais detalhes', '', $node->filter('.project-details')->text()); return $data; }); // Inicializa o HttpClient do Symfony $httpClient = HttpClient::create(); // Filtra e envia apenas os jobs novos foreach ($jobs as $job) { if (in_array($job['link'], $sentJobs)) { continue; // Pula se o job já foi enviado } $message = [ 'text' => "*Novo job encontrado!*", 'attachments' => [ [ 'title' => $job['title'], 'title_link' => $job['link'], 'text' => $job['description'], 'color' => '#7246e5' ] ] ]; // Envia a mensagem para o Slack usando HttpClient try { $response = $httpClient->request('POST', $slackWebhookUrl, ['json' => $message]); // Verifica se o envio foi bem-sucedido if ($response->getStatusCode() === 200) { echo "Job enviado para o Slack: {$job['title']}\n"; // Adiciona o job à lista de enviados $sentJobs[] = $job['link']; } else { echo "Falha ao enviar o job para o Slack: {$job['title']}\n"; } } catch (Exception $e) { echo "Erro ao enviar para o Slack: " . $e->getMessage() . "\n"; } } // Salva a lista atualizada de jobs enviados saveSentJobs($sentJobsFile, $sentJobs); echo "Processo concluído.";
Passo 5: Executar o Script
- Execute o script com o seguinte comando:
php index.php
- Verifique se os jobs foram capturados corretamente e se as notificações estão sendo enviadas para o Slack.