У меня есть приложение на python:
import os
import io
import time
import string
import logging
from google.oauth2 import service_account
from googleapiclient.discovery import build
from googleapiclient.http import MediaIoBaseDownload
# Настройка логирования
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
# Форматтер логов
formatter = logging.Formatter(
'%(asctime)s - %(levelname)s - %(message)s', datefmt='%Y-%m-%d')
# Обработчик для записи логов в файл
file_handler = logging.FileHandler('script.log')
file_handler.setFormatter(formatter)
logger.addHandler(file_handler)
# Обработчик для вывода логов в консоль
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(formatter)
logger.addHandler(stream_handler)
# Путь к файлу с учетными данными сервисного аккаунта
SERVICE_ACCOUNT_FILE = 'credits.json'
# Определение областей доступа
SCOPES = ['https://www.googleapis.com/auth/drive']
# Создание учетных данных и сервиса
credentials = service_account.Credentials.from_service_account_file(
SERVICE_ACCOUNT_FILE, scopes=SCOPES)
service = build('drive', 'v3', credentials=credentials)
def list_folders(service):
results = service.files().list(
q="mimeType='application/vnd.google-apps.folder'",
fields="nextPageToken, files(id, name)").execute()
items = results.get('files', [])
folders = []
if items:
for item in items:
folders.append((item['name'], item['id']))
return folders
def sanitize_filename(filename):
valid_chars = "-_.() %s%s" % (string.ascii_letters, string.digits)
# Добавляем кириллические символы
valid_chars += "абвгдеёжзийклмнопрстуфхцчшщъыьэюя"
# Добавляем кириллические символы заглавные
valid_chars += "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
cleaned_filename = ''.join(c for c in filename if c in valid_chars)
cleaned_filename = cleaned_filename.replace(
' ', '_') # Заменяем пробелы на подчеркивания
# Сокращаем имя файла, если оно слишком длинное
return cleaned_filename[:255]
def download_spreadsheets(service, folder_id, folder_name):
download_dir = "Файлы"
results = service.files().list(
q=f"'{folder_id}' in parents and mimeType='application/vnd.google-apps.spreadsheet'",
fields="nextPageToken, files(id, name)").execute()
items = results.get('files', [])
if not items:
logger.info(f"В папке '{folder_name}' нет таблиц для загрузки.")
return
for item in items:
try:
# Добавляем к названию файла часть его ID
file_id_fragment = item['id'][:8]
filename = f"{folder_name}_{item['name']}_{file_id_fragment}.xlsx"
sanitized_filename = sanitize_filename(filename)
full_file_path = os.path.join(download_dir, sanitized_filename)
request = service.files().export_media(fileId=item['id'],
mimeType='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
fh.seek(0)
os.makedirs(os.path.dirname(full_file_path), exist_ok=True)
with open(full_file_path, 'wb') as f:
f.write(fh.read())
logger.info(f"Скачал {sanitized_filename} в {download_dir}")
except Exception as e:
logger.error(f"Ошибка при скачивании {item['name']}: {e}")
def main():
folders = list_folders(service)
for folder_name, folder_id in folders:
logger.info(f"Перехожу в папку \"{folder_name}\"")
download_spreadsheets(service, folder_id, folder_name)
logger.info(f"Ожидаю 20 секунд")
time.sleep(20)
if __name__ == '__main__':
main()
Но при запуске я получаю ошибку:
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: EE certificate key too weak (_ssl.c:1000)
Копания на просторах интернета мне не помогли. Как исправить данную ошибку?
ОС: Windows 10
ПО: Python 3.12
P.S. удаление антивируса не вариант, т.к. работаю на корпоративном окружении.