Created
February 13, 2024 15:15
-
-
Save andmerk93/a10ebe493a7c63be1704688ad075e59c to your computer and use it in GitHub Desktop.
Скрипт на Selenium + AutoIT, чтоб загрузить книжки fb2 в свою библитоеку Bookmate.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
Скрипт на Selenium + AutoIT, чтоб загрузить книжки fb2 | |
в свою библитоеку Bookmate. | |
Программа запускает существующую версию firefox, | |
где уже есть сохранненные логин и пароль, | |
пристегивает к ней geckodriver, а к нему Selenium. | |
При падении, завершает процессы, выжидает время, | |
и автоматически запускает заново. | |
''' | |
from datetime import datetime as dt | |
from subprocess import Popen | |
from sys import argv | |
import os | |
import time | |
import autoit | |
from selenium.webdriver import FirefoxOptions, Remote | |
from selenium.webdriver.common.by import By | |
from selenium.webdriver.support import expected_conditions as EC | |
from selenium.webdriver.support.wait import WebDriverWait | |
from selenium.common.exceptions import TimeoutException | |
def print_time(num): | |
''' | |
Печать в консоль порядкового номера книжки (файла) | |
и времени выполнения загрузки | |
''' | |
print(num, (dt.now() - start_time).seconds, 'sec') | |
def upload_files(driver, start, current): | |
''' | |
Функция загрузки файлов в профиль | |
Путь к папке с книжками захардкодил, | |
т.к. скрипт одноразовый | |
''' | |
start_dir = 'D:\\download\\downthemall\\' | |
book_list = os.listdir(start_dir)[start:] | |
count = 0 | |
print(f'{start=}') | |
for num, book in enumerate(book_list): | |
print_time(num + start) | |
print(book) | |
time.sleep(0.5) | |
WebDriverWait(driver, 1).until( | |
EC.visibility_of_element_located((By.CSS_SELECTOR, "div.upload-drop-zone")) | |
) | |
upload_button = driver.find_element(By.CSS_SELECTOR, "div.upload-drop-zone") | |
WebDriverWait(driver, 1).until(EC.element_to_be_clickable(upload_button)) | |
upload_button.click() | |
# Ниже имя окна загрузки для русской версии firefox | |
autoit.win_wait_active("Выгрузка файла") | |
autoit.control_send("Выгрузка файла", "Edit1", book) | |
autoit.control_send("Выгрузка файла", "Edit1", "{ENTER}") | |
count += 1 | |
if count == 5: | |
count = 0 | |
driver.find_elements(By.CSS_SELECTOR, "button[type='submit']")[1].click() | |
WebDriverWait(driver, 10).until(EC.url_changes('https://bookmate.ru/upload')) | |
driver.back() | |
current -= 1 | |
def runner(start, current): | |
''' | |
Функция запускает существующую версию firefox и geckodriver. | |
Пути захардкодил, т.к. скрипт одноразовый. | |
''' | |
firefox = Popen( | |
('C:\\Program Files\\Mozilla Firefox\\firefox.exe', '-start-debugger-server', '2828', '-marionette') | |
) | |
geckodriver = Popen( | |
('D:\\python\\geckodriver.exe', '--connect-existing', '--marionette-port', '2828') | |
) | |
driver = Remote( | |
command_executor='http://127.0.0.1:4444', | |
options=FirefoxOptions() | |
) | |
driver.get('https://bookmate.ru/upload') | |
try: | |
upload_files(driver, start, current) | |
except Exception: # TimeoutException: | |
# Лучше, конечно, разделить обратку ошибок | |
# Селениума и PyAutoIT, но я сделал "грязно", | |
# т.к. это одноразовый скрипт | |
geckodriver.terminate() | |
firefox.terminate() | |
print('Im fall :(') | |
time.sleep(900) | |
if __name__ == '__main__': | |
''' | |
На вход программа получает порядковый номер | |
последнего файла, об который "запнулась" | |
''' | |
time.sleep(0) | |
start_time = dt.now() | |
start = int(argv[1]) | |
current = int(argv[1]) | |
while current >= 1: | |
runner(start, current) | |
start = current + 5 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment