Hoje tem Flamengo! no conky
Tags: python, linux
Published: 2024-04-09 14:34:48

![fla-conky](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a2e87v0nn9is4j0r87te.png)

Diante de tantas prioridades no dia, gostaríamos de ficar sempre que possível, atualizados sobre tudo: principais notícias, cotação do dólar, assuntos mais comentados no momento, quando, onde e contra quem nosso time do coração irá jogar.

Através da tecnologia, programar e, de preferência, com Python, nos permite estar à frente para usufruir de um mundo cheio de informações, ficando ligados em tudo o que acontece de uma forma mais prática e eficiente.

Criei um script que me informa na área de trabalho do computador quais são os próximos jogos do Flamengo. Utilizei Python para realizar web scraping e Conky para exibir um painel personalizado com as informações que preciso.

## Conky
O Conky é um monitor de sistema altamente personalizável para sistemas Linux Like. Por meio de arquivos de configuração, além dos painéis de monitoramento do sistema, é possível personalizar novos painéis do Conky na área de trabalho. [Saiba mais sobre o conky.](https://mazer.dev/pt-br/linux/tutoriais/conky-no-linux-monitor-de-sistema-leve-para-seu-desktop/)

## Flamengo
O maior time do mundo, com a maior torcida do mundo, etc., e mais uma vez sendo mencionado aqui, servindo-me de inspiração para criar algumas ideias utilizando tecnologia.

## Scraping
Utilizando Python e bibliotecas como requests e BeautifulSoup4, a ideia é realizar um scraping no site do Flamengo capturando as informações dos próximos jogos do clube e exibi-las no Conky.

<sup>**Disclaimer Importante:**</sup>
<sup>*Este exemplo prático de web scraping tem como propósito educacional, demonstração e utilização técnica. É crucial respeitar os termos de serviço e políticas de privacidade dos sites ao realizar atividades de web scraping. Todo o conteúdo, marcas, e propriedades intelectuais mencionadas no exemplo pertencem ao C.R. do Flamengo.*</sup>
  

Podemos verificar os próximos jogos acessando a url [https://www.flamengo.com.br/jogos/](https://www.flamengo.com.br/jogos/)

### Importação das bibliotecas
```python
import requests
import os
from bs4 import BeautifulSoup
```

### Utilização de headers e acessando a url
É comum utilizar _headers_ para simular o comportamento de um navegador web real, alguns dos motivos disso é evitar que os sites possam bloquear ip's, ter garantia de receber o conteúdo da mesma forma que é vista no navegador e respeitar as políticas do site fornecendo confiabilidade ao servidor.

A lib requests permite acessar o site e ter a resposta do conteúdo desse site.

O uso do _timeout_ no requests evita espera indefinida, melhora eficiência, previne bloqueios de thread(travamento do script) e trata erros de conexão de forma adequada.

```python
# URL do site do Flamengo
url = "https://www.flamengo.com.br/jogos/"

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'
}

# Faz a requisição HTTP
response = requests.get(url, headers=headers, timeout=5)
```

#### Estrutura html e manipulação das tags com BeautifulSoup
É preciso identificar a estrutura base do html onde será feita a coleta das informações manipuladas pelo BeautifulSoup, que aqui é a `div` com uma classe chamada "panel-games".

![Flamengo html](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mbqffhoaggkysw179g3x.png)

A variável `content` terá as informações extraídas pelo BeautifulSoup e será o conteúdo a ser interpretado e exibido pelo conky através de um arquivo de texto, utilizando os parâmetros necessários para a personalização do painel.

O loop `for` pecorrerá toda a div e novas variáveis(month, games, tournament, teams, etc) são criadas para ter valores atribuídos extraídos das tags html existentes de dentro da div, os famosos elementos filhos da div pai `panel-games`.

Essas variáveis são usadas no `content` como forma de seus valores serem salvos e interpretados como texto puro.

```python
# Cria o objeto BeautifulSoup para analisar o HTML
        soup = BeautifulSoup(response.text, 'html.parser')

        # Encontra os elementos com a classe 'panel-games'
        panel_games = soup.find_all(class_='panel-games')

        content = ""

        # Itera sobre cada panel-games encontrado
        for panel_game in panel_games:

            # Extrai o mês
            month_tag = panel_game.find('h2')
            if month_tag:
                month = month_tag.get_text(strip=True)
            else:
                continue

            content += f"${{color red}}\n${{font Arial Black:size=12}}{month}$font$color\n\n"

            # Extrai as informações de cada jogo
            games = panel_game.find_all(class_='py-4')

            for game in games:
                # Extrai a data e horário do jogo
                date_time_tag = game.find('p')
                if date_time_tag:
                    date_time = date_time_tag.get_text(strip=True)
                    content += f"{date_time}\n"
                else:
                    continue

                # Extrai o torneio
                tournament_tag = game.find(class_='destaque')
                if tournament_tag:
                    tournament = tournament_tag.get_text(strip=True)
                    content += f"${{color red}}{tournament}$color ${{alignr}}${{color gray}}${{font Arial Black:size=5}}{formatted_date}${{font}}$color\n\n"
                else:
                    continue

                # Extrai os times
                teams_tag = game.find(class_='game-teams')
                if teams_tag:
                    teams = teams_tag.find_all('p', class_='d-none d-lg-inline-block')
                    if len(teams) == 2:
                        team1 = teams[0].get_text(strip=True)
                        team2 = teams[1].get_text(strip=True)
                        content += f"${{alignc}}${{color white}}${{font Arial Black:size=12}}{team1} x {team2}${{font}}$color\n\n"
                    else:
                        continue
                else:
                    continue
```

Salvando o conteúdo(content) em um arquivo txt chamado _flamengo-jogos.txt_ que será lido no arquivo de configuração do conky para ser exibido no painel.
```python
        # Salva o conteúdo no arquivo flamengo-jogos.txt
        with open("flamengo-jogos.txt", "w") as file:
            file.write(content)

        print("Arquivo flamengo-jogos.txt criado com sucesso.")
```
O código completo disponível aqui: [fla-conky](https://github.com/everton-tenorio/fla-conky/blob/main/fla-jogos.py)

### O arquivo de configuração do painel para o Conky - `fla-conky.conf`
O arquivo de configuração fla-conky.conf é o arquivo referente ao painel dos jogos do Flamengo exibido na área de trabalho.

O arquivo contém parâmetros que definem a aparência, transparência, intervalo de atualização, fonte e margens. Esses parâmetros controlam a exibição e o estilo das informações na área de trabalho.

No final, é utilizado o comando execpi para executar um comando a cada intervalo especificado (100 segundos neste caso) e exibir o resultado na área de trabalho. O comando cat é usado para mostrar o conteúdo do arquivo /home/.../fla-conky/flamengo-jogos.txt, que contém informações sobre os jogos.

```bash
conky.config = {
    default_color = '#afafaf',
    
    own_window = true,
    own_window_transparent = true,
    own_window_argb_visual = true,
    own_window_argb_value = 180,
    own_window_type = 'normal',
    own_window_colour = '#000000',
    own_window_hints = 'undecorated, below, sticky, skip_taskbar, skip_pager',
    
    update_interval = 1.0,
    double_buffer = true,
    use_spacer = 'right',

    alignment = 'bottom_left',
    use_xft = true,
    font = 'Monospace:size=8:style=semibold',

    border_inner_margin = 10,
    border_outer_margin = 0,
    border_width = 1,
    draw_graph_borders = true,
    
    gap_x = 100,
    gap_y = 580,
}

conky.text = [[
  ${execpi 100 cat /home/.../fla-conky/flamengo-jogos.txt}
]] 
```

## Resultado

E assim ficou o painel exibido na área de trabalho. Tentarei depois exibir também os emblemas, mas no momento esse painel me atende em relação a quando, onde e contra quem o Flamengo joga.

![fla-conky-desktop](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k0th1kjhvex2pjzjuklf.png)