Pixiv管理脚本pixman

# pixman,Pixiv收藏管理工具

https://gitee.com/danzou1ge6/pixman/

WSL2 ArchLinux Python3.10下开发并测试

Windows10 Python3.10下测试

## 前言

作者因为有太多的Pixiv收藏,有一次一不小心删了几张,然后发现根本找不回来,所以一气之下写了个简单的收藏管理器来处理

后来用着用着发现局限性很大,就彻底重构了两次,得到了现在的版本

> 动态语言一时爽,代码重构火葬场

> (其实是因为作者水平太烂,没有经过专业的软件工程训练

> (这 就 是 我 摆 烂 的 借 口 ~

总之先凑合用吧,遇到bug请联系作者;如果有改进的建议也可以联系作者;如果愿意写一个更强大优美的收藏管理器,那当然更好,这个摆烂的小脚本至少也起到了抛砖引玉的作用

## 开始

觉得看不懂下面这部分的可以直接跳到[快速开始](#快速开始)

### 安装

1. 下载源码

2. 安装依赖项

“`shell

pip install -r ./requirements.txt

“`

3. 下载Aria2下载器 [官网](http://aria2.github.io/)

4. [创建配置](#配置)

5. 运行

“`shell

python pixman.py -h

python pixman.py kotori

“`

也可以将pixman添加至PATH

### 配置

#### 配置的读取

pixman有三个配置文件

– 样例配置:`libpixman/sample_conf.py`

– 全局配置:`global_conf.py`

– 用户配置`$PREFIX/conf.py`

和命令行选项`-c,–conf`传入的配置;其中`$PREFIX`指一个收藏储存库的位置

> 全局配置的位置写在`pixman.py`中,如果有需求,如移到`/etc`,可以直接修改

> 下文假设`global_conf.py`与`pixman.py`在同一目录下

它们的优先度是

命令行选项 > 用户配置 > 全局配置

而样例配置用于判断配置是否完整以及类型是否正确,不用于实际运行

当pixman读取配置的过程

– 首先查看命令行是否由选项`-p,–prefix`传入`$PREFIX`

– 如果有,则读取`$PREFIX/conf.py`作为用户配置

– 如果无,则查看当前工作目录下是否有`conf.py`

– 如果有,则读取`./conf.py`作为用户配置

– 如果无,则不读取用户配置

– 读取全局配置,并使用全局配置补全用户配置中没有的项

– 使用命令行传入的配置覆写

> 设计这种机制的初衷在于,可以把`refresh_token`和`user_id`放在全局配置中,而建立多个储存库互不干扰

> 其中有些储存库可以使用配置项`target_user_id`来同步其他用户的公开收藏,也可离线使用

> 也可以将pixman添加到PATH而把工作目录作为`$PREFIX`

#### 配置内容

具体内容见`global_conf.py`,下对一些关键内容进行进一步解释

接下来用`conf.$KEY`代指配置项`$KEY`

pixman使用Aria2作为下载器,如果aria2c已经加入了PATH,则无需修改`conf.aria2_exec`,否则则需修改此配置项为aria2c的路径

由于设计问题,`conf.prefix`在读取时写入配置,因此设为空字符串,请不要修改;但`global_conf.prefix`不会被覆写,可以作为默认值

因此,如果其他配置项,如`conf.dl_dir`,`conf.database_path`,`conf.index_path`在`conf.prefix`下时,需要写成用`@property`装饰的函数

对于这些写成函数的配置项,在使用样例`sample_conf.py`检查时会检查函数的返回值,而不是把它们当作函数处理

> 用这种有些奇怪的配置文件归根到底是因为懒

配置项`conf.log_file`默认为`prefix`下的`pixman.log`,注意该日志文件不会被自动清理;当其过大时,直接删除即可

对于[`conf.refresh_token`](#关于refresh_token),`conf.user_id`,`conf.target_user_id`,这些配置项在样例`sample_conf.py`中是`None`,表明它们可以留空

这样,即使没有Pixiv账号,也可以根据本地数据库文件下载插画

#### 建议的创建配置的方法

– 将自己账号的`refresh_token`和`user_id`写入`global_conf.py`,如没有可以跳过

– 按需求修改`global_conf.py`

– 选择一个目录`$PREFIX`作为收藏储存库

– 将`global_conf.py`拷贝至`$PREFIX`,并重命名为`conf.py`

– 使用文本编辑器打开新的`conf.py`,按照自己的需要进行修改

#### 关于refresh_token

`refresh_token`是Pixiv用于登录的一个cookie,因其有长时间不更新的特点,在`pixivpy`中用作登录凭据

`refresh_token`可以通过脚本`utils/get_token.py`获得

> `get_token.py`来自[[email protected]](https://github.com/txperl/PixivBiu)

> 还可参考[@ZipFile Pixiv OAuth Flow](https://gist.github.com/ZipFile/c9ebedb224406f4f11845ab700124362) 及 [OAuth with Selenium/ChromeDriver]( https://gist.github.com/upbit/6edda27cb1644e94183291109b8a5fde)

### 使用

“`shell

python pixman.py [global_options] sync|search|query|remove [arguments]

“`

注意,由于使用了`argparse`,需严格遵守`global_options`和`options`的顺序

pixman可以分为四个功能模块

sync: Pixiv服务器、本地数据库和本地插画文件的同步

search:在线查询

remove: 从Pixiv服务器、本地数据库和本地插画文件中删除

query: 在本地数据库进行查询

接下来的说明中使用树形结构:当顶层的选项选中时,下一层的选项有效

当然,`无使用限制的全局选项`总是适用

#### sync

– -r,–remote: 将参数作为一串插画id,并收藏到Pixiv服务器 **需要登陆**

– -d,–database: 将参数作为一串插画id,并收藏到本地数据库 **需要登陆**

– -y,–refresh: 本地数据库与服务器同步 **需要登陆**

– -n,–num `N`: 同步的插画页数设为`N`,若`N=-1`则全部同步 *全局选项*

> 由于Pixiv设计,请求收藏数据的返回是分页的,一页30幅插画,按收藏时间排序

> 全部同步由于网络问题可能耗时较久,故提供该选项来仅同步较近期的收藏

– -u,–update: 插画文件与本地数据库同步

– -k,–delete: 删除在本地存在,但不在数据库中的文件

– -w,–download-only: 仅下载,将参数作为一串插画id进行下载 **需要登陆**

– -o,–output `DIR`: 下载到`DIR`,留空则下载到工作目录 *全局选项*

–m,–merge: 将参数作为一个数据库文件的路径,将此数据库文件中的插画数据添加到本地数据库

#### search**需要登陆**

– -i,–info: 从参数读入一串id,并从Pixiv服务器获得详情

– -v,–verbose: 输出详细信息 *全局选项*

– -o,–output `FILE`: 输出插画信息到`FILE`,否则输出到stdout *全局选项*

– 无-i,–info: 从参数读入一串id,执行关键字查询

> 该搜索由Pixiv提供

– -t,–target: 搜索目标,可以取`partial_tag`(部分标签匹配), `exact_tag`(完整标签匹配)或`title_cap`(标题及说明文字中查找)

– -v,–verbose: 详细输出插画信息,否则输出简报 *全局选项*

– -o,–output `FILE`: 输出插画信息到`FILE`,否则输出到stdout *全局选项*

– -n,–num `N`: 结果页数设为`N` *全局选项*

#### remove

– -l,–local: 从参数读入一串id,从本地插画文件中删除

– -d,–database: 从参数读入一串id,从本地数据库中删除

– -r,–remote: 从参数读入一串id,从Pixiv服务器上删除 **需要登陆**

#### query

-e,–export:将数据库中所有插画输出为一个Aria2 Input File,包含URL、下载位置和文件名;有一个位置参数,作为下载位置

– -o,–output `FILE`: Aria2 Input File的文件名

– -i,–info: 将参数作为一串插画id,在本地数据库检索,输出详细信息

– -v,–verbose: 详细输出插画信息,否则输出简报 *全局选项*

– -o,–output `FILE`: 输出插画信息到`FILE`,否则输出到stdout *全局选项*

– 无-i,–info或-e,–export

– -t,–target: 搜索目标,可以取`title`,`caption`,`user`,`tag`

> 使用`fuzzywuzzy`进行模糊匹配,匹配度阈值在配置项`conf.fuzzy_query_score_cutoff`中设置

– -o,–output `FILE`: 输出插画信息到`FILE`,否则输出到stdout *全局选项*

– -n,–num `N`: 结果数设为`N` *全局选项*

– -v,–verbose: 详细输出插画信息,否则输出简报 *全局选项*

#### 无使用限制的全局选项

– -p,–prefix: 收藏储存库的位置

– -c,–conf STR: 用STR中的配置覆写配置文件中的配置

> STR形如log_level=debug;prefix=.

### Windows打包

> 下为Powershell命令

1. 克隆/下载源代码

1. 复制一份`pixman`脚本到`pixman_build`

“`powershell

cp .\pixman .\pixman_build

“`

2. 进入`pixman_build`,创建虚拟环境,安装依赖

“`powershell

cd .\pixman_build

virtualenv venv

.\venv\Scripts\activate.ps1

pip install -r requirements.txt

“`

4. 安装PyInstaller

“`powershell

pip install pyinstaller

“`

5. 下载Aria2,复制到`pixman_build`下

5. 使用PyInstaller打包

“`powershell

pyinstaller -D pixman.py –add-data “.\global_conf.py;.” –add-binary “aria2c.exe;.” –add-data “.\utils;utils” –add-data “.\resources;resources” –add-data “.\README.*;.” –add-data “LICENSE;.” –add-data “libpixman\cli\.pic;libpixman\cli”

“`

6. `dist`下出现`pixman`文件夹,内含可执行文件`pixman.exe`

以上命令已写入`utils/make_winbundle.ps1`,但此脚本不包含`aria2c`的安装,请手动拷入获得的`pixman_bundle`

## 各模块功能说明

– pixman.py: 主程序,传入全局配置文件位置

– global_conf.py: 全局配置

– libpixman: 库文件

– pixivpy3: pixiv python api修改版,相比原版增加了更多的dns服务器(见pixivpy3/bapi.py)

– conf_loader.py: 加载、检查、合并配置,解析命令行`–conf`选项输入

– log.py: 简易的日志管理

– sample_conf.py: 样例配置,用于检查运行时配置

– downloading.py: 调用Aria2进行下载 创建一个aria2c子进程,并使用`aria2p`对其进行控制,利用一个回调函数将下载完成的插画添加到`FilesManager`的索引

– search.py: 在Pixiv上进行关键词搜索

– illust_info.py: 从插画详情的原始json数据中提取信息,以及生成可读的文本

– login_manager.py: 管理登录。通过将`pixivpy`中提供的api对象序列化到`api.dump`中来实现短时间内不用重复登陆

> 其实是作者懒得读`pixivpy`的代码来找到更好的办法

– managing: 对本地插画文件、本地数据库进行管理

– file_man.py `FilesManager`: 对本地插画进行管理,建立索引,提供增、删、清理等功能

– database_man.py `BookmarkDatabaseManager`: 对本地数据库进行管理,提供下载插画、增、删、查询等功能

– userdb_man.py `PixUsrBmDbM`: 继承自`BookmarkDatabaseManager`,提供从Pixiv同步收藏的功能

– cli: 命令行

– cli.py `CLIMain`: 命令行主程序,包含了处理命令行输入的逻辑

– cli_parser.py: 定义了用于解析命令的`ArgumentParser`

– cli_utils.py: 将cli.py和cli_cmd.py中的部分代码进行复用

– cli_cmd.py: 包含了cli.py中的所有功能调用

– utils: 工具

– get_token.py: 获得`refresh_token`

– test.py: 调试用

– resources: 资源

– bookmarks.json: 作者的Pixiv收藏

– advanced_global_conf.py: 进阶全局设定,当你已经通透了`pixman`配置后可以尝试基于此修改全局设定

– conf.py:用户配置样例

## 使用场景

以下是作者建议的使用方法,注意这些方法之间没有联系,仅供参考

### 在线使用

– 将`refresh_token`,`user_id`与`target_user_id`写入`global_conf.py`

– 将`pixman`添加到PATH

– 可以酌情更改`global_conf.py`的位置,在`pixman.py`中可以修改

– 工作目录下无`conf.py`,使用`global_conf.py`中的默认配置

– 工作目录下无`conf.py`,使用 `-c,–conf`选项指定`prefix`,`dl_dir`,`database_path`,`index_path`的位置

> 由于`database_path`,`index_path`可以通过设置成为`property`动态计算的,也可以只修改`prefix`和`dl_dir`

– 将`prefix`,`dl_dir`,`database_path`,`index_path`写入`conf.py`,如果要追踪其他用户的收藏,也可写入`target_user_id`

– 可以通过修改`dl_dir`将此数据库与其他下载位置相连,从而实现共用本地文件

> 注意此时在执行`sync –update`是千万不要加`-k,–delete`选项,也不要将配置项`sync_local_delete`设为真,否则会删除所有不在当前数据库的文件

– `pixman`未添加到PATH,使用`-p,–prefix`全局选项指定`conf.py`的位置,或使用`global_conf.py`中的默认配置

### 离线使用

仅使用[使用](#使用)中未标记**需要登录**的功能即可

> 如果不慎使用了**需要登陆**的功能,可能会出现难以预测的异常

> (其实是作者懒得写异常处理

总之,作者自认为这种**懒惰**的配置方法还是有很强的灵活性的,使用者可以找到自己习惯的方式

如果有的使用习惯无法实现,欢迎联系作者提出建议

## 快速开始

Linux用户不需要我教,MacOS我没用过,教不来,所以这部分仅帮助Windows初级用户最快地上手pixman

> 仅此章节无法发挥pixman的全部功能

这里假设用户已经装好了`python3.10`,且会基本的命令行操作,不会请Ask the Friendly Web

如果不想安装Python,可以下载Release,在下面的命令中用`.\pixman.exe`代替`python pixman.py`即可

### 安装与配置

1. 下载源代码zip压缩包

2. 解压到某个文件夹,下称`$PIXMAN_ROOT`

3. 在该文件夹下打开命令行,执行

“`shell

pip install -r ./requirements.txt

“`

3. 下载Aria2 [官网](http://aria2.github.io/),将aria2c.exe放在`$PIXMAN_ROOT`文件夹下

6. 运行`python utils/get_token.py`,按提示获得`refresh_token`(若操作成功,脚本会打印”token为…”)

6. 使用文本编辑器打开`global_conf.py`,将上一步获得的`refresh_token`填入`”refresh_token=””`的单引号里,并将Pixiv用户id(Pixiv官网上可以看见)替代`”user_id = 0″`的`”0″`

> 这一步暂时可以不做,但是注意,这样会导致执行**需要登陆**的命令时出现难以预测的异常

> (其实是因为作者懒得写异常处理

3. 在文件夹`$PIXMAN_ROOT`下新建文件夹`repo`

### 案例

此处给出一些样例,具体用法请参考[使用](#使用)

同步所有收藏

“`shell

python pixman.py sync -yu

“`

如果脚本正常退出,则所有`refresh_token`对应用户的收藏应该会出现在文件夹

在数据库中查询

“`shell

python pixman.py -v query -t tag 白髪

“`

添加收藏到本地数据库和Pixiv服务器

“`shell

python pixman.py sync -dr 72159989

“`

从本地数据库和Pixiv服务器删除

“`shell

python pixman.py remove -dr 72159989

“`

将本地数据库输出为Aria2输入文件,可以用于Aria2下载

“`shell

python pixman.py -o ./repo/bookmarks.aria2 query ./downloads

“`

将本地数据库所有插画的信息输出到一个Markdown文件

“`shell

python pixman.py -o ./repo/bookmarks.md query

“`

### 下载作者的收藏

#### 方案一

此方案新建一个储存库

1. 新建文件夹,记为`$DIR`

2. 将`resources/conf.py`和`resources/bookmarks.json`拷贝至`$DIR`

3. 在`$DIR`下新建`downloads`

3. 执行

“`shell

python pixman.py -p $DIR sync -u

“`

5. 等待脚本执行结束

> 由于数量较大(700多张),可能花上一会

#### 方案二

此方案不需要新建一个储存库

1. 新建下载文件夹,记为`$DL_DIR`

2. 执行

“`shell

python pixman.py -c “dl_dir=$DL_DIR;database_path=resources/bookmarks.json” sync -u

“`

> 此处省略`index_path`是因为`global_conf.py`中定义了`index_path`为`prefix`文件夹下的`index.json`;

> 如果修改了配置项`index_path`,则需酌情更改此命令

3. 等待脚本执行结束

#### 方案三

此方案须手动调用aria2c

1. 执行

“`shell

python pixman.py -c “database_path=resources/bookmarks.json” -o ./bookmark_download.aria2 query -e ./downloads

“`

2. 在当前工作目录下会出现一个`bookmark_download.aria2`,将其剪切到某个文件夹,记为`$DL_DIR`

3. 在`$DL_DIR`打开命令行,执行

“`shell

aria2c -i bookmark_download.aria2

“`

> 此处假设已经配置好了Aria2,且将aria2c添加到了PATH

## 结语

KOTORI 最棒!

![](https://i.pixiv.re/c/600x1200_90/img-master/img/2020/07/26/14/52/29/83236629_p0_master1200.jpg)

> 这不是原图 id=83236629

© 版权声明
THE END
喜欢就支持一下吧
点赞1 分享
danzou1ge6的头像-光坂小镇
评论的小按钮 共3条

请登录后发表评论