import csv import requests import time import tkinter as tk from tkinter import filedialog, messagebox from tkinter.ttk import Style, Label, Entry, Button, Frame from PIL import Image, ImageTk import webbrowser from io import BytesIO def enviar_mensagens(): # Obter os valores dos campos url_api = entry_url_api.get() api_key = entry_api_key.get() delay = int(entry_delay.get()) instancia_nome = entry_instancia_nome.get() # Exibe o aviso antes de minimizar a janela messagebox.showinfo("Aviso", "A tela será minimizada até que todas as mensagens sejam enviadas. Clique em OK para continuar.") # Minimiza a janela para a barra de tarefas root.iconify() # Abre o arquivo em modo de leitura with open(arquivo_path, mode='r') as file: handle = file # Verifica se o arquivo foi aberto com sucesso if handle: instancia = f'/client/sendMessage/{instancia_nome}' # URL da API url = url_api + instancia # Dados do cabeçalho (headers) headers = { 'accept': '*/*', 'x-api-key': api_key, 'Content-Type': 'application/json' } # Loop para ler cada linha do arquivo CSV reader = csv.reader(handle) for row in reader: phoneNumber = row[0] # Lê o conteúdo do arquivo de texto with open(arquivo_texto_path, mode='r') as txt_file: mensagem = txt_file.read() # Dados do corpo da requisição (body) data = { 'chatId': f'55{phoneNumber}@c.us', 'contentType': 'string', 'content': mensagem } # Inicializa a sessão cURL response = requests.post(url, json=data, headers=headers) # Verifica por erros if response.status_code != 200: error_log.append(f'Erro na requisição HTTP: {response.status_code}') # Add delay para enviar próxima mensagem time.sleep(delay) # Exibe os logs de erros em uma nova janela if error_log: error_window = tk.Toplevel() error_window.title("Logs de Erro") error_window.geometry("400x300") Label(error_window, text="Logs de Erro:").pack(pady=10) for error in error_log: Label(error_window, text=error).pack() error_log.clear() else: messagebox.showinfo("Sucesso", "Mensagens enviadas com sucesso!") # Restaura a janela root.deiconify() else: print("Erro ao abrir o arquivo CSV.") # Função para localizar arquivo de texto def localizar_arquivo_texto(): global arquivo_texto_path arquivo_texto_path = filedialog.askopenfilename(title="Selecione o arquivo de texto", filetypes=[("Arquivos de Texto", "*.txt")]) print(f"Arquivo de texto selecionado: {arquivo_texto_path}") # Função para abrir a página Sobre Nós def abrir_pagina_sobre_nos(): webbrowser.open_new("https://cursodev.com") # Criar a janela principal root = tk.Tk() root.title("Disparador CursoDev") root.geometry("350x500") # Estilo para os componentes style = Style() style.configure('TLabel', font=('Segoe UI', 12)) style.configure('TEntry', font=('Segoe UI', 12)) style.configure('Green.TButton', foreground='green') # Baixar a imagem do logo url_logo = "https://cursodev.com/assets/img/logo/logo.png" response = requests.get(url_logo) image_data = response.content logo_image = Image.open(BytesIO(image_data)) logo_photo = ImageTk.PhotoImage(logo_image) # Campos da interface Label(root, image=logo_photo).pack(pady=10) Label(root, text="URL da API:").pack(pady=5) entry_url_api = Entry(root, style='TEntry', width=50) entry_url_api.pack(pady=5) Label(root, text="API Key:").pack(pady=5) entry_api_key = Entry(root, style='TEntry', width=50) entry_api_key.pack(pady=5) Label(root, text="Delay (segundos):").pack(pady=5) entry_delay = Entry(root, style='TEntry', width=50) entry_delay.pack(pady=5) Label(root, text="Nome da Instância:").pack(pady=5) entry_instancia_nome = Entry(root, style='TEntry', width=50) entry_instancia_nome.pack(pady=5) # Botão para localizar arquivo de texto e selecionar arquivo CSV button_frame = Frame(root) button_frame.pack(pady=10) def selecionar_arquivo(): global arquivo_path arquivo_path = filedialog.askopenfilename(title="Selecione o arquivo CSV") print(f"Arquivo CSV selecionado: {arquivo_path}") Button(button_frame, text="Mensagem", command=localizar_arquivo_texto, width=15).grid(row=0, column=0, padx=5) Button(button_frame, text="Números", command=selecionar_arquivo, width=15).grid(row=0, column=1, padx=5) # Botão para enviar as mensagens Button(root, text="Disparar", command=enviar_mensagens, width=int(root.winfo_width()*0.7), style='Green.TButton').pack(fill=tk.X, pady=10) # Botão para abrir a página Sobre Nós Button(root, text="Sobre Nós", command=abrir_pagina_sobre_nos).pack(side=tk.BOTTOM, pady=10) # Lista para armazenar os logs de erro error_log = [] root.mainloop()