File size: 3,109 Bytes
71de332
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
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