Executando verificação de segurança...
12

Automatizando a Gestão de Imagens: Como Reduzi um Trabalho de 1 Mês para 2 Semanas com Python

Desafio

Essa semana recebi uma tarefa de um cliente. O desafio consistia em:

  1. Pegar 2 planilhas de produtos com mais de 10 mil linhas.
  2. Confirmar as informações entre elas.
  3. Baixar as imagens que estavam definidas a partir de links na planilha.
  4. Fazer o download dessas imagens.
  5. Enviar as imagens para o Strapi.
  6. Pegar o link da imagem depois de realizar o upload e trocar na planilha.
  7. Salvar e nomear a imagem com o código (EAN) presente na planilha.
  8. Trocar o link antigo pelo novo link do arquivo enviado para o Strapi.

Solução

Esse desafio tinha o prazo de 1 mês para ser feito manualmente e linha por linha. Decidi então encontrar formas de automatizar o processo por meio de desenvolvimento. Com isso, construí uma aplicação em Python que faz tudo isso de forma 100% automática.

Resultados

Com essa aplicação, conseguimos:

  • Otimizar o tempo de processamento.
  • Validar as informações com precisão.
  • Reduzir o prazo de entrega de 1 mês para praticamente 2 semanas.

Tecnologias Utilizadas

  • Python: Para o desenvolvimento da aplicação.
  • Pandas: Para manipulação das planilhas Excel.
  • Requests: Para download das imagens e upload para o Strapi.
  • TQDM: Para exibir uma barra de progresso.
  • Strapi: Para armazenar e gerenciar as imagens.
import os
import pandas as pd
import requests
from tqdm import tqdm

TOKEN = "seu_token_de_autorizacao_aqui"

def download_image(url, filename):
    response = requests.get(url, stream=True)
    if response.status_code == 200 and 'Content-Length' in response.headers:
        total_size = int(response.headers['Content-Length'])
        with open(filename, 'wb') as f:
            with tqdm(total=total_size, unit='B', unit_scale=True, desc=f"Downloading {filename}") as pbar:
                for chunk in response.iter_content(chunk_size=1024):
                    f.write(chunk)
                    pbar.update(len(chunk))
        return True
    return False

def upload_image_to_strapi(image_path, ean):
    url = 'https://seu_servidor_strapi/upload'
    headers = {"Authorization": f"Bearer {TOKEN}"}
    payload = {'fileInfo': f'{{"name": "{ean}.png", "folder": "1"}}'}
    files = {'files': (f"{ean}.png", open(image_path, 'rb'), 'image/jpeg')}
    response = requests.post(url, headers=headers, data=payload, files=files)
    if response.status_code == 200:
        json_response = response.json()
        return json_response[0]['url'] if json_response else None
    return None

def process_excel(file_path):
    df_produtos = pd.read_excel('produtos.xlsx')
    df_wix = pd.read_excel(file_path)
    downloads_dir = os.path.join(os.path.dirname(file_path), 'downloads')

    if not os.path.exists(downloads_dir):
        os.makedirs(downloads_dir)

    for index, row in tqdm(df_produtos.iterrows(), total=len(df_produtos), desc="Processing rows"):
        ean = int(row['ean'])
        image_url = row['link_imagem']
        if pd.notnull(image_url):
            image_filename = os.path.join(downloads_dir, f"{ean}.png")
            if download_image(image_url, image_filename):
                strapi_link = upload_image_to_strapi(image_filename, ean)
                if strapi_link:
                    df_produtos.at[index, 'link_imagem2'] = strapi_link

    df_produtos.to_excel('produtos.xlsx', index=False)

    for index, row in tqdm(df_wix.iterrows(), total=len(df_wix), desc="Updating Wix sheet"):
        ean = int(row['ean'])
        product_image_url_series = df_produtos.loc[df_produtos['ean'] == ean, 'link_imagem2']
        if not product_image_url_series.empty:
            df_wix.at[index, 'link_imagem2'] = product_image_url_series.iloc[0]

    df_wix.to_excel(file_path, index=False)

if __name__ == "__main__":
    process_excel('PlanilhaWix.xlsx')

Carregando publicação patrocinada...
2