Vue3 + Pinia + Vite5 仿抖音,完全度90% . Vue3 + Pinia + Vite5 imitate TikTok with 90% completeness
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

92 lines
2.2 KiB

import fs from 'fs'
import request from 'request'
import { nanoid } from 'nanoid'
let fileName = './xhs.json'
let savefileName = './xhs-save.json'
let saveFileStr = fs.readFileSync(fileName, 'utf8')
let inputData = JSON.parse(saveFileStr)
const downloadImage = async (src, dest, callback) => {
console.log('下载:', src, dest, Date.now())
return new Promise((resolve) => {
request.head(src, (err) => {
if (err) {
console.log(err)
return
}
src &&
request(src)
.pipe(fs.createWriteStream(dest))
.on('close', () => {
setTimeout(resolve, 1500)
callback && callback(null, dest)
})
})
})
}
let saveFilePath = './imgs/'
let imgList = []
async function test(list) {
for (let j = 0; j < list.length; j++) {
let a = list[j]
let coverUrl = a.info_list[0].url
let rIndex = imgList.findIndex((v) => v.url === coverUrl)
if (rIndex === -1) {
if (coverUrl.includes('http')) {
let name = nanoid() + '.png'
imgList.push({
name,
url: coverUrl
})
await downloadImage(coverUrl, saveFilePath + name, () => {
// console.log('close', name)
list[j] = {
info_list: [
{
url: name
}
]
}
fs.writeFileSync(savefileName, JSON.stringify(inputData, null, 2))
})
}
} else {
list[j] = {
info_list: [
{
url: imgList[rIndex].name
}
]
}
console.log('重复')
fs.writeFileSync(savefileName, JSON.stringify(inputData, null, 2))
}
}
}
for (let i = 0; i < inputData.slice(0, 111111).length; i++) {
let v = inputData[i]
if (v.note_card?.cover) {
let url = v.note_card?.cover?.url_default
let name = nanoid() + '.png'
imgList.push({
name,
url: url
})
await downloadImage(url, saveFilePath + name, () => {
// console.log('close', name)
v.note_card.cover = { url_default: name }
fs.writeFileSync(savefileName, JSON.stringify(inputData, null, 2))
})
}
if (v.note_card?.image_list) {
await test(v.note_card.image_list)
}
}