Skip to content

Instantly share code, notes, and snippets.

@andmerk93
Created February 13, 2024 15:15
Show Gist options
  • Save andmerk93/a10ebe493a7c63be1704688ad075e59c to your computer and use it in GitHub Desktop.
Save andmerk93/a10ebe493a7c63be1704688ad075e59c to your computer and use it in GitHub Desktop.
Скрипт на Selenium + AutoIT, чтоб загрузить книжки fb2 в свою библитоеку Bookmate.
'''
Скрипт на 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