Spaces:
Running
Running
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 | |