/
woods301
/
final
Обзор
Документация
Войти
/
woods301
/
final
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
main
final.py
164 строки
5 KB
Semen Kopylov
added files
14 ноя 2025, 19:22
14 ноя 2025, 19:22
3442cf8
Код
Авторство
О чём код?
import json import time from http import HTTPStatus import requests from tqdm import tqdm YANDEX_TOKEN = 'YOUR_YANDEX_DISK_TOKEN' BREED = 'hound' REQUEST_TIMEOUT = (5, 10) # (connect timeout, read timeout) class YandexDiskUploader: def __init__(self, token): self.token = token self.base_url = 'https://cloud-api.yandex.net/v1/disk' self.headers = { 'Authorization': f'OAuth {token}', 'Content-Type': 'application/json' } def create_folder(self, path): url = f'{self.base_url}/resources' params = {'path': path} response = requests.put( url, headers=self.headers, params=params, timeout=REQUEST_TIMEOUT ) if response.status_code == HTTPStatus.CREATED: print(f'Папка "{path}" создана') return True elif response.status_code == HTTPStatus.CONFLICT: print(f'Папка "{path}" уже существует') return True else: print(f'Ошибка создания папки: {response.json()}') return False def upload_by_url(self, file_url, disk_path): url = f'{self.base_url}/resources/upload' params = { 'path': disk_path, 'url': file_url } response = requests.post( url, headers=self.headers, params=params, timeout=REQUEST_TIMEOUT ) if response.status_code == HTTPStatus.ACCEPTED: return self._get_file_info(disk_path) else: print(f'Ошибка загрузки {disk_path}: {response.json()}') return None def _get_file_info(self, disk_path): time.sleep(2) url = f'{self.base_url}/resources' params = {'path': disk_path} response = requests.get( url, headers=self.headers, params=params, timeout=REQUEST_TIMEOUT ) if response.status_code == HTTPStatus.OK: data = response.json() return { 'name': data.get('name'), 'size': data.get('size', 0), 'path': disk_path } return None class DogImageDownloader: def __init__(self): self.base_url = 'https://dog.ceo/api' def get_sub_breeds(self, breed): url = f'{self.base_url}/breed/{breed}/list' response = requests.get(url, timeout=REQUEST_TIMEOUT) if response.status_code == HTTPStatus.OK: data = response.json() return data.get('message', []) return [] def get_random_image(self, breed, sub_breed=None): if sub_breed: url = f'{self.base_url}/breed/{breed}/{sub_breed}/images/random' else: url = f'{self.base_url}/breed/{breed}/images/random' response = requests.get(url, timeout=REQUEST_TIMEOUT) if response.status_code == HTTPStatus.OK: data = response.json() return data.get('message') return None def main(): dog_api = DogImageDownloader() yd_uploader = YandexDiskUploader(YANDEX_TOKEN) sub_breeds = dog_api.get_sub_breeds(BREED) folder_name = BREED if not yd_uploader.create_folder(folder_name): print('Не удалось создать папку. Выход.') return uploaded_files = [] if sub_breeds: print(f'Найдено под-пород: {len(sub_breeds)}') for sub_breed in tqdm(sub_breeds, desc='Загрузка изображений'): image_url = dog_api.get_random_image(BREED, sub_breed) if image_url: image_name = image_url.split('/')[-1] file_name = f'{BREED}-{image_name}' disk_path = f'{folder_name}/{file_name}' file_info = yd_uploader.upload_by_url(image_url, disk_path) if file_info: uploaded_files.append(file_info) else: print(f'Под-породы не найдены. Загружаем одну картинку породы {BREED}') image_url = dog_api.get_random_image(BREED) if image_url: image_name = image_url.split('/')[-1] file_name = f'{BREED}-{image_name}' disk_path = f'{folder_name}/{file_name}' file_info = yd_uploader.upload_by_url(image_url, disk_path) if file_info: uploaded_files.append(file_info) with open('uploaded_files.json', 'w', encoding='utf-8') as f: json.dump(uploaded_files, f, indent=2, ensure_ascii=False) print(f'\nЗагружено файлов: {len(uploaded_files)}') print('Информация сохранена в uploaded_files.json') if __name__ == '__main__': main()