Nodejs:迫于看片,用 puppeteer 写了一个下载(其实只是获取链接)twitter 视频的脚本

发布于 1周前 作者 zlyuanteng 来自 nodejs/Nestjs

Nodejs:迫于看片,用 puppeteer 写了一个下载(其实只是获取链接)twitter 视频的脚本

代码

// get_url.js

const process = require('process');
const puppeteer = require('puppeteer');
//npm install puppeteer


//访问代理,如果是在国内跑,一般要加上代理
const PROXY = "socks5://127.0.0.1:1080"
//页面加载后的等待时间,根据网速来设定,如果网速慢,就多等待一会
const SLEEP = 5000

//延时函数(此延时非彼延时!)
function sleep(delay) {
        return new Promise((resolve, reject) => {
                setTimeout(() => {
                        try {
                                resolve(1)
                        } catch (e) {
                                reject(0)
                        }
                }, delay)
        })
}


async function view(url,proxy=null){
    console.log(`URL:\t${url}`)
    if(proxy)
        console.log(`PROXY:\t${proxy}`)

    const browser = await puppeteer.launch({
        headless: true,
        ignoreHTTPSErrors: true,
        defaultViewport: {width: 1920, height: 1080},
        args: [`--proxy-server=${proxy}`,'--no-sandbox']
    });

    const page = await browser.newPage()
    await page.setViewport({width: 1920, height: 1080})

    // set page event hook
    page.on('request', request => {
        if ( request.resourceType() == "media" && request.url().startsWith("https://video.twimg.com/") )
            console.log( "REQUEST\t" + request.url() )
    });

    await page.goto(url)
    await page.click('.r-1ndi9ce > div:nth-child(1) > div:nth-child(1) > span:nth-child(1) > span:nth-child(1)');
    await sleep(SLEEP)
    await page.screenshot({ path: 'debug.png' })
    await browser.close()
}

(async () => {
    let proxy = PROXY
    let arguments = process.argv.splice(2)
    let url = arguments[0]
    await view( url,proxy )
})();

用法

node get_url.js TWEETS_URL

测试用例:

node get_url.js https://twitter.com/lyf112211/status/1433657754162323457?s=05

如果觉得对你有帮助,希望去知乎帮点个赞。

https://zhuanlan.zhihu.com/p/408372705


3 回复

你好!很高兴你对使用 Puppeteer 和 Node.js 来下载 Twitter 视频感兴趣。虽然你提到只是获取链接,但我可以帮你扩展一下这个脚本,让它不仅能获取视频链接,还能直接下载视频。

首先,确保你已经安装了 Node.js 和 Puppeteer。如果还没有安装,可以通过以下命令安装:

npm install puppeteer

下面是一个基本的脚本示例,它使用 Puppeteer 访问 Twitter,找到视频链接并下载视频:

const puppeteer = require('puppeteer');
const fs = require('fs');
const https = require('https');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto('https://twitter.com/your_username/status/your_tweet_id'); // 替换为实际的 Twitter 链接

  const videoUrl = await page.evaluate(() => {
    // 这里添加一些代码来找到视频元素的 src 属性
    // 假设视频元素的 id 是 'tweet-video'
    const videoElement = document.getElementById('tweet-video');
    return videoElement.src;
  });

  console.log('Video URL:', videoUrl);

  const file = fs.createWriteStream('./downloaded_video.mp4'); // 你可以更改文件名
  https.get(videoUrl, (response) => {
    response.pipe(file);
    file.on('finish', () => {
      file.close();
      console.log('Download completed.');
    });
  });

  await browser.close();
})();

请注意,这个脚本假设 Twitter 视频元素的 id 是 'tweet-video',实际使用时你可能需要调整选择器来找到正确的视频元素。此外,Twitter 可能会更改其页面结构,因此这个脚本可能需要定期更新。

回到顶部