• 教你怎么在电脑端下载西瓜视频源文件


    家里长辈平时爱用西瓜视频,看到喜欢的广场舞就会收藏,甚至想下载到视频机,晚上去广场跟着跳🤣。

    这时计算机专业出身的我,就派上用场了。不废话,直接上手:

    1. 打开西瓜视频官网,搜索到想要的视频
    2. 打开 F12(开发者工具)
    3. 切换到移动端模式,刷新页面
    4. 在 Network 面板下,筛选 Media ,找到原视频的链接,右键在新标签页打开
    5. 将上述视频另存为即可👏

    使用脚本自动下载

    人工操作多了就容易烦躁,于是用puppeteer做了个小工具,直接在命令行中传入视频连接进行下载

    import chalk from "chalk"
    import puppeteer from "puppeteer"
    import dayjs from "dayjs"
    import { get } from 'https'
    import { createWriteStream } from "fs"
    
    const iphonUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.3 Mobile/15E148 Safari/604.1"
    
    const urls = process.argv.splice(2).filter(v=>!!v)
    
    if(urls.length == 0){
        console.error(chalk.red(`ERROR:请输入 URL`))
        process.exit(-1)
    }
    
    const log = (...ps)=> console.debug(`${chalk.magenta(dayjs(new Date).format("HH:mm:ss"))} `, ...ps)
    /**
     * 下载远程资源到本地
     * @param {String} remoteUrl
     * @param {String} filename - 本地文件名
     * @returns {Promise}
     */
    const downloadToFile = (remoteUrl, filename)=>new Promise((ok)=>{
        get(remoteUrl, res=>{
            const stream = createWriteStream(filename)
            res.pipe(stream)
    
            stream.on('finish', ()=>{
                stream.close()
                ok()
            })
        })
    })
    /**
     * 线程等待
     * @param {Number} seconds - 秒,默认 3
     * @returns {Promise}
     */
    const sleep = (seconds=3)=> new Promise(ok=> setTimeout(ok, seconds*1000))
    /**
     * 根据分享地址获取视频页面的真实地址
     * @param {String} url - 格式为 https://v.ixigua.com/xxxx/
     * @returns {Promise}
     */
    const getRealUrl = url=> new Promise(ok=> get(url,{headers:{"user-agent": iphonUserAgent }}, res=> ok(res.headers.location.split("/?").shift())))
    
    
    const browser = await puppeteer.launch({headless: true})
    const page = await browser.newPage()
    await page.setExtraHTTPHeaders({
        'User-Agent': iphonUserAgent,
        'Referer': "https://m.ixigua.com/"
    })
    
    console.info(`本次下载地址 ${chalk.magenta(urls.length)}`)
    /**
     * 三类视频地址:
     * 1、https://m.ixigua.com/video/7289329592371053071    手机版地址
     * 2、https://www.ixigua.com7289329592371053071         PC版地址
     * 3、https://v.ixigua.com/idPeuNAa/                    分享出来的短链接
     */
    for (let url of urls) {
        console.group(url)
        if(url.startsWith("https://v.ixigua.com") || url.startsWith("https://www.ixigua.com/")){
            url = await getRealUrl(url)
            if(url.startsWith("//m."))  url = `https:${url}`
            log(`解析真实地址 ${url}`)
        }
    
        log(`开始加载地址 ${url}`)
        await page.goto(url)
    
        await sleep(1)
    
        let title = await page.title()
        log(`读取标题:${title}`)
    
        let video = await page.waitForSelector("video")
        if(video){
            let src = await video.getProperty('src')
            src = await src.jsonValue()
            log(`视频地址 ${src}`)
    
            // 文件名删除空格、emoji、-西瓜视频这几类
            let filename = `${title.replace(" ", "").replace(/\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, "").replace("-西瓜视频", "").trim()}.mp4`
            log(`即将保存资源到 ${filename}`)
    
            let started = Date.now()
            await downloadToFile(src, filename)
            log(`原视频下载完成(耗时 ${((Date.now()-started)/1000).toFixed(4)} 秒) ^.^\n`)
        }
        else{
            log(`找不到视频元素,跳过`)
        }
        console.groupEnd()
    }
    
    await page.close()
    await browser.close()
    
    console.debug(chalk.magenta(`\nBye!`))
    
    process.exit(0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103

    使用方式:

    1. 将上述代码保存到index.js
    2. 执行 npm i puppeteer chalk dayjs
    3. 执行 node . {视频地址,多个用空格隔开}

  • 相关阅读:
    BUUCTF Reverse/firmware
    【设计模式】Java设计模式 - 命令模式
    On-Device Neural Net Inference with Mobile GPUs
    maven项目子类项目版本与父类版本不一致
    【排障记录】扩展坞USB 3.0能用而2.0不能用
    【2022华为od机试题】【JAVA】【刷题子】华为od机试题:磁盘容量排序(AC:100%)
    根据键名解析特定属性的值相关API
    爬虫 //获取元素中的数据
    httprunner4学习总结2 - 安装部署
    12345
  • 原文地址:https://blog.csdn.net/ssrc0604hx/article/details/133828647