IFreedom.su & Bookhamster.ru Parser Exporter — FB2 & TXT

Парсер текста форматах FB2 и TXT с страницы сайта ifreedom.su и bookhamster.ru

作者
Идзуми Сэна
日安装量
0
总安装量
1
评分
0 0 1
版本
0.22
创建于
2025-10-05
更新于
2025-10-12
大小
28.3 KB
许可证
暂无
适用于

Назначение

Скрипт является универсальным парсером-экспортером для двух сайтов, публикующих новеллы (ранобэ): ifreedom.su и bookhamster.ru. Его основная задача — предоставить пользователю удобный инструмент для скачивания произведений в виде единого файла в форматах FB2 или TXT. Скрипт автоматизирует сбор метаданных и списка глав, загрузку их содержимого, очистку от посторонних элементов и интерактивную обработку CAPTCHA.


Ключевые функции

1. Архитектура на основе состояний (State Machine)

Скрипт управляется через конечный автомат с четко определенными состояниями (PRE_INIT, IDLE, COLLECTING, DOWNLOADING, STOPPED). Это позволяет реализовать надежную и предсказуемую логику работы, блокируя недопустимые действия в интерфейсе (например, запуск скачивания во время сбора глав) и предоставляя пользователю актуальную информацию о текущем процессе.

2. Универсальный сбор данных и метаданных

  • startInitialization(): Точка входа, которая определяет контекст страницы (главная страница произведения или страница отдельной главы). Если скрипт запущен на странице главы, он автоматически находит ссылку на главную страницу, загружает ее в фоне и использует для сбора полной информации.
  • gatherMetadata(doc): Функция интеллектуального парсинга метаданных. Она извлекает не только базовую информацию (название, автор, жанр), но и выполняет сложный анализ аннотации, которая на сайте скрыта внутри JavaScript-атрибута onclick. Скрипт извлекает этот HTML, очищает его и форматирует в корректные параграфы <p>.
  • collectChapters(doc): Гибкий сборщик списка глав. Он проверяет несколько возможных CSS-селекторов, чтобы найти список глав, поддерживая разные варианты верстки на сайтах (простые списки ссылок <a>, выпадающие списки <select>). Собранный список глав автоматически очищается от дубликатов и разворачивается в хронологическом порядке.

3. Кэширование и производительность

  • saveChaptersToCache() / loadChaptersFromCache(): Скрипт активно использует localStorage для кэширования списка глав. После первой инициализации на странице произведения полный список глав сохраняется локально. При последующих посещениях он загружается мгновенно, что значительно ускоряет работу и снижает нагрузку на сервер. Пользователю доступны кнопки для принудительного обновления и очистки кэша.

4. Интерактивная обработка CAPTCHA

  • handleCaptcha(url): При обнаружении страницы с CAPTCHA во время скачивания главы, процесс не прерывается с ошибкой. Вместо этого скрипт приостанавливает свою работу, открывает страницу с CAPTCHA в новой вкладке и отображает модальное окно с инструкцией для пользователя. После ручного решения CAPTCHA и нажатия кнопки "Продолжить", скрипт возобновляет работу, повторяя запрос к той же главе. Этот механизм реализован через Promise, что позволяет элегантно управлять асинхронной паузой.

5. Генерация файлов и сохранение

  • generateFb2(...): Формирует FB2-документ, соответствующий стандарту. Включает полную <description> секцию с жанром (преобразованным через mapGenreToFb2), автором, переводчиком, названием и аннотацией.
  • cleanChapterHTML(...): Производит тщательную очистку HTML-содержимого каждой главы, удаляя по списку селекторов рекламу, виджеты комментариев, навигацию и прочий "мусор".
  • Использование FileSaver.js: Для надежного сохранения файлов скрипт подключает внешнюю библиотеку FileSaver.js через директиву @require. Это обеспечивает кросс-браузерную совместимость функции сохранения файла.

Как использовать

  1. Откройте страницу произведения или любой его главы на сайте ifreedom.su или bookhamster.ru.
  2. Справа появится плавающая панель "Экспорт Ранобэ". Нажмите «Инициализировать».
  3. Скрипт соберет информацию о книге и список глав. При первом запуске это может занять несколько секунд, при последующих данные будут загружены из кэша.
  4. Выберите начальную и конечную главы в выпадающих списках.
  5. Настройте параметры (задержку, необходимость очистки текста).
  6. Нажмите «Скачать FB2» или «Скачать TXT».
  7. Если в процессе загрузки будет обнаружена CAPTCHA, откройте новую вкладку, решите её, вернитесь на исходную страницу и нажмите "Продолжить" в появившемся окне.
  8. По завершении процесса браузер предложит сохранить сгенерированный файл.

Особенности

  • Мульти-сайтовая поддержка: Код написан таким образом, чтобы адаптироваться к разной структуре DOM на двух целевых сайтах.
  • Продвинутый парсинг: Скрипт способен извлекать данные даже из нестандартных мест, таких как JavaScript-атрибуты, что говорит о глубоком анализе сайтов-целей.
  • Интерактивность и UX: Плавающая и перетаскиваемая панель, четкая система статусов и интерактивная обработка CAPTCHA делают использование скрипта интуитивно понятным и удобным.
  • Надежность: Использование внешних зависимостей (@require) для проверенных решений (как FileSaver.js) и наличие механизма остановки процесса повышают общую стабильность работы.
  • Асинхронность: Весь основной функционал построен на async/await, что обеспечивает плавную работу интерфейса без "зависаний" во время выполнения сетевых запросов.

Пример выходных данных (FB2)

Фрагмент сгенерированного FB2-файла:

<?xml version="1.0" encoding="utf-8"?>
<FictionBook xmlns="[http://www.gribuser.ru/xml/fictionbook/2.0](http://www.gribuser.ru/xml/fictionbook/2.0)" xmlns:xlink="[http://www.w3.org/1999/xlink](http://www.w3.org/1999/xlink)">
<description>
    <title-info>
        <genre>sf_fantasy</genre>
        <author><nickname>Имя Автора</nickname></author>
        <book-title>Название Произведения</book-title>
        <annotation><p>Первый абзац аннотации.</p>
<p>Второй абзац аннотации.</p></annotation>
        <lang>ru</lang>
    </title-info>
    <document-info>
        <author><nickname>Exporter Script</nickname></author>
        <program-used>UserScript v0.2</program-used>
        <date value="2025-10-12">2025-10-12</date>
        <id>bookhamster-1760123456789</id>
        <version>0.2</version>
    </document-info>
    <publish-info>
        <publisher>Имя Переводчика</publisher>
    </publish-info>
</description>
<body>
    <section><title><p>Глава 1: Начало</p></title></section>
    <section><title><p>Глава 2: Продолжение</p></title></section>
</body>
</FictionBook>