fbpx

Notificação de Novos Projetos da Workana no Slack

Pré-requisitos

  1. Servidor PHP com Composer instalado.
  2. Conta no Slack com permissões para criar apps e configurar webhooks.
  3. Conta na Workana com login e senha válidos para acessar a lista de projetos.
  4. Navegador Chrome instalado.

Passo 1: Configurar o Webhook no Slack

  1. Acesse o Slack API.
  2. Clique em Create New App.
  3. Escolha From scratch, dê um nome ao app e selecione o workspace onde ele será instalado.
  4. No menu esquerdo, clique em Incoming Webhooks e ative-os.
  5. Clique em Add New Webhook to Workspace, selecione o canal onde quer receber as notificações e clique em Allow.
  6. Copie o Webhook URL gerado. Ele será usado no arquivo .env.

Passo 2: Configurar o Ambiente de Desenvolvimento

  1. Crie o projeto e navegue até o diretório criado no terminal:
    mkdir notificador-workana-slack
    cd notificador-workana-slack
  2. Inicialize o projeto PHP com o Composer e instale as dependências indicadas:
    Crie um arquivo composer.json com o conteúdo fornecido e execute o comando composer 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"
        }
    }
  3. 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

  1. 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.

  2. 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

  1. 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

  1. Execute o script com o seguinte comando:
    php index.php
  2. Verifique se os jobs foram capturados corretamente e se as notificações estão sendo enviadas para o Slack.

A Lídmo continua a crescer e inovar, buscando sempre superar as expectativas dos clientes.

Links úteis

Contato

©copyright todos os direitos reservados Lídmo Soluções  Tecnologicas 34.898.017/0001-20 – 2024