chatbot-carometro / drive_search.py
leandroaraujodev's picture
feat: bump version 0.4.0
e92e757
from googleapiclient.discovery import build
from google.oauth2.service_account import Credentials
from fuzzywuzzy import process # Importando a biblioteca fuzzywuzzy
import os
SCOPES = ["https://www.googleapis.com/auth/drive.readonly"]
FOLDER_ID = "1hqfPQnsVL2Ld8hu0GRIqcuOp-eDz-CAX" # ID da pasta que você quer buscar
SERVICE_ACCOUNT_FILE = os.path.join(os.getcwd(), "./files/credenciais.json")
def authenticate_drive():
"""Autentica no Google Drive usando uma conta de serviço."""
credentials = Credentials.from_service_account_file(SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build("drive", "v3", credentials=credentials)
return service
def list_files_recursive(service, folder_id, path=""):
"""Lista todos os arquivos e subpastas no Google Drive de forma recursiva."""
query = f"'{folder_id}' in parents and trashed = false"
response = service.files().list(
q=query,
spaces="drive",
fields="files(id, name, mimeType, parents)",
).execute()
files = response.get("files", [])
all_files = []
for file in files:
# caminho completo
current_path = f"{path}/{file['name']}"
all_files.append({"id": file["id"], "name": file["name"], "path": current_path})
# buscar recursivamente
if file["mimeType"] == "application/vnd.google-apps.folder":
all_files.extend(list_files_recursive(service, file["id"], current_path))
return all_files
def find_file_by_name(files, search_name):
"""Encontra um arquivo com nome aproximado utilizando fuzzy matching."""
# Usando fuzzywuzzy para encontrar o arquivo mais próximo
file_names = [file["name"] for file in files]
best_match, score = process.extractOne(search_name, file_names)
if score >= 80: # Ajuste a pontuação mínima de correspondência (por exemplo, 80%)
matching_files = [file for file in files if file["name"] == best_match]
return matching_files
else:
return []
def search_file_in_drive(search_name):
"""Procura o arquivo mais relevante no Google Drive e retorna o link."""
service = authenticate_drive()
print("Autenticado com sucesso no Google Drive!")
# Listar arquivos na pasta e subpastas
files = list_files_recursive(service, FOLDER_ID)
if not files:
print("Nenhum arquivo encontrado na pasta!")
return None # Retorna None se nenhum arquivo for encontrado
print(f"Total de arquivos encontrados: {len(files)}")
# Encontrar o arquivo com nome aproximado
matching_files = find_file_by_name(files, search_name)
if matching_files:
best_file = matching_files[0] # Pega o arquivo mais relevante (primeiro da lista)
link = f"https://drive.google.com/file/d/{best_file['id']}/view"
print(f"Arquivo encontrado: {best_file['name']}")
print(f"Link: {link}")
return link # Retorna o link do arquivo encontrado
else:
print(f"Nenhum arquivo encontrado com nome aproximado '{search_name}'.")
return None # Retorna None se nenhum arquivo for encontrado