# 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 最棒!

> 这不是原图 id=83236629
- 最新
- 最热
只看作者