|
@@ -633,7 +633,11 @@
|
|
|
return false;
|
|
|
}
|
|
|
|
|
|
- task = this.videoDownload(item, this.videoBrowser);
|
|
|
+ if(this.menuIndex == '1'){
|
|
|
+ task = this.douyinDownload(item, this.videoBrowser);
|
|
|
+ }else{
|
|
|
+ task = this.videoDownload(item, this.videoBrowser);
|
|
|
+ }
|
|
|
|
|
|
if(task){
|
|
|
taskArr.push(task);
|
|
@@ -671,6 +675,138 @@
|
|
|
}
|
|
|
},
|
|
|
|
|
|
+ // 抖音视频下载
|
|
|
+ async douyinDownload(urlInfo, browser){
|
|
|
+ let task = await new Promise((resolve,reject) =>{
|
|
|
+ (async () => {
|
|
|
+ try{
|
|
|
+ let authority = this.$refs.headerRef.authority.isAuthority;
|
|
|
+ urlInfo.status = '2';
|
|
|
+ urlInfo.num = 0;
|
|
|
+ const page = await browser.newPage();
|
|
|
+
|
|
|
+ let responseVideo = [];
|
|
|
+ let responseUrl = [];
|
|
|
+ page.on('response', async(response) => {
|
|
|
+ // 检查响应的 MIME 类型是否以 'video/' 开头
|
|
|
+ if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('video/')) {
|
|
|
+ if(responseVideo.indexOf(response.url()) < 0 && !response.url().startsWith('blob:https://')){
|
|
|
+ responseVideo.push(response.url());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (response.headers()['content-type'] && response.headers()['content-type'].startsWith('application/json')) {
|
|
|
+ if(response.url().indexOf('/aweme/detail/') > -1){
|
|
|
+ console.log(response.url(), '------------111111111111111111');
|
|
|
+ if(responseUrl.indexOf(response.url()) < 0){
|
|
|
+ responseUrl.push(response.url());
|
|
|
+ }else{
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ let jsonText = await response.text();
|
|
|
+ let jsonObj = {};
|
|
|
+ if(jsonText && typeof jsonText == 'string'){
|
|
|
+ jsonObj = JSON.parse(jsonText);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ let arr = ['aweme_detail', 'video', 'play_addr', 'url_list', '2'];
|
|
|
+ for(let i = 0; i < 5; i++){
|
|
|
+ jsonObj = jsonObj[arr[i]];
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log(jsonObj, '-----------22222222222222222');
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ });
|
|
|
+ await page.goto(urlInfo.url, {waitUntil : 'networkidle2'});
|
|
|
+
|
|
|
+ let pageInfo = await page.evaluate(() => {
|
|
|
+ let cHeight = document.documentElement.clientHeight;
|
|
|
+ let scrollHeight = document.body.scrollHeight;
|
|
|
+ return {'scrollHeight': scrollHeight, 'cHeight': cHeight}
|
|
|
+ });
|
|
|
+ let scrollHeight = pageInfo.scrollHeight;
|
|
|
+ let cHeight = pageInfo.cHeight;
|
|
|
+
|
|
|
+ let num = Math.ceil(scrollHeight / cHeight);
|
|
|
+ let start = -1;
|
|
|
+ let scrollInt = setInterval(async() => {
|
|
|
+ start ++;
|
|
|
+
|
|
|
+ if(start > num || start > 30){ // 防止页面过长,滚动30次自动停止
|
|
|
+ urlInfo.status = '3';
|
|
|
+ clearInterval(scrollInt);
|
|
|
+
|
|
|
+ if(urlInfo.title){
|
|
|
+ if (fs.existsSync(this.downloadDir + separator + pjson.softInfo.softName + separator + urlInfo.title)) {
|
|
|
+ urlInfo.newPath = this.downloadDir + separator + pjson.softInfo.softName + separator + urlInfo.title;
|
|
|
+ } else {
|
|
|
+ fs.mkdirSync(this.downloadDir + separator + pjson.softInfo.softName + separator + urlInfo.title);
|
|
|
+ urlInfo.newPath = this.downloadDir + separator + pjson.softInfo.softName + separator + urlInfo.title;
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ await this.getTitle(page, urlInfo); // 生成页面标题对应的文件夹
|
|
|
+ }
|
|
|
+
|
|
|
+ //detailImg:详情图;skuImg:sku图片;commentImg: 评论图;video: 视频
|
|
|
+ const imgInfo = await page.evaluate((authority) => {
|
|
|
+ let outObj = {
|
|
|
+ video: []
|
|
|
+ };
|
|
|
+ // 视频
|
|
|
+ let arr5 = document.querySelectorAll('video source');
|
|
|
+ for(let i=0; i< arr5.length; i++){
|
|
|
+ if(outObj.video.indexOf(arr5[i].src) < 0 && !arr5[i].src.startsWith('blob:https://')){
|
|
|
+ if(arr5[i].src){
|
|
|
+ outObj.video.push(arr5[i].src);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return outObj;
|
|
|
+ }, authority);
|
|
|
+
|
|
|
+ if(responseVideo.length > 0){
|
|
|
+ for(let l=0; l<responseVideo.length; l++){
|
|
|
+ if(imgInfo.video.indexOf(responseVideo[l]) < 0){
|
|
|
+ imgInfo.video.push(responseVideo[l]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ urlInfo.status = '3';
|
|
|
+ console.log(imgInfo.video);
|
|
|
+
|
|
|
+ //视频下载
|
|
|
+ for(let j = 0; j < imgInfo.video.length; j++){
|
|
|
+ let num = Number(j) + 1;
|
|
|
+ let suffix = '.mp4';
|
|
|
+ let outputPath = urlInfo.newPath + '\\视频' + num + suffix;
|
|
|
+ console.log(imgInfo.video[j], '--------------333333333333');
|
|
|
+ // await this.downloadImage(imgInfo.video[j], outputPath, urlInfo);
|
|
|
+ }
|
|
|
+
|
|
|
+ this.loading = false;
|
|
|
+ urlInfo.status = '4';
|
|
|
+ resolve(true);
|
|
|
+ }
|
|
|
+ }, 600);
|
|
|
+ }catch(e){
|
|
|
+ urlInfo.status = '5';
|
|
|
+ reject(e);
|
|
|
+ this.showError(e);
|
|
|
+ }
|
|
|
+ })();
|
|
|
+ });
|
|
|
+ },
|
|
|
+
|
|
|
// 视频下载
|
|
|
async videoDownload(urlInfo, browser){
|
|
|
let task = await new Promise((resolve,reject) =>{
|
|
@@ -743,6 +879,9 @@
|
|
|
};
|
|
|
// 视频
|
|
|
let arr5 = document.querySelectorAll('video source');
|
|
|
+ if(arr5.length == 0){
|
|
|
+ arr5 = document.querySelectorAll('video');
|
|
|
+ }
|
|
|
for(let i=0; i< arr5.length; i++){
|
|
|
if(outObj.video.indexOf(arr5[i].src) < 0 && !arr5[i].src.startsWith('blob:https://')){
|
|
|
if(arr5[i].src){
|
|
@@ -769,7 +908,6 @@
|
|
|
let num = Number(j) + 1;
|
|
|
let suffix = '.mp4';
|
|
|
let outputPath = urlInfo.newPath + '\\视频' + num + suffix;
|
|
|
- console.log(imgInfo.video[j]);
|
|
|
await this.downloadImage(imgInfo.video[j], outputPath, urlInfo);
|
|
|
}
|
|
|
|