Добрый день. Я разрабатываю бота, который загружает фотографии, отправленные пользователями в 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 Яндекс.Диска и настроить обработку файлов с учетом их оригинальных имен. <br/> Решение <br/> <br/> Вот пример кода на Python для загрузки файлов с сохранением оригинальных имен: <br/> Шаги: <br/> <br/> Используем библиотеку requests для работы с API Яндекс.Диска. <br/> Проверяем наличие файлов в локальной папке. <br/> Загружаем файлы с их именами на Яндекс.Диск. <br/> <br/> Пример кода: <br/> <br/> import os <br/> import requests <br/> <br/> # Токен для доступа к Яндекс.Диску <br/> YANDEX_DISK_TOKEN = "ваш_токен" <br/> <br/> # Заголовки для авторизации <br/> HEADERS = { <br/> "Authorization": f"OAuth {YANDEX_DISK_TOKEN}" <br/> } <br/> <br/> # Функция для загрузки файла на Яндекс.Диск <br/> def upload_to_yandex_disk(local_file_path, yandex_disk_path): <br/> # Получение ссылки для загрузки <br/> upload_url = " <a href="https://cloud-api.yandex.net/v1/disk/resources/upload" rel="nofollow">https://cloud-api.yandex.net/v1/disk/resources/upload</a> " <br/> params = { <br/> "path": yandex_disk_path, <br/> "overwrite": "true" <br/> } <br/> response = requests.get(upload_url, headers=HEADERS, params=params) <br/> response.raise_for_status() <br/> <br/> href = response.json().get("href") <br/> if not href: <br/> raise Exception("Не удалось получить ссылку для загрузки.") <br/> <br/> # Загрузка файла <br/> with open(local_file_path, "rb") as file: <br/> upload_response = requests.put(href, files={"file": file}) <br/> upload_response.raise_for_status() <br/> <br/> print(f"Файл {local_file_path} успешно загружен на {yandex_disk_path}") <br/> <br/> # Проверяем папку с файлами и загружаем их <br/> def upload_folder_to_yandex(local_folder, yandex_folder): <br/> # Создаём папку на Яндекс.Диске, если она ещё не существует <br/> create_folder_url = " <a href="https://cloud-api.yandex.net/v1/disk/resources" rel="nofollow">https://cloud-api.yandex.net/v1/disk/resources</a> " <br/> requests.put(create_folder_url, headers=HEADERS, params={"path": yandex_folder}) <br/> <br/> # Перебираем файлы в локальной папке <br/> for file_name in os.listdir(local_folder): <br/> local_file_path = os.path.join(local_folder, file_name) <br/> if os.path.isfile(local_file_path): # Проверяем, что это файл <br/> yandex_disk_path = f"{yandex_folder}/{file_name}" <br/> upload_to_yandex_disk(local_file_path, yandex_disk_path) <br/> <br/> # Пример использования <br/> if __name__ == "__main__": <br/> LOCAL_FOLDER = "путь_к_вашей_папке" # Папка с фотографиями <br/> YANDEX_FOLDER = "папка_на_Яндекс.Диске" # Папка на Яндекс.Диске <br/> <br/> upload_folder_to_yandex(LOCAL_FOLDER, YANDEX_FOLDER) <br/> <br/> Как использовать: <br/> <br/> Создайте OAuth-токен: <br/> Перейдите по <a href="https://oauth.yandex.ru/" rel="nofollow">ссылке</a> и получите токен доступа. <br/> <br/> Настройте параметры: <br/> Укажите путь к локальной папке с фотографиями. <br/> Укажите целевую папку на Яндекс.Диске. <br/> <br/> Запустите скрипт: <br/> Убедитесь, что у вас установлен requests: pip install requests. <br/> Запустите код, и все файлы из папки будут загружены с их оригинальными именами. <br/> <br/> Особенности: <br/> <br/> Скрипт автоматически создаёт папку на Яндекс.Диске, если она отсутствует. <br/> Поддерживает перезапись файлов при совпадении имен.