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
- Acesse Create a Slack App.
- Clique em “Create New App” e escolha “From Scratch”.
- Dê um nome ao seu bot (exemplo: DailyBot) e selecione o workspace do seu time.
- 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.
-
- 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:
- 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
). - Calculamos o dia do ano atual → O
execution_number
retorna um valor de 1 a 365. - Selecionamos o próximo apresentador → Usamos o operador módulo
%
para percorrer ciclicamente a lista de membros. - Criamos a mensagem com o apresentador do dia → O Slack usa
<@userID>
para mencionar um usuário. - 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
暂无评论内容