Skip to content

Commit 4a0eaf7

Browse files
committed
feat: support to input userinfo from cli and hardcode PICA_SECRET_KEY
1 parent d273153 commit 4a0eaf7

8 files changed

Lines changed: 106 additions & 52 deletions

File tree

.env.template

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
# 密钥,不要修改
2-
PICA_SECRET_KEY=~d}$Q7$eIni=V)9\RK/P.RM4;9[7|@/CA}b~OW!3?EV`:<>M7pddUBL5n|0/*Cn
31
# 账号名
42
PICA_ACCOUNT=
53
# 账号密码

.github/workflows/task.yml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ on:
3636
env:
3737
DEBUG: ${{ inputs.DEBUG && 'pica' }}
3838
PICA_IN_GITHUB: true # 用于区分运行环境,不要修改
39-
PICA_SECRET_KEY: ${{ secrets.PICA_SECRET_KEY }}
4039
PICA_ACCOUNT: ${{ secrets.PICA_ACCOUNT }}
4140
PICA_PASSWORD: ${{ secrets.PICA_PASSWORD }}
4241
PICA_DL_CONCURRENCY: ${{ inputs.PICA_DL_CONCURRENCY }}

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "pica-cli",
33
"author": "justorez",
4-
"version": "1.4.1",
4+
"version": "1.5.0",
55
"description": "😉 哔咔漫画下载器",
66
"packageManager": "pnpm@8.14.3",
77
"type": "module",
@@ -69,6 +69,7 @@
6969
"devDependencies": {
7070
"@inquirer/checkbox": "^1.5.2",
7171
"@inquirer/input": "^1.2.16",
72+
"@inquirer/password": "^2.0.0",
7273
"@inquirer/select": "^1.3.3",
7374
"@rollup/plugin-commonjs": "^25.0.7",
7475
"@rollup/plugin-json": "^6.1.0",

pnpm-lock.yaml

Lines changed: 37 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

readme.md

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,15 @@
88

99
![演示](https://s2.loli.net/2024/02/01/Qc7L3qGZOWBPmkR.gif)
1010

11-
- 交互式命令行
1211
- 排行榜:下载当前排行榜的全部漫画
1312
- 收藏夹:下载当前用户收藏夹的全部漫画
1413
- 搜索:支持关键字和漫画ID (多个用 # 隔开)。访问哔咔电脑端网站,进入漫画详情,地址栏链接里的 `cid` 就是漫画ID
1514
- 自动过滤已下载的章节和图片,不会重复下载
16-
- 如果没有相关环境变量,则启动交互命令界面;若有则直接执行
17-
- 通过 `pica-zip` 命令分章节批量压缩,配合支持 zip 的漫画阅读软件使用,比如 [Perfect Viewer](https://play.google.com/store/apps/details?id=com.rookiestudio.perfectviewer)。不限于 `pica-cli` 下载的漫画,只要符合 [cmoics/漫画标题/漫画章节/漫画图片](#) 的目录结构即可。
15+
- 按章节批量压缩,配合支持 zip 的漫画阅读软件使用,比如 [Perfect Viewer](https://play.google.com/store/apps/details?id=com.rookiestudio.perfectviewer)。不限于 `pica-cli` 下载的漫画,只要符合 [cmoics/漫画标题/漫画章节/漫画图片](#) 的目录结构即可。
1816
- 借助 github action 实现飞速下载,支持从 github artifact 和 file.io 两种方式下载完整漫画包。file.io 无需注册,无需科学上网,文件保存两周,单文件最大 2GB,注意链接只能下载**一次**,下载后文件会自动删除
1917
- [更新日志](#更新日志)
2018

21-
*一次性不要下载太多漫画,对哔咔服务器造成太多压力终归是不好的*
19+
> *一次性不要下载太多漫画,对哔咔服务器造成太多压力终归是不好的*
2220
2321
如果用的开心,求个 star 支持一下,比心 ~ ❤️
2422

@@ -29,16 +27,13 @@
2927
利用 github 的免费服务器下载,最关键的是不用科学上网,网速飞快,孩子用了都说好。
3028

3129
```bash
32-
# 必填,固定值,不要修改
33-
# ~d}$Q7$eIni=V)9\RK/P.RM4;9[7|@/CA}b~OW!3?EV`:<>M7pddUBL5n|0/*Cn
34-
PICA_SECRET_KEY
3530
# 必填,账号名
3631
PICA_ACCOUNT
3732
# 必填,账号密码
3833
PICA_PASSWORD
3934
```
4035

41-
fork 一份[本仓库](https://github.com/justorez/pica-cli)将上面三个环境变量,设置为仓库密钥:
36+
fork 一份[本仓库](https://github.com/justorez/pica-cli)将上面两个环境变量,设置为仓库密钥:
4237

4338
![action secret](https://s2.loli.net/2024/01/30/5FxU7olyWC3VAe1.png)
4439

@@ -64,18 +59,18 @@ pnpm add pica-cli -g
6459
在自己电脑上配置好环境变量,所需的环境变量如下所示:
6560

6661
```bash
67-
# 必填,固定值,不要修改
68-
PICA_SECRET_KEY=~d}$Q7$eIni=V)9\RK/P.RM4;9[7|@/CA}b~OW!3?EV`:<>M7pddUBL5n|0/*Cn
69-
# 必填,账号名
62+
# 账号名
63+
# 若无配置,会提示手动输入
7064
PICA_ACCOUNT=
71-
# 必填,账号密码
65+
# 账号密码
66+
# 若无配置,会提示手动输入
7267
PICA_PASSWORD=
7368
# 代理地址,示例:http://127.0.0.1:7890
7469
PICA_PROXY=
7570
# 下载图片的并发数,默认 5
7671
PICA_DL_CONCURRENCY=5
77-
# leaderboard | favorites | search
78-
# 下载内容,分别表示:排行榜 | 收藏夹 | 搜索
72+
# search | favorites | leaderboard
73+
# 下载内容,分别表示:搜索 | 收藏夹 | 排行榜
7974
PICA_DL_CONTENT=
8075
# 搜索关键字或漫画ID,多个用 # 隔开
8176
# 尽量输入完整漫画名,避免返回过多结果
@@ -113,6 +108,7 @@ pnpm dev:zip
113108

114109
## 更新日志
115110

111+
- 2024/02/21 支持通过命令行输入账号密码,硬编码密钥
116112
- 2024/02/08 支持下载指定章节
117113
- 2024/02/01 支持通过漫画ID精确下载
118114
- 2024/01/31 github action 同时将漫画包上传到 file.io

src/index.ts

Lines changed: 40 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,36 +9,57 @@ import {
99
selectChapterByInput
1010
} from './utils'
1111
import ora from 'ora'
12-
import input from '@inquirer/input'
13-
import select from '@inquirer/select'
14-
import checkbox from '@inquirer/checkbox'
12+
import Input from '@inquirer/input'
13+
import Password from '@inquirer/password'
14+
import Select from '@inquirer/select'
15+
import Checkbox from '@inquirer/checkbox'
1516
import ProgressBar from 'progress'
1617
import { Comic } from './types'
1718
import pLimit from 'p-limit'
1819
import pico from 'picocolors'
1920

2021
loadEnv()
2122

23+
const keysTip = [
24+
`${pico.cyan('<space>')} 选中`,
25+
`${pico.cyan('<a>')} 全选`,
26+
`${pico.cyan('<i>')} 反选`,
27+
`${pico.cyan('<enter>')} 确认`
28+
]
29+
const checkboxHelpTip = ` (${keysTip.join(', ')})`
30+
2231
async function main() {
2332
const {
33+
PICA_ACCOUNT,
34+
PICA_PASSWORD,
2435
PICA_DL_CONTENT,
2536
PICA_DL_CHAPTER,
2637
PICA_DL_CONCURRENCY,
2738
PICA_IN_GITHUB
2839
} = process.env
2940
const PICA_DL_SEARCH_KEYWORDS = process.env.PICA_DL_SEARCH_KEYWORDS?.trim()
3041

31-
const keysTip = [
32-
`${pico.cyan('<space>')} 选中`,
33-
`${pico.cyan('<a>')} 全选`,
34-
`${pico.cyan('<i>')} 反选`,
35-
`${pico.cyan('<enter>')} 确认`
36-
]
37-
const checkboxHelpTip = ` (${keysTip.join(', ')})`
42+
const account =
43+
PICA_ACCOUNT ||
44+
(await Input({
45+
message: '请输入账户名称',
46+
transformer: (val) => val.trim()
47+
}))
48+
const password =
49+
PICA_PASSWORD ||
50+
(await Password({
51+
message: '请输入账户密码',
52+
mask: true
53+
}))
54+
55+
const spinner = ora('正在登录哔咔').start()
56+
const pica = new Pica()
57+
await pica.login(account, password)
58+
spinner.stop()
3859

3960
const answer =
4061
PICA_DL_CONTENT ||
41-
(await select({
62+
(await Select({
4263
message: '想下载哪些漫画?',
4364
choices: [
4465
{ name: '去搜索', value: 'search' },
@@ -47,11 +68,6 @@ async function main() {
4768
]
4869
}))
4970

50-
const spinner = ora('正在登录哔咔').start()
51-
const pica = new Pica()
52-
await pica.login()
53-
spinner.stop()
54-
5571
const comics: Comic[] = []
5672
if (answer === 'leaderboard') {
5773
const res = await pica.leaderboard()
@@ -73,7 +89,7 @@ async function main() {
7389

7490
const inputStr =
7591
PICA_DL_SEARCH_KEYWORDS ||
76-
(await input({
92+
(await Input({
7793
message: '请输入关键字或者漫画ID (多个用 # 隔开)',
7894
transformer: (val) => val.trim()
7995
}))
@@ -111,7 +127,7 @@ async function main() {
111127

112128
const selected = PICA_DL_SEARCH_KEYWORDS
113129
? searchRes
114-
: await checkbox({
130+
: await Checkbox({
115131
message: '请选择要下载的漫画',
116132
pageSize: 10,
117133
loop: false,
@@ -127,6 +143,11 @@ async function main() {
127143
}
128144
}
129145

146+
if (comics.length === 0) {
147+
log.log('没有找到相应的漫画')
148+
return
149+
}
150+
130151
for (const comic of comics) {
131152
const title = comic.title.trim()
132153
const cid = comic._id
@@ -146,7 +167,7 @@ async function main() {
146167
? selectChapterByInput(PICA_DL_CHAPTER, episodes)
147168
: PICA_IN_GITHUB
148169
? episodes
149-
: await checkbox({
170+
: await Checkbox({
150171
message: '请选择要下载的章节',
151172
pageSize: 10,
152173
instructions: checkboxHelpTip,

src/sdk.ts

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ import {
1414
Favorites
1515
} from './types'
1616

17+
const PICA_SECRET_KEY =
18+
process.env.PICA_SECRET_KEY ||
19+
'~d}$Q7$eIni=V)9\\RK/P.RM4;9[7|@/CA}b~OW!3?EV`:<>M7pddUBL5n|0/*Cn'
20+
1721
export class Pica {
1822
Order = {
1923
default: 'ua', // 默认
@@ -48,10 +52,7 @@ export class Pica {
4852
const timestamp = String(Date.now()).slice(0, -3)
4953
const raw =
5054
url + timestamp + headers.nonce + method + headers['api-key']
51-
const hmac = createHmac(
52-
'sha256',
53-
process.env.PICA_SECRET_KEY as string
54-
)
55+
const hmac = createHmac('sha256', PICA_SECRET_KEY)
5556
hmac.update(raw.toLowerCase())
5657
headers.signature = hmac.digest('hex')
5758
headers.time = timestamp
@@ -74,7 +75,7 @@ export class Pica {
7475
return res
7576
}
7677

77-
debug('%s %O', url, result)
78+
debug('\n%s %O', url, result)
7879

7980
if (result.code != 200) {
8081
throw new Error('请求失败')
@@ -93,16 +94,18 @@ export class Pica {
9394
this.retryMap.delete(url)
9495
}
9596

96-
debug('error %s %s %O', url, message, error.response?.data)
97+
debug('\nerror %s %s %O', url, message, error.response?.data)
9798
return Promise.reject(message)
9899
}
99100
)
100101
}
101102

102-
async login() {
103+
async login(account: string, password: string) {
104+
debug('\n%s %s', account, password)
105+
103106
const res = await this.request<string>('post', 'auth/sign-in', {
104-
email: process.env.PICA_ACCOUNT,
105-
password: process.env.PICA_PASSWORD
107+
email: account,
108+
password: password
106109
}).catch((err) => {
107110
debug('\n登录异常 %s', err)
108111
throw new Error('登录失败,请检查账号/密码/网络环境')

src/utils.ts

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -119,16 +119,15 @@ export function normalizeName(s: string) {
119119
.replace(/:/g, '-')
120120
}
121121

122-
type LogMsg = string[] | number[]
123122
// √ ✕
124123
export const log = {
125-
log: (...msg: LogMsg) => console.log(...msg),
126-
info: (...msg: LogMsg) => console.log(pico.cyan('➡️'), ...msg),
127-
warn: (...msg: LogMsg) =>
124+
log: (...msg: unknown[]) => console.log(...msg),
125+
info: (...msg: unknown[]) => console.log(pico.cyan('➡️'), ...msg),
126+
warn: (...msg: unknown[]) =>
128127
console.log(pico.yellow(`${figures.warning} ${msg.join(' ')}`)),
129-
error: (...msg: LogMsg) =>
128+
error: (...msg: unknown[]) =>
130129
console.log(pico.red(`${figures.cross} ${msg.join(' ')}`)),
131-
success: (...msg: LogMsg) =>
130+
success: (...msg: unknown[]) =>
132131
console.log(pico.green(`${figures.tick} ${msg.join(' ')}`))
133132
}
134133

0 commit comments

Comments
 (0)