@F3ANG

Как скачать файлы по ссылке в облаке Mega, не переходя по ней?

Хочу разработать софт, который будет скачивать файлы по ссылке в облаке Mega, проверять что это за файл (видео или картинка) и сортировать по соответствующим папкам.

Сортировку кое-как (но я думаю, что это очень плохо) реализовал, а вот со скачиванием не могу разобраться.
Хотел сделать через библиотеку requests, но там, так скажем, идентификатор директории, которую я хочу скачать - случайный набор символов (хэш-функция?) которая с каждым запросом меняется. Поэтому я не смог реализовать через requests (хотя очень хотелось!).

Пришлось, опять же, в виду малого опыта, обратиться к selenium, но даже там у меня возникли проблемы...

Смог дойти до нужной кнопки на скачивание zip-архива, но как сказать selenium`у ждать, пока файл не скачается?
В противном случае, он сразу закрывает окно, а ставить time.sleep - мягко говоря, нерационально.

Части кода отдельно, пока не пойму как реализовать первую - со второй не свяжу. Там надо будет делать через os проверку на добавление последних файлах в 'Загрузки', разархивировать ее и т.д., но концепция, я думаю, понятна.
import time
import os
import shutil
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

### Часть 1
"""Добываем папку с файлами по ссылке """
###

options = webdriver.ChromeOptions()
options.add_argument("user-agent=Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:84.0) Gecko/20100101 Firefox/84.0")
options.add_argument('--disable-blink-features=AutomationControlled')

driver = webdriver.Chrome(
    executable_path=r'C:\Users\Lenovo PC\Desktop\mega_project\chromedriver.exe',
    options=options
    )
driver.implicitly_wait(20)

link = 'https://mega.nz/folder/guRwWAKB#ws2Yma9ZLni7AueouzgZkg'

try:
  driver.get(link)
  folder = WebDriverWait(driver, 15).until(
        EC.element_to_be_clickable((By.CLASS_NAME, 'nw-fm-tree-folder'))
    )
  ActionChains(driver).context_click(folder).perform()
  download_button = driver.find_element(By.CSS_SELECTOR, '.dropdown-item.download-item.contains-submenu.sprite-fm-mono-after.icon-arrow-right-after')
  ActionChains(driver).move_to_element(download_button).perform()
  zip_button = driver.find_element(By.CSS_SELECTOR, '.dropdown.body.submenu.download.active i.sprite-fm-mono.icon-download-zip')
  zip_button.click()
  # ???
except:
  pass

### Часть 2
"""Парсим папку"""
###

# Путь до папки, которую будем парсить
path = r'C:\Users\Lenovo PC\Desktop\Тест'

# Путь до папки, в которую будем сохранять
path_to_save = r'C:\Users\Lenovo PC\Desktop\result'

# Форматы видео и картинок, по которым будет происходить сортировка
video_formats = ['.mp3', '.mp4', '.mov']
image_formats = ['.png', '.jpeg', '.jpg', '.heic']


def create_folders(path):
  '''Создает поддиректории в path_to_save, если их еще нет и возвращает пути до поддиректорий'''
  video_path = path+'\\video'
  image_path = path+'\\image'
  if not os.path.isdir(video_path):
    os.mkdir(video_path)
  if not os.path.isdir(image_path):
    os.mkdir(image_path)
  return video_path, image_path

def path_search(path, video_path, image_path, level=1):
  '''Парсит указанную папку'''
  print(f'Level: {level} | Content: {os.listdir(path)}')
  for i in os.listdir(path):
    '''Проходится по всем элементам в директории'''
    if os.path.isdir(path+'\\'+i):
      '''Если элемент-поддиректория, функция вызывается рекурсивно для данной поддиректории'''
      print(f'Спускаемся', path+'\\' + i)
      path_search(path+'\\'+ i, video_path, image_path, level+1)
    elif os.path.isfile(path+'\\'+i):
      '''Проверяет что за файл видео или картинка и смотрит, есть ли уже этот файл в папке назначения'''
      if any(filter(lambda x: i.endswith(x), video_formats)) and not os.path.exists(video_path + '\\' + i):
        shutil.move(path + '\\' + i, video_path)
        print(f'Файл {i} перемещен в {video_path}')
      elif any(filter(lambda x: i.endswith(x), image_formats)) and not os.path.exists(image_path + '\\' + i):
        shutil.move(path + '\\' + i, image_path)
        print(f'Файл {i} перемещен в {image_path}')


video_path, image_path = create_folders(path_to_save)
path_search(path, video_path, image_path)
  • Вопрос задан
  • 136 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы