Добрый день. Я разрабатываю бота, который загружает фотографии, отправленные пользователями в Telegram, на Яндекс Диск. Сначала фотографии сохраняются в папку на ПК, а затем загружаются на Яндекс. Проблема в том, что изображения имеют разные названия, и для их загрузки требуется указать точный путь и имя файла. Как мне реализовать возможность, чтобы бот проверял файлы в папке и автоматически загружал все JPEG-файлы на Яндекс? Либо как можно изменить имена файлов в папке, чтобы бот мог подставлять их в путь загрузки?
Здравствуйте! Для того чтобы ваш бот мог автоматически загружать все JPEG-файлы из указанной папки на Яндекс Диск, вы можете использовать следующий подход: 1. **Получение списка файлов в папке.** Используйте библиотеку Python, такую как `os`, чтобы получить список всех JPEG-файлов в вашей папке. 2. **Проверка формата файлов.** Убедитесь, что вы обрабатываете только файлы с нужным форматом, например, `.jpg` и `.jpeg`. 3. **Загрузка файлов на Яндекс Диск.** Используйте API Яндекс Диска для загрузки изображений. Вам придется пройти аутентификацию, чтобы получить токен. 4. **Автоматическое изменение имен файлов (по желанию).** Если вы хотите изменить имена файлов перед загрузкой, вы можете переименовать их с помощью функции `os.rename()`, выбирая, например, последовательные номера. Вот примерный код для выполнения этих шагов: ```python import os import requests # Путь к папке с JPEG-файлами folder_path = 'path/to/your/folder' # Укажите токен для доступа к Яндекс Диску TOKEN = 'your_yandex_disk_token' # URL для загрузки файлов на Яндекс Диск YANDEX_DISK_URL = 'https://cloud-api.yandex.net/v1/disk/resources/upload' # Функция для получения списка JPEG-файлов в папке def get_jpeg_files(folder_path): return [f for f in os.listdir(folder_path) if f.lower().endswith(('.jpg', '.jpeg'))] # Функция для загрузки файла на Яндекс Диск def upload_file_to_yandex(file_path, filename): # Получаем ссылку для загрузки headers = { 'Authorization': f'OAuth {TOKEN}' } params = { 'path': f'/{filename}', # путь на Яндекс Диске 'overwrite': 'true' # перезаписывать файл, если он уже существует } response = requests.get(YANDEX_DISK_URL, headers=headers, params=params) if response.status_code == 200: upload_url = response.json().get('href') # Загружаем файл with open(file_path, 'rb') as file: upload_response = requests.put(upload_url, files={'file': file}) return upload_response.status_code else: print(f"Ошибка получения URL для загрузки: {response.text}") return None # Основная логика def main(): jpeg_files = get_jpeg_files(folder_path) for index, filename in enumerate(jpeg_files): file_path = os.path.join(folder_path, filename) # Можно изменить имя файла перед загрузкой new_filename = f'photo_{index + 1}.jpg' # Форматируем новое имя файла upload_status = upload_file_to_yandex(file_path, new_filename) if upload_status == 201: print(f"Файл {filename} успешно загружен на Яндекс Диск как {new_filename}.") else: print(f"Не удалось загрузить файл {filename}. Код статуса: {upload_status}") if __name__ == '__main__': main() ``` ### Объяснение кода: - **get_jpeg_files:** Получает список всех файлов с расширениями `.jpg` и `.jpeg` из указанной папки. - **upload_file_to_yandex:** Выполняет загрузку файла на Яндекс Диск. Сначала получает ссылку для загрузки, а затем загружает файл по этой ссылке. - **main:** Объединяет все действия, загружая каждый файл в новой нумерации. Не забудьте установить библиотеку `requests`, если она у вас еще не установлена (`pip install requests`). Этот код даст вам основу для разработки вашего бота. Вы можете его адаптировать или расширять в зависимости от ваших требований.
Для реализации такой задачи вам нужно будет использовать API Яндекс.Диска и настроить обработку файлов с учетом их оригинальных имен.
Решение
Вот пример кода на Python для загрузки файлов с сохранением оригинальных имен:
Шаги:
Используем библиотеку requests для работы с API Яндекс.Диска.
Проверяем наличие файлов в локальной папке.
Загружаем файлы с их именами на Яндекс.Диск.
Пример кода:
import os
import requests
# Токен для доступа к Яндекс.Диску
YANDEX_DISK_TOKEN = "ваш_токен"
# Заголовки для авторизации
HEADERS = {
"Authorization": f"OAuth {YANDEX_DISK_TOKEN}"
}
# Функция для загрузки файла на Яндекс.Диск
def upload_to_yandex_disk(local_file_path, yandex_disk_path):
# Получение ссылки для загрузки
upload_url = " https://cloud-api.yandex.net/v1/disk/resources/upload "
params = {
"path": yandex_disk_path,
"overwrite": "true"
}
response = requests.get(upload_url, headers=HEADERS, params=params)
response.raise_for_status()
href = response.json().get("href")
if not href:
raise Exception("Не удалось получить ссылку для загрузки.")
# Загрузка файла
with open(local_file_path, "rb") as file:
upload_response = requests.put(href, files={"file": file})
upload_response.raise_for_status()
print(f"Файл {local_file_path} успешно загружен на {yandex_disk_path}")
# Проверяем папку с файлами и загружаем их
def upload_folder_to_yandex(local_folder, yandex_folder):
# Создаём папку на Яндекс.Диске, если она ещё не существует
create_folder_url = " https://cloud-api.yandex.net/v1/disk/resources "
requests.put(create_folder_url, headers=HEADERS, params={"path": yandex_folder})
# Перебираем файлы в локальной папке
for file_name in os.listdir(local_folder):
local_file_path = os.path.join(local_folder, file_name)
if os.path.isfile(local_file_path): # Проверяем, что это файл
yandex_disk_path = f"{yandex_folder}/{file_name}"
upload_to_yandex_disk(local_file_path, yandex_disk_path)
# Пример использования
if __name__ == "__main__":
LOCAL_FOLDER = "путь_к_вашей_папке" # Папка с фотографиями
YANDEX_FOLDER = "папка_на_Яндекс.Диске" # Папка на Яндекс.Диске
upload_folder_to_yandex(LOCAL_FOLDER, YANDEX_FOLDER)
Как использовать:
Создайте OAuth-токен:
Перейдите по ссылке и получите токен доступа.
Настройте параметры:
Укажите путь к локальной папке с фотографиями.
Укажите целевую папку на Яндекс.Диске.
Запустите скрипт:
Убедитесь, что у вас установлен requests: pip install requests.
Запустите код, и все файлы из папки будут загружены с их оригинальными именами.
Особенности:
Скрипт автоматически создаёт папку на Яндекс.Диске, если она отсутствует.
Поддерживает перезапись файлов при совпадении имен.