• Stars
    star
    291
  • Rank 142,563 (Top 3 %)
  • Language
    Python
  • License
    Other
  • Created about 3 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

🍭 epub generator for (light)novels (轻)小说 epub 生成器,支持站点:轻之国度、轻小说文库

Introduction

本工具用于基于轻之国度网页或 app 生成epub小说。

Update [2022/01/20]: 现已升级成为轻小说 epub 生成框架,支持更多网站(当年名字取得好啊!)

Update [2023/09/08 (EST)]: 呃呃 LK 加了 Cloudflare 反爬,直接下载是寄了,但是还可以通过保存 html 然后指定 --lk-html-dump 参数来解决问题。

注意:本工具仅作学习交流使用,作者不对内容和使用情况付任何责任!

本来就是一个面向过程的小工具,怎么越发繁琐起来了。。。这里还要感慨一下LK牛逼的防御技术

Supported Sites Overview

站点 单页 合集 详细说明
轻之国度 说明
轻之国度 App 说明
轻小说文库 说明

Requirements

  • python 3.5 +
  • click
  • beautifulsoup4
  • requests
  • ebooklib
  • uiautomator2
  • dominate
  • opencc
  • opencv
  • js2py

Usage Overview

下载命令:

python3 cli.py download <options> <url>

下面是我写的 --help:

$ python3 cli.py download --help
Usage: cli.py download [OPTIONS] URL

  download the light novel

  ARGUMENTS:

  * URL: url of light novel to download

Options:
  --dump-path PATH                directory for dumping files and caches      
  --title TEXT                    title of light novel
  --authors TEXT                  authors' names, separated by comma (,)      
  --identifier TEXT               identifier of light novel
  --cover-link TEXT               cover link of light novel. cover link can   
                                  either be web link or file path. if it is   
                                  not beginned with "http", it would be       
                                  recognized as file path. if nothing was     
                                  given, then it will use the first picture of
                                  webpage.
  --cvt TEXT                      OpenCC conversion configuration, used to    
                                  convert between different Chinese
                                  characters. you can choose the value from
                                  "s2t", "t2s", "s2tw", "tw2s", "s2hk",
                                  "hk2s", "s2twp", "tw2sp", "t2tw", "hk2t",
                                  "t2hk", "t2jp", "jp2t", "tw2t". if nothing
                                  is provided, no conversion would be
                                  performed. for more information, please
                                  visit: https://github.com/BYVoid/OpenCC
  --path PATH                     directory for saving the light novel
  --lk-html-dump PATH             (lightnovel.us) html content dump file path
  --wenku8-volume INTEGER         (wenku8.net) identify the index of the
                                  volume to generate. -1 means every volume,
                                  which is also the default option. index
                                  starts from 1.
  --lk-mobile-top-area-height INTEGER
                                  (lk mobile) the height of the top area
  --lk-mobile-bottom-area-height INTEGER
                                  (lk mobile) the height of the bottom area
  --lk-mobile-image-equal-threshold INTEGER
                                  (lk mobile) the threshold of judging whether
                                  two images are equal
  --lk-mobile-safe-area-padding INTEGER
                                  (lk mobile) the padding of the safe area
  --lk-mobile-vert-dump PATH      (lk mobile) vertical content dump file path
  --lk-mobile-horz-dump PATH      (lk mobile) horizontal content dump file
                                  path
  --lk-mobile-html-dump PATH      (lk mobile) html content dump file path
  --lk-mobile-conflict-mode BOOLEAN
                                  (lk mobile) whether to resolve conflict
                                  manually
  --lk-mobile-ignore-newline BOOLEAN
                                  (lk mobile) whether to ignore newline
  --help                          Show this message and exit.

注意:

  • 书籍有关的 options 可以直接忽略,因为执行命令后如果发现没有 options 会进行第二轮询问。
  • dump-path 是指缓存以及其他的临时文件的输出位置,若提示找不到路径,创建即可
  • 针对每个网站,可能有自己的 options,具体可以参见 help 和下一小节

Usage

轻之国度

Options

  --lk-html-dump PATH             (lightnovel.us) html content dump file path

高权限文章

有部分文章会 先显示无权限观看,后可以观看 先显示无权限观看,后可以观看。这种情况下,浏览器保存 HTML,然后启用 --lk-html-dump 选项即可。

缓存相关

  • 单页面
    • 会缓存 HTML,每下载一张图片后会用本地路径替换掉 HTML 中的链接
  • 合集
    • 每篇文章都会像单页面一样进行缓存
情形 加载命令 描述 文件格式 文件名规范
单文章 --lk-html-dump 文章内容 HTML <timestamp>.html
合集内文章 无,但会检查 dump-path 内是否存在 文章内容 HTML <article-id>.html

轻之国度 App

Options

由于没有 URL,所以在这种情况下 url 参数应指定为 lk-mobile,并打开需要处理的页面。

  --lk-mobile-top-area-height INTEGER
                                  (lk mobile) the height of the top area
  --lk-mobile-bottom-area-height INTEGER
                                  (lk mobile) the height of the bottom area
  --lk-mobile-image-equal-threshold INTEGER
                                  (lk mobile) the threshold of judging whether
                                  two images are equal
  --lk-mobile-safe-area-padding INTEGER
                                  (lk mobile) the padding of the safe area
  --lk-mobile-vert-dump PATH      (lk mobile) vertical content dump file path
  --lk-mobile-horz-dump PATH      (lk mobile) horizontal content dump file
                                  path
  --lk-mobile-html-dump PATH      (lk mobile) html content dump file path
  --lk-mobile-conflict-mode BOOLEAN
                                  (lk mobile) whether to resolve conflict
                                  manually
  --lk-mobile-ignore-newline BOOLEAN
                                  (lk mobile) whether to ignore newline

Prerequisite

首先,不管是模拟器还是真机,都需要开启 ADB。现在的代码只适用于只有一个 ADB 设备的情况,如果有需求,请自行修改 provider/lk_mobile.py

TODO:

  • 日后为这块增加命令行参数

Background

对 app 模拟手的滚动操作,同时获取元素,最后生成 epub。

注意到:客户端非常恶心,每一行文本都是一个 View,所以我采用了 Portrait 和 Landscape 扫两遍,然后双指针 Merge 的思路来进行对抗,效果喜人。

界面布局相关参数

  • --lk-mobile-top-area-height: 设备最顶端到导航栏的高度
  • --lk-mobile-bottom-area-height: 设备下方评论栏的高度
  • 上面两个参数默认值为分辨率是 Nox 模拟器 3840 * 2160 的情况
  • 其余的可以保持默认,有兴趣可以研究

旋转相关

  • 最开始进入页面之前屏幕应为 Portrait 状态,命令行会要求用户确认
  • Portrait 扫描完成之后,设备会自动进入 Landscape 状态,但是需要用户退出界面并重新进入,原因是需要 Layout 重新加载。这一步同样会要求用户确认
  • 由于图片的获取是通过截图,所以建议将分辨率调高
  • 由于整个过程耗时长,可能出现意外状况,故有若干 dump 命令。--vert-dump 可以加载之前操作获取的 Portrait (Vertical) 数据,--horz-dump 可以加载之前操作获取的 Landscape (Horizontal) 数据,--html-dump 可以加载之前导出的 html 数据

合并模式相关

--lk-mobile-new-line--lk-mobile-conflict-mode这两个参数的诞生和排版有着密切的关系。举个简单的例子:

这是一前半段没有加粗的文字这是中间加粗的文字这是最后没有加粗的文字

如果上面这段话在同一行里,那么会解析成:

[
	"这是一前半段没有加粗的文字\n这是中间加粗的文字\n这是最后没有加粗的文字"
]

但是,如果排版变成了:

这是一前半段没有加粗的文字这是中间加粗的文字
这是最后没有加粗的文字

就会解析成:

[
	"这是一前半段没有加粗的文字\n这是中间加粗的文字", 
	"这是最后没有加粗的文字"
]

可以发现有一个 \n 就这样凭空消失了。这就会导致一个问题:双指针扫描匹配的时候永远无法找到同样的文字内容。为了解决这个问题,我引入了两个方案:

  1. --lk-mobile-ignore-newline: 将文中所有出现的 \n 全部忽略,效果很好。但是同时,我们也丧失了知道哪里有排版的机会。
  2. --lk-mobile-conflict-mode: 程序最初的版本如果遇到图片但是文字还没有合并,会直接报错。如果加上了 --lk-mobile-conflict-mode True 就会在这个情况下让用户选择选择 Landscape 还是 Portrait 的版本。以后可能还会加上让用户手动输入的选项。

Mumu 模拟器点击位置不正确解决方案

Mumu 模拟器点击可能错位,如下图所示:

这种情况下只需在设置中交换长、宽数值即可,让宽大于长。

缓存相关

上面已经提到,由于整过过程耗时很长,所以在获取完 Landscape 和 Portrait 数据后会分别写入到文件,两组数据合并完成后也会写入到 Html。

情形 加载命令 描述 文件格式 文件名规范
单文章 --lk-mobile-vert-dump 获取到的 Portrait 数据 Pickle 二进制数据 <timestamp>.out
单文章 --lk-mobile-horz-dump 获取到的 Landscape 数据 Pickle 二进制数据 <timestamp>.out
单文章 --lk-mobile-html-dump 合并后的数据 HTML <timestamp>.html

轻小说文库

Options

  --wenku8-volume INTEGER         (wenku8.net) identify the index of the
                                  volume to generate. -1 means every volume,
                                  which is also the default option. index
                                  starts from 1.

缓存相关

情形 加载命令 描述 文件格式 文件名规范
合集内文章 无,但会检查 dump-path 内是否存在 文章内容 HTML <article-id>.html

指定卷数

在轻小说文库的总览页面,一般以:卷 => 章 作为导航。而小说生成一般以卷为主。所以我们提供了指定卷数的选项:--wenku8-volume,来指定某一卷。若需要一并生成,参数为 -1 或保持默认。

Known Issues

  • 轻之国度
    • 【已解决,见上】对于部分 先显示无权限观看后可以观看 的文章无效,以后可能会写浏览器模式
  • 轻之国度 App
    • HTML 排版无法获取
    • 【已解决】 排版问题可能导致 Lanscape / Portrait 信息无法 Merge,如果遇到这种情况,找到任意一个 Case 的 dump 文件 (这里记作 dump-file),并加上命令行参数:--vert-dump <dump-file> --horz-dump <dump-file>

TODO

  • 图片下载至临时路径
  • 用 PyQt 写 GUI (基本上是不可能了,完全不想写,而且也没有意义)
  • 为漫画提供更好的支持
  • 增加更多 metadata : tags, publisher, ...
  • 自动抓取标题
  • 自动生成目录,如果网页上有 headers 的话
  • 添加自定义 CSS / 字体 等支持
  • 简繁自动转换
  • 模拟轻国手机版
  • 增加移动端截屏图片压缩选项
  • 目录多重嵌套
  • 增加移动端 ADB 参数

相关帖子:

Contribution

  1. provider 文件夹中新建文件,最主要实现两个方法:
    • get_contents(url, dump_path) 用来获取信息。返回值可以是 strlistlist 内的数据均为 {'title': title, 'content': content}
    • get_cover(link, dump_path) 用来获取封面。之所以有这个是因为某些站有特殊的 http header,我不说是谁
    • 可以额外设计一些 options,写明即可
  2. cli.py 内接入即可

LICENSE

  • lightnovel.py, cli.py 使用 AGPL License 授权(ebooklib 使用该协议)
  • 项目内的其他文件使用 MIT License 进行授权

技术分析

以前写好了舍不得删掉所以再开一个板块,下面基本都是废话

原理概览

直接抓取 HTML,然后将其中的图片下载至本地,随后打包成 EPUB。

EPUB 内部目录:

.
├── Images               # 图片
│   ├── ...
│   └── ...
└── Text                 # 文本
    ├── about.xhtml      # 本项目自动生成
    └── lightnovel.xhtml # 轻小说正文

对于合集文章:

.
├── Images               # 图片
│   ├── ...
│   └── ...
└── Text                 # 文本
    ├── about.xhtml      # 本项目自动生成
    ├── Section1.xhtml   # P1
    ├── Section2.xhtml   # P2
    └── ...

TODO:

  • 日后可能会支持多重嵌套

轻之国度网页版 合集文章

对于合集文章,解析的过程比较有趣,这里讨论一下。

首先是对 HTML 的分析。

很遗憾,并不是 <a> 也没有 href。去 Source 里一看,貌似框架选的是 Vue,不熟悉前端,不多做评价。

接着查看 event,发现是混淆过的 js,放弃逆向。

经观察,数据应该在文档最后的某个 <script> 标签内:

经过分析,这个 <script> 只暴露了一个接口:

window.__NUXT__ = (function(...) { ... }) (...)

故我们只需要 evaluate 这个脚本,然后获取 window.__NUXT__ 的值即可。

More Repositories

1

YuzuMarker.FontDetection

✨ 首个CJK(中日韩)字体识别以及样式提取模型 YuzuMarker的字体识别模型与实现 / First-ever CJK (Chinese Japanese Korean) Font Recognition and Style Extractor, side project of YuzuMarker
Python
433
star
2

YuzuMarker

🍋 [WIP] Manga Translation Tool
C#
99
star
3

Ayase

🥥 Control everything by keyboard.
C#
66
star
4

VSCode-LaTeX-Snippets

🛠 A VSCode extension, includes useful snippets and tools for LaTeX.
JavaScript
39
star
5

dayone2markdown

📔 Day One diary entries to markdown files
Python
37
star
6

mikanani-proxy

蜜柑计划轻量级代理服务 - Lightweight proxy server for https://mikanani.me
Python
31
star
7

DungeonAssistant

WiFi RSSI Based Indoor Localization System
Python
31
star
8

cloudflare-dynamic-best

Automatically select the best Cloudflare IP for your Cloudflare DNS record
Rust
28
star
9

clash-multi-mixin

🚀 让 Clash 的 Mixin 同时对多个飞机场适配
JavaScript
21
star
10

calibre-web-bgm

🧩 calibre-web bangumi 元数据插件
Python
19
star
11

concrete-math

📐 具体数学读书笔记
C++
17
star
12

yolo-v1-pytorch

⚗ YOLO v1 PyTorch Implementation
Jupyter Notebook
17
star
13

MahiruLauncher

🍢 Cross-platform modular launcher
C#
16
star
14

BaiduTongjiExporter

💹 百度统计数据导出脚本
Python
12
star
15

typexo-cli

📝 A Hexo-like cli tool for Typecho Blogs, used for blog writing.
Python
9
star
16

yolo-v2-pytorch

⚗ YOLO v2 PyTorch Implementation
Python
9
star
17

stick-fight-auto

⚔ Stick Fight 自动瞄准
Python
8
star
18

typexo-server

🛠 A Hexo-like server tool for Typecho Blogs. Personal backend blog engine.
Python
5
star
19

akasaka

Dynamic mutiprocess preprocessing task loader and dispatcher
Python
5
star
20

VSCode-Hexo-Next-Snippets

🛠 A VSCode extension, includes some snippets for the theme *Next* for blog *Hexo*
JavaScript
5
star
21

mirror-toolbox

🎥 网课镜像工具箱
Python
4
star
22

alchemist-helper

🧪 Colab Kaggle 极市平台 快速白嫖部署脚本
Python
4
star
23

YuzuMarker.Photoshop

🍹 [WIP] YuzuMarker 配套 Photoshop 插件
JavaScript
4
star
24

remote-lamp-switch

💡 远程开关电容开关灯解决方案
C#
4
star
25

CloudflareDDNS

DDNS service for Cloudflare
Python
4
star
26

esxi-pci-passthrough-auto-enable

Solve the problem that the PCI passthrough deactivates after reboot, also hard to reset due to UI flickering
Shell
4
star
27

BFTGym

[VLDB'24] BFTGym: An Interactive Playground for BFT Protocols
4
star
28

DesktopSwitcher

🖥 A desktop switching tool for OSX.
Swift
3
star
29

FRC-Scouting-6487

[GY] A Scouting app built for FRC Robotics Competition.
C#
3
star
30

BFTBrain

[NSDI'25] BFTBrain: Adaptive BFT Consensus with Reinforcement Learning, [VLDB'24] BFTGym: An Interactive Playground for BFT Protocols
Java
3
star
31

gdrive-integrity-checker

⛅ File integrity checker for google drive using scripts in Colab
Jupyter Notebook
3
star
32

KirinShiKi

✨ A Typecho plugin based on the blog of Jindai Kirin and theme *handsome*. 基于handsome主题的神代綺凜式魔改主题
CSS
3
star
33

gyrojeff.top

📁 Source of my blog - gyrojeff.top, maintained by typexo.
3
star
34

ti-chem-calc

🧮 Molecular mass calculating program for TI calculators.
Lua
3
star
35

DanDanPlayForiOS

🎞 DanDanPlay for iOS (Unofficial version), an anime watching client with danmaku. The original repo is no longer in maintenance. 弹弹play iOS版, 非官方维护及更新 (原作者已不再维护)
Objective-C
3
star
36

windows-config-script

♻ 重装后的一键配置
PowerShell
2
star
37

Max4Min

🍡 Maximize windows in a way easy for minimize
C#
2
star
38

BaiduTongjiAPI

💹 Pypi 百度统计 API 封装
Python
2
star
39

hexo-cnblogs-sync

🗃 Sync the blogs in Hexo (Next theme) to cnblogs.
HTML
2
star
40

yolo-v3-pytorch

⚗ YOLO v3 PyTorch Implementation
Python
2
star
41

CloudflareDDNS-WPF

C# Version for Cloudflare DDNS software (same function as the py ver. written a few weeks ago)
C#
2
star
42

WiFiSignalCapturer

Java
2
star
43

csapp-3e

📔 CS:APP Notes & Homework 深入理解计算机系统笔记
C
1
star
44

ylgy-recognition

🐑 羊了个羊识别
Python
1
star
45

YuzuMarker.MangaDataset

Python
1
star
46

cloudlab-api

Forked version of cloudlab-api with some bugs fixed
Python
1
star
47

TorchLearning

Some Jupyter Notebooks of learning PyTorch.
Jupyter Notebook
1
star
48

JeffersonQin.github.io

Personal Blog: gyrojeff.moe
HTML
1
star
49

FDU-SoC-2020

Source code for Fudan University SoC Course in Summer 2020.
Assembly
1
star
50

PlayingCardDemo

Stanford CS193P Demo: Playing Card
Swift
1
star
51

JeffersonQin

1
star
52

H-Downloader

📖 A Comic Downloader for E-Hentai & Erocool
Java
1
star
53

YuzuMarker.TextDetection

Text Detection Model for YuzuMarker
1
star
54

projects

Code that'll help you kickstart a personal website that showcases your work as a software developer.
HTML
1
star
55

jsdelivr-github-purge

🎈 A script that purges the jsdelivr cdn of github repo
Python
1
star
56

dandanplay_toolchain

🛠 Some useful scripts for DanDanPlay. 弹弹Play的一些有用的脚本。
Python
1
star
57

MahiruLauncher.Api.Python

🍥 MahiruLauncher's API for Python
Python
1
star
58

qbittorrent-auto-flush

⚡ qbittorrent 下载完毕后自动 FTP 上传复制
Python
1
star
59

DanDanPlaySwiftUI

弹弹play iOS客户端(SwiftUI实现),施工中...
Swift
1
star
60

Re-DanDanPlayforiOS

Swift重写弹弹Play iOS客户端
Swift
1
star