Парсер Royal Road — FB2 & TXT

Извлекает главы с royalroad.com и сохраняет их в FB2 или TXT

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

Назначение

Скрипт предназначен для сбора и сохранения произведений (fiction) с литературного портала royalroad.com. Он встраивает на страницу кастомный пользовательский интерфейс, который позволяет пользователю выбрать диапазон глав, загрузить их содержимое и скомпилировать в единый файл для офлайн-чтения в форматах FB2 (FictionBook) или TXT (простой текст).

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

  1. Инициализация и кэширование (initialize):

    • При первом запуске на странице произведения скрипт выполняет асинхронную инициализацию:
      • Загружает основную страницу произведения для получения метаданных.
      • Вызывает функцию parseBookInfo для извлечения информации: название, автор, аннотация, жанры и, что особенно важно, полный список глав.
    • Кэширование: Полученные метаданные и список глав сохраняются в хранилище UserScript (GM_setValue), используя URL произведения в качестве ключа. При последующих посещениях этой же страницы данные мгновенно загружаются из кэша (GM_getValue), что значительно ускоряет работу и снижает количество сетевых запросов. Предусмотрены кнопки для принудительного обновления и полной очистки кэша.
  2. Парсинг данных (parseBookInfo, parseChaptersFromScript):

    • Метаданные: Скрипт использует CSS-селекторы для извлечения названия, автора и жанров со страницы. Аннотация дополнительно обрабатывается функцией cleanAnnotationHtml для удаления лишних тегов и атрибутов.
    • Список глав: Ключевой особенностью является метод получения списка глав. Вместо парсинга HTML-таблицы, скрипт находит на странице встроенный тег <script>, содержащий JavaScript-объект window.chapters. С помощью регулярного выражения из этого объекта извлекается JSON-массив со всеми главами, их названиями и URL. Этот подход является чрезвычайно эффективным и надежным.
  3. Обработка и сбор глав (processChapters):

    • Это основной асинхронный цикл, который запускается после нажатия кнопки "Скачать".
    • Он последовательно загружает HTML-код каждой главы из выбранного диапазона с помощью GM_xmlhttpRequest.
    • Очистка контента: Для каждой главы содержимое элемента div.chapter-content проходит тщательную очистку функцией cleanupHtml. Эта функция удаляет все ненужные элементы (рекламу, навигацию, комментарии, заметки автора), а также "разворачивает" теги <span> и удаляет лишние атрибуты (class, id, style), оставляя только чистое форматирование (теги <p>).
  4. Генерация файлов (generateFb2, generateTxt):

    • FB2: После сбора всех глав скрипт формирует валидный XML-документ формата FictionBook 2.0. Он корректно заполняет секцию <description> метаданными (название, автор, жанры, аннотация) и формирует тело книги (<body>), где каждая глава представлена в виде отдельной секции (<section>).
    • TXT: Создает простой текстовый файл, где текст каждой главы предваряется ее названием и отделяется от следующей главы разделителем.
  5. Пользовательский интерфейс (UI) и управление состоянием:

    • Скрипт добавляет на страницу перемещаемую панель управления (makeDraggable).
    • Используется простая машина состояний (State Machine) для управления логикой работы. В зависимости от текущего состояния (например, IDLE, PROCESSING, GENERATING), элементы интерфейса (кнопки, селекторы) автоматически блокируются или разблокируются, а пользователю выводится актуальная информация о ходе процесса.

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

  1. Установите скрипт в Violentmonkey или аналогичный менеджер.
  2. Перейдите на любую страницу произведения на сайте royalroad.com (например, https://www.royalroad.com/fiction/12345/some-title).
  3. В правом верхнем углу появится панель управления скриптом.
  4. Нажмите кнопку "Инициализировать". Скрипт загрузит информацию о книге и список глав.
  5. Выберите начальную и конечную главы в выпадающих списках. При желании настройте задержку между загрузками.
  6. Нажмите "Скачать FB2" или "Скачать TXT".
  7. Дождитесь завершения процесса, отслеживая его по индикатору выполнения.
  8. Браузер автоматически предложит сохранить сгенерированный файл.

Особенности

  • Эффективный парсинг глав: Использование встроенного в страницу объекта window.chapters для получения списка глав является главным техническим преимуществом. Это избавляет от необходимости постраничной загрузки и парсинга таблицы, делая инициализацию почти мгновенной.
  • Надежная очистка HTML: Функция cleanupHtml использует четкий список селекторов для удаления всех посторонних элементов, что обеспечивает высокое качество и чистоту итогового файла, свободного от "мусора".
  • Управление состоянием: Применение конечного автомата делает поведение UI предсказуемым и информирует пользователя о каждом этапе процесса, предотвращая ошибочные действия.
  • Кэширование: Использование GM_* API для сохранения данных о книге между сессиями — отличная практика, которая повышает удобство использования скрипта для часто скачиваемых произведений.
  • Адаптивность: Скрипт определяет базовый URL произведения и работает корректно, даже если пользователь находится на странице конкретной главы, а не на главной странице книги.

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

Фрагмент структуры генерируемого 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:l="[http://www.w3.org/1999/xlink](http://www.w3.org/1999/xlink)">
<description>
    <title-info>
        <genre>fantasy</genre>
        <genre>adventure</genre>
        <author><nickname>Some Author</nickname></author>
        <book-title>Title of The Book</book-title>
        <annotation><p>The annotation text goes here, properly formatted.</p></annotation>
        <lang>en</lang>
    </title-info>
    <document-info>
        <date value="2025-10-14">2025-10-14</date>
        <version>0.1</version>
    </document-info>
</description>
<body>
    <section>
        <title><p>Chapter 1: The Beginning</p></title>
        <p>First paragraph of the chapter.</p>
        <p>Second paragraph of the chapter.</p>
    </section>
    <section>
        <title><p>Chapter 2: A New Path</p></title>
        <p>Content of the second chapter...</p>
    </section>
</body>
</FictionBook>

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址