Как можно загрузить фотографии с разными названиями на Яндекс Диск?

Добрый день. Я разрабатываю бота, который загружает фотографии, отправленные пользователями в Telegram, на Яндекс Диск. Сначала фотографии сохраняются в папку на ПК, а затем загружаются на Яндекс. Проблема в том, что изображения имеют разные названия, и для их загрузки требуется указать точный путь и имя файла. Как мне реализовать возможность, чтобы бот проверял файлы в папке и автоматически загружал все JPEG-файлы на Яндекс? Либо как можно изменить имена файлов в папке, чтобы бот мог подставлять их в путь загрузки?
  • 26 декабря 2024 г. 21:23
Ответы на вопрос 2
Здравствуйте! Для того чтобы ваш бот мог автоматически загружать все 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.
Запустите код, и все файлы из папки будут загружены с их оригинальными именами.

Особенности:

Скрипт автоматически создаёт папку на Яндекс.Диске, если она отсутствует.
Поддерживает перезапись файлов при совпадении имен.
Похожие вопросы