Automação de Daily no Slack com GitHub Actions e Python

Introdução

Se você trabalha com metodologias ágeis, sabe como as dailies são essenciais para manter o time alinhado. Mas e se você pudesse automatizar o lembrete e a escolha do apresentador de cada dia?

O DailyBot resolve isso!

Ele é um bot automatizado para Slack, que anuncia diariamente a reunião e seleciona automaticamente quem será o próximo apresentador. Tudo isso rodando de forma totalmente automatizada com Python, GitHub Actions e a API do Slack.

Este artigo vai te guiar pelo passo a passo para criar, configurar e automatizar o DailyBot no seu time!

O projeto original se encontra no Github, fique à vontade para abrir issues e pull requests no GitHub!


Tecnologias Utilizadas

Vamos usar as seguintes ferramentas para implementar o bot:

  • Python 3.9 → Para programar o bot.
  • Slack API → Para postar mensagens no canal do time.
  • GitHub Actions → Para rodar o bot automaticamente todos os dias úteis.
  • Requests (Python) → Para enviar requisições à API do Slack.

Estrutura do Projeto

O projeto segue uma estrutura organizada para facilitar a manutenção:

.
├── .github/workflows/ # Configuração do GitHub Actions
│ ├── ci.yaml # Workflow para execução automatizada
├── scripts/ # Diretório para scripts Python
│ ├── daily_slack.py # Script responsável pelo envio da mensagem para o Slack
├── .gitignore # Arquivo para ignorar arquivos desnecessários no repositório
├── LICENSE # Licença do projeto
├── README.md # Documentação do projeto
.
├── .github/workflows/       # Configuração do GitHub Actions
│   ├── ci.yaml              # Workflow para execução automatizada
├── scripts/                 # Diretório para scripts Python
│   ├── daily_slack.py       # Script responsável pelo envio da mensagem para o Slack
├── .gitignore               # Arquivo para ignorar arquivos desnecessários no repositório
├── LICENSE                  # Licença do projeto
├── README.md                # Documentação do projeto
. ├── .github/workflows/ # Configuração do GitHub Actions │ ├── ci.yaml # Workflow para execução automatizada ├── scripts/ # Diretório para scripts Python │ ├── daily_slack.py # Script responsável pelo envio da mensagem para o Slack ├── .gitignore # Arquivo para ignorar arquivos desnecessários no repositório ├── LICENSE # Licença do projeto ├── README.md # Documentação do projeto

Enter fullscreen mode Exit fullscreen mode

Agora, vamos ao código!


Criando o Bot no Slack

Antes de rodarmos o DailyBot, precisamos criar um bot no Slack para gerar as credenciais necessárias.

1️⃣ Criando um App no Slack

  1. Acesse Create a Slack App.
  2. Clique em “Create New App” e escolha “From Scratch”.
  3. Dê um nome ao seu bot (exemplo: DailyBot) e selecione o workspace do seu time.
  4. Vá até OAuth & Permissions e adicione os seguintes escopos:
    • chat:write → Para enviar mensagens no canal.
    • chat:write.public → Para postar em canais públicos.
    • users:read → Para listar os membros do time.
  5. Instale o aplicativo no workspace e copie o Bot User OAuth Token (SLACK_TOKEN).

Agora que o bot já está no Slack, vamos programá-lo! ️


Configurando o Script em Python

Crie o arquivo scripts/daily_slack.py e adicione o seguinte código:

<span>import</span> <span>requests</span>
<span>import</span> <span>os</span>
<span>from</span> <span>datetime</span> <span>import</span> <span>datetime</span>
<span># Obtendo as variáveis de ambiente </span><span>SLACK_TOKEN</span> <span>=</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>"</span><span>SLACK_TOKEN</span><span>"</span><span>)</span>
<span>CHANNEL_ID</span> <span>=</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>"</span><span>CHANNEL_ID</span><span>"</span><span>)</span>
<span>SLACK_MEMBERS</span> <span>=</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>"</span><span>SLACK_MEMBERS</span><span>"</span><span>).</span><span>split</span><span>(</span><span>"</span><span>,</span><span>"</span><span>)</span>
<span># Calculando o apresentador do dia </span><span>execution_number</span> <span>=</span> <span>datetime</span><span>.</span><span>utcnow</span><span>().</span><span>timetuple</span><span>().</span><span>tm_yday</span>
<span>next_index</span> <span>=</span> <span>(</span><span>execution_number</span> <span>-</span> <span>1</span><span>)</span> <span>%</span> <span>len</span><span>(</span><span>SLACK_MEMBERS</span><span>)</span>
<span>presenter</span> <span>=</span> <span>f</span><span>"</span><span><@</span><span>{</span><span>SLACK_MEMBERS</span><span>[</span><span>next_index</span><span>]</span><span>}</span><span>></span><span>"</span>
<span># Mensagem para o Slack </span><span>message</span> <span>=</span> <span>(</span>
<span>f</span><span>"</span><span> Olá pessoal! </span><span>\n</span><span>"</span>
<span>f</span><span>"</span><span>Quem apresentará hoje: </span><span>{</span><span>presenter</span><span>}</span><span>!</span><span>"</span>
<span>)</span>
<span># Configuração da API do Slack </span><span>url</span> <span>=</span> <span>"</span><span>https://slack.com/api/chat.postMessage</span><span>"</span>
<span>headers</span> <span>=</span> <span>{</span><span>"</span><span>Authorization</span><span>"</span><span>:</span> <span>f</span><span>"</span><span>Bearer </span><span>{</span><span>SLACK_TOKEN</span><span>}</span><span>"</span><span>,</span> <span>"</span><span>Content-Type</span><span>"</span><span>:</span> <span>"</span><span>application/json</span><span>"</span><span>}</span>
<span>data</span> <span>=</span> <span>{</span><span>"</span><span>channel</span><span>"</span><span>:</span> <span>CHANNEL_ID</span><span>,</span> <span>"</span><span>text</span><span>"</span><span>:</span> <span>message</span><span>}</span>
<span># Enviando a mensagem para o Slack </span><span>response</span> <span>=</span> <span>requests</span><span>.</span><span>post</span><span>(</span><span>url</span><span>,</span> <span>json</span><span>=</span><span>data</span><span>,</span> <span>headers</span><span>=</span><span>headers</span><span>)</span>
<span>print</span><span>(</span><span>"</span><span>Mensagem enviada:</span><span>"</span><span>,</span> <span>response</span><span>.</span><span>json</span><span>())</span>
<span>import</span> <span>requests</span>
<span>import</span> <span>os</span>
<span>from</span> <span>datetime</span> <span>import</span> <span>datetime</span>

<span># Obtendo as variáveis de ambiente </span><span>SLACK_TOKEN</span> <span>=</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>"</span><span>SLACK_TOKEN</span><span>"</span><span>)</span>
<span>CHANNEL_ID</span> <span>=</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>"</span><span>CHANNEL_ID</span><span>"</span><span>)</span>
<span>SLACK_MEMBERS</span> <span>=</span> <span>os</span><span>.</span><span>getenv</span><span>(</span><span>"</span><span>SLACK_MEMBERS</span><span>"</span><span>).</span><span>split</span><span>(</span><span>"</span><span>,</span><span>"</span><span>)</span>

<span># Calculando o apresentador do dia </span><span>execution_number</span> <span>=</span> <span>datetime</span><span>.</span><span>utcnow</span><span>().</span><span>timetuple</span><span>().</span><span>tm_yday</span>  
<span>next_index</span> <span>=</span> <span>(</span><span>execution_number</span> <span>-</span> <span>1</span><span>)</span> <span>%</span> <span>len</span><span>(</span><span>SLACK_MEMBERS</span><span>)</span>  
<span>presenter</span> <span>=</span> <span>f</span><span>"</span><span><@</span><span>{</span><span>SLACK_MEMBERS</span><span>[</span><span>next_index</span><span>]</span><span>}</span><span>></span><span>"</span>

<span># Mensagem para o Slack </span><span>message</span> <span>=</span> <span>(</span>
    <span>f</span><span>"</span><span> Olá pessoal! </span><span>\n</span><span>"</span>
    <span>f</span><span>"</span><span>Quem apresentará hoje: </span><span>{</span><span>presenter</span><span>}</span><span>!</span><span>"</span>
<span>)</span>

<span># Configuração da API do Slack </span><span>url</span> <span>=</span> <span>"</span><span>https://slack.com/api/chat.postMessage</span><span>"</span>
<span>headers</span> <span>=</span> <span>{</span><span>"</span><span>Authorization</span><span>"</span><span>:</span> <span>f</span><span>"</span><span>Bearer </span><span>{</span><span>SLACK_TOKEN</span><span>}</span><span>"</span><span>,</span> <span>"</span><span>Content-Type</span><span>"</span><span>:</span> <span>"</span><span>application/json</span><span>"</span><span>}</span>
<span>data</span> <span>=</span> <span>{</span><span>"</span><span>channel</span><span>"</span><span>:</span> <span>CHANNEL_ID</span><span>,</span> <span>"</span><span>text</span><span>"</span><span>:</span> <span>message</span><span>}</span>

<span># Enviando a mensagem para o Slack </span><span>response</span> <span>=</span> <span>requests</span><span>.</span><span>post</span><span>(</span><span>url</span><span>,</span> <span>json</span><span>=</span><span>data</span><span>,</span> <span>headers</span><span>=</span><span>headers</span><span>)</span>
<span>print</span><span>(</span><span>"</span><span>Mensagem enviada:</span><span>"</span><span>,</span> <span>response</span><span>.</span><span>json</span><span>())</span>
import requests import os from datetime import datetime # Obtendo as variáveis de ambiente SLACK_TOKEN = os.getenv("SLACK_TOKEN") CHANNEL_ID = os.getenv("CHANNEL_ID") SLACK_MEMBERS = os.getenv("SLACK_MEMBERS").split(",") # Calculando o apresentador do dia execution_number = datetime.utcnow().timetuple().tm_yday next_index = (execution_number - 1) % len(SLACK_MEMBERS) presenter = f"<@{SLACK_MEMBERS[next_index]}>" # Mensagem para o Slack message = ( f" Olá pessoal! \n" f"Quem apresentará hoje: {presenter}!" ) # Configuração da API do Slack url = "https://slack.com/api/chat.postMessage" headers = {"Authorization": f"Bearer {SLACK_TOKEN}", "Content-Type": "application/json"} data = {"channel": CHANNEL_ID, "text": message} # Enviando a mensagem para o Slack response = requests.post(url, json=data, headers=headers) print("Mensagem enviada:", response.json())

Enter fullscreen mode Exit fullscreen mode


Como Funciona a Lógica do Script?

Esse script segue uma lógica simples e eficiente para alternar automaticamente o apresentador da daily.

Passo a passo:

  1. Carregamos as variáveis de ambiente → O token do bot (SLACK_TOKEN), o ID do canal (CHANNEL_ID) e a lista de membros (SLACK_MEMBERS).
  2. Calculamos o dia do ano atual → O execution_number retorna um valor de 1 a 365.
  3. Selecionamos o próximo apresentador → Usamos o operador módulo % para percorrer ciclicamente a lista de membros.
  4. Criamos a mensagem com o apresentador do dia → O Slack usa <@userID> para mencionar um usuário.
  5. Enviamos a mensagem usando a API do Slack.

Exemplo prático:

Se a lista de apresentadores for:

<span>export </span><span>SLACK_MEMBERS</span><span>=</span><span>"U12345,U67890,U54321"</span>
<span>export </span><span>SLACK_MEMBERS</span><span>=</span><span>"U12345,U67890,U54321"</span>
export SLACK_MEMBERS="U12345,U67890,U54321"

Enter fullscreen mode Exit fullscreen mode

O apresentador será alternado conforme o dia do ano:

Dia do Ano Apresentador
1 (Jan) U12345
2 (Jan) U67890
3 (Jan) U54321
4 (Jan) U12345 (reinicia)

Essa abordagem garante que o bot sempre escolhe o próximo da fila, sem repetições ou sorteios aleatórios.


Automatizando com GitHub Actions

Agora, vamos configurar o GitHub Actions para rodar esse bot automaticamente todos os dias úteis.

Criando o Workflow .github/workflows/ci.yaml

Crie o arquivo .github/workflows/ci.yaml e adicione:

<span>name</span><span>:</span> <span>Daily Slack Notification</span>
<span>on</span><span>:</span>
<span>schedule</span><span>:</span>
<span>-</span> <span>cron</span><span>:</span> <span>"</span><span>30</span><span> </span><span>12</span><span> </span><span>*</span><span> </span><span>*</span><span> </span><span>1-5"</span> <span># Executa às 12:30 (UTC) de segunda a sexta</span>
<span>workflow_dispatch</span><span>:</span> <span># Permite execução manual via GitHub Actions</span>
<span>jobs</span><span>:</span>
<span>daily-slack-notification</span><span>:</span>
<span>name</span><span>:</span> <span>Enviar Notificação para o Slack</span>
<span>runs-on</span><span>:</span> <span>ubuntu-latest</span>
<span>steps</span><span>:</span>
<span>-</span> <span>name</span><span>:</span> <span>Checkout do repositório</span>
<span>uses</span><span>:</span> <span>actions/checkout@v4</span>
<span>-</span> <span>name</span><span>:</span> <span>Configurar Python</span>
<span>uses</span><span>:</span> <span>actions/setup-python@v4</span>
<span>with</span><span>:</span>
<span>python-version</span><span>:</span> <span>"</span><span>3.9"</span>
<span>-</span> <span>name</span><span>:</span> <span>Instalar dependências</span>
<span>run</span><span>:</span> <span>pip install requests</span>
<span>-</span> <span>name</span><span>:</span> <span>Executar script Python</span>
<span>run</span><span>:</span> <span>python scripts/daily_slack.py</span>
<span>name</span><span>:</span> <span>Daily Slack Notification</span>

<span>on</span><span>:</span>
  <span>schedule</span><span>:</span>
    <span>-</span> <span>cron</span><span>:</span> <span>"</span><span>30</span><span> </span><span>12</span><span> </span><span>*</span><span> </span><span>*</span><span> </span><span>1-5"</span> <span># Executa às 12:30 (UTC) de segunda a sexta</span>
  <span>workflow_dispatch</span><span>:</span> <span># Permite execução manual via GitHub Actions</span>

<span>jobs</span><span>:</span>
  <span>daily-slack-notification</span><span>:</span>
    <span>name</span><span>:</span> <span>Enviar Notificação para o Slack</span>
    <span>runs-on</span><span>:</span> <span>ubuntu-latest</span>

    <span>steps</span><span>:</span>
      <span>-</span> <span>name</span><span>:</span> <span>Checkout do repositório</span>
        <span>uses</span><span>:</span> <span>actions/checkout@v4</span>

      <span>-</span> <span>name</span><span>:</span> <span>Configurar Python</span>
        <span>uses</span><span>:</span> <span>actions/setup-python@v4</span>
        <span>with</span><span>:</span>
          <span>python-version</span><span>:</span> <span>"</span><span>3.9"</span>

      <span>-</span> <span>name</span><span>:</span> <span>Instalar dependências</span>
        <span>run</span><span>:</span> <span>pip install requests</span>

      <span>-</span> <span>name</span><span>:</span> <span>Executar script Python</span>
        <span>run</span><span>:</span> <span>python scripts/daily_slack.py</span>
name: Daily Slack Notification on: schedule: - cron: "30 12 * * 1-5" # Executa às 12:30 (UTC) de segunda a sexta workflow_dispatch: # Permite execução manual via GitHub Actions jobs: daily-slack-notification: name: Enviar Notificação para o Slack runs-on: ubuntu-latest steps: - name: Checkout do repositório uses: actions/checkout@v4 - name: Configurar Python uses: actions/setup-python@v4 with: python-version: "3.9" - name: Instalar dependências run: pip install requests - name: Executar script Python run: python scripts/daily_slack.py

Enter fullscreen mode Exit fullscreen mode

Como funciona esse Workflow?

Execução automática → O cron agendado faz o bot rodar de segunda a sexta às 12:30 UTC.

Execução manual → Você pode rodar a ação manualmente via GitHub Actions.

Instalação automática de dependências → O bot instala requests antes de rodar o script.


Conclusão

Agora você sabe como:

Criar um bot no Slack para anunciar dailies.

Escrever um script Python para enviar mensagens automaticamente.

Configurar um workflow no GitHub Actions para automação diária.

Alternar automaticamente o apresentador da daily com uma lógica eficiente.

Agora sua equipe nunca mais esquecerá a daily e quem irá apresenta-la!

Se tiver dúvidas ou sugestões, deixe um comentário. Se gostou do artigo, compartilhe com seu time!

原文链接:Automação de Daily no Slack com GitHub Actions e Python

© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
When you procrastinate, you become a slave to yesterday.
拖延会让你成为昨天的奴隶
评论 抢沙发

请登录后发表评论

    暂无评论内容