Skip to content

Commit 1031680

Browse files
committed
fetchFile 返回 promise resolve 是文件信息数组
1 parent 25b8f76 commit 1031680

File tree

4 files changed

+95
-69
lines changed

4 files changed

+95
-69
lines changed

src/index.ts

Lines changed: 53 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import { isArray, mergeConfig } from './utils'
66

77
import {
88
IFetchConfig,
9+
IFetchFile,
910
IFetchFileConfig,
1011
IRequest,
1112
IXCrawlBaseConifg
1213
} from './types'
14+
import path from 'node:path'
1315

1416
export default class XCrawl {
1517
private readonly baseConfig: IXCrawlBaseConifg
@@ -36,39 +38,57 @@ export default class XCrawl {
3638
return res as T
3739
}
3840

39-
async fetchFile(config: IFetchFileConfig): Promise<void> {
40-
const { requestConifg, intervalTime, fileConfig } = mergeConfig(
41-
this.baseConfig,
42-
config
43-
)
44-
45-
let successCount = 0
46-
47-
function eachRequestResHandle(requestRes: IRequest, currentCount: number) {
48-
const { headers, data } = requestRes
49-
50-
const fileType = headers['content-type']?.split('/').pop()
51-
const filename = `${new Date().getTime()}.${fileType}`
52-
const path = `${fileConfig.storeDir}/${filename}`
53-
54-
fs.createWriteStream(path, 'binary').write(data, (err) => {
55-
if (err) {
56-
return console.log(
57-
`File save error requested for the ${currentCount}: ${err.message}`
58-
)
59-
}
60-
61-
if (++successCount === requestConifgArr.length) {
62-
console.log('All files downloaded successfully!')
63-
}
64-
})
65-
}
66-
67-
const requestConifgArr = isArray(requestConifg)
68-
? requestConifg
69-
: [requestConifg]
70-
71-
await batchRequest(requestConifgArr, intervalTime, eachRequestResHandle)
41+
fetchFile(config: IFetchFileConfig): Promise<IFetchFile> {
42+
return new Promise((resolve) => {
43+
const { requestConifg, intervalTime, fileConfig } = mergeConfig(
44+
this.baseConfig,
45+
config
46+
)
47+
48+
let successCount = 0
49+
const res: IFetchFile = []
50+
51+
function eachRequestResHandle(
52+
requestRes: IRequest,
53+
currentCount: number
54+
) {
55+
const { headers, data } = requestRes
56+
57+
const mimeType = headers['content-type'] ?? ''
58+
const suffix = mimeType.split('/').pop()
59+
const fileName = new Date().getTime().toString()
60+
const filePath = path.resolve(
61+
fileConfig.storeDir,
62+
`${fileName}.${suffix}`
63+
)
64+
65+
fs.createWriteStream(filePath, 'binary').write(data, (err) => {
66+
if (err) {
67+
return console.log(
68+
`File save error requested for the ${currentCount}: ${err.message}`
69+
)
70+
}
71+
72+
res.push({
73+
fileName,
74+
mimeType,
75+
size: data.length,
76+
filePath
77+
})
78+
79+
if (++successCount === requestConifgArr.length) {
80+
console.log('All files downloaded successfully!')
81+
resolve(res)
82+
}
83+
})
84+
}
85+
86+
const requestConifgArr = isArray(requestConifg)
87+
? requestConifg
88+
: [requestConifg]
89+
90+
batchRequest(requestConifgArr, intervalTime, eachRequestResHandle)
91+
})
7292
}
7393

7494
async fetchHTML(url: string): Promise<JSDOM> {

src/types.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,3 +68,10 @@ export interface IFetchFileConfig extends IFetchBaseConifg {
6868
storeDir: string
6969
}
7070
}
71+
72+
export type IFetchFile = {
73+
fileName: string
74+
mimeType: string
75+
size: number
76+
filePath: string
77+
}[]

test/start/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

test/start/index.ts

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -63,43 +63,42 @@ const bilibiliXCrawl = new XCrawl({
6363
}
6464
})
6565

66-
function bilibiliRecommendData() {
67-
bilibiliXCrawl
68-
.fetch<IBRecommend>({
69-
requestConifg: {
70-
url: 'https://api.bilibili.com/x/web-interface/wbi/index/top/feed/rcmd',
71-
method: 'GET',
72-
params: {
73-
y_num: 5,
74-
fresh_type: 3,
75-
feed_version: 'V8',
76-
fresh_idx_1h: 1,
77-
fetch_row: 1,
78-
fresh_idx: 1,
79-
brush: 0,
80-
homepage_ver: 1,
81-
ps: 10,
82-
outside_trigger: '',
83-
w_rid: '2e4be8e9830ecd780c5b0ff2bef805c9',
84-
wts: 1674556002
85-
},
86-
headers: {}
66+
async function bilibiliRecommendData() {
67+
const recommend = await bilibiliXCrawl.fetch<IBRecommend>({
68+
requestConifg: {
69+
url: 'https://api.bilibili.com/x/web-interface/wbi/index/top/feed/rcmd',
70+
method: 'GET',
71+
params: {
72+
y_num: 5,
73+
fresh_type: 3,
74+
feed_version: 'V8',
75+
fresh_idx_1h: 1,
76+
fetch_row: 1,
77+
fresh_idx: 1,
78+
brush: 0,
79+
homepage_ver: 1,
80+
ps: 10,
81+
outside_trigger: '',
82+
w_rid: '2e4be8e9830ecd780c5b0ff2bef805c9',
83+
wts: 1674556002
8784
}
88-
})
89-
.then((res) => {
90-
const pictureUrls: IRequestConfig[] = res.data.item.map((item) => ({
91-
url: item.pic,
92-
method: 'GET'
93-
}))
85+
}
86+
})
9487

95-
bilibiliXCrawl.fetchFile({
96-
requestConifg: pictureUrls,
97-
intervalTime: { max: 3000, min: 2000 },
98-
fileConfig: { storeDir: path.resolve(__dirname, './upload') }
99-
})
100-
})
88+
const pictureUrls: IRequestConfig[] = recommend.data.item.map((item) => ({
89+
url: item.pic,
90+
method: 'GET'
91+
}))
92+
93+
const storeFile = await bilibiliXCrawl.fetchFile({
94+
requestConifg: pictureUrls,
95+
intervalTime: { max: 3000, min: 2000 },
96+
fileConfig: { storeDir: path.resolve(__dirname, './upload') }
97+
})
98+
99+
console.log(storeFile)
101100
}
102-
// bilibiliRecommendData()
101+
bilibiliRecommendData()
103102

104103
// 2.2 HTML: b站首页标题
105104
// 采用 jsdom 对 HTML String 解析
@@ -109,4 +108,4 @@ function bilibiliHTMLData() {
109108
console.log(dom.window.document.querySelector('title')?.textContent)
110109
})
111110
}
112-
bilibiliHTMLData()
111+
// bilibiliHTMLData()

0 commit comments

Comments
 (0)