相关文档

cheerio
puppeteer

通用函数版本

import cheerio from 'cheerio'
import puppeteer from 'puppeteer'

export const getDouyinVideo = async function getDouyinVideoInfo(videoUrl: string) {
    const browser = await puppeteer.launch()
    const page = await browser.newPage()

    const videoSource = videoUrl

    // 设置页面的视图端口大小
    await page.setViewport({
        width: 375, // iPhone X 宽度
        height: 812, // iPhone X 高度
        deviceScaleFactor: 2, // 设备缩放因子,iPhone X 是 2x 视网膜屏幕
        isMobile: true, // 标记为移动设备
        hasTouch: true // 支持触摸
    })

    // 设置用户代理
    await page.setUserAgent(
        'Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1'
    )

    try {
        // 导航到视频页面
        await page.goto(videoSource, { waitUntil: 'networkidle2' })

        // 获取页面内容
        const html = await page.content()
        const $ = cheerio.load(html)

        // 提取封面
        const cover = $('.video-container .poster', html).attr('src')
        // 提取视频标题
        const title = $('title').text()
        // 提取视频关键词
        const keywords = $('meta[name="keywords"]').attr('content')
        // 提取视频描述
        const description = $('meta[name="description"]').attr('content')

        return { cover, title, keywords, description }
    } catch (error) {
        console.error('获取视频信息失败:', error)
    } finally {
        await browser.close() // 确保关闭浏览器
    }
}

终端运行版本

const puppeteer = require("puppeteer");
const cheerio = require("cheerio");
const readline = require("readline");

// 创建接口以便从终端读取输入
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
});

async function getDouyinVideoInfo(videoUrl) {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // 设置页面的视图端口大小
  await page.setViewport({
    width: 375, // iPhone X 宽度
    height: 812, // iPhone X 高度
    deviceScaleFactor: 2, // 设备缩放因子,iPhone X 是 2x 视网膜屏幕
    isMobile: true, // 标记为移动设备
    hasTouch: true, // 支持触摸
  });

  // 设置用户代理
  await page.setUserAgent(
    "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1"
  );

  try {
    // 导航到视频页面
    await page.goto(videoUrl, { waitUntil: "networkidle2" });

    // 获取页面内容
    const html = await page.content();
    const $ = cheerio.load(html);

    // pc
    // // 提取封面
    // const cover = $('meta[name="lark:url:video_cover_image_url"]').attr(
    //   "content"
    // );
    // const cover_m = $(".video-container .poster", html);
    // console.log(cover_m.attr("src"));

    // // 提取视频iframe地址
    // const iframe_url = $('meta[name="lark:url:video_iframe_url"]').attr(
    //   "content"
    // );
    // // 提取视频标题
    // const title = $('meta[name="lark:url:video_title"]').attr("content");
    // // 提取视频关键词
    // const keywords = $('meta[name="keywords"]').attr("content");
    // // 提取视频描述
    // const description = $('meta[name="description"]').attr("content");
    // // 提取视频来源
    // const source = $('meta[name="lark:url:video_brand_name"]').attr("content");

    // 移动端

    // 提取封面
    const cover = $(".video-container .poster", html).attr("src");
    // 提取视频标题
    const title = $("title").text();
    // 提取视频关键词
    const keywords = $('meta[name="keywords"]').attr("content");
    // 提取视频描述
    const description = $('meta[name="description"]').attr("content");

    return { cover, title, keywords, description, source, iframe_url };
  } catch (error) {
    console.error("获取视频信息失败:", error);
  } finally {
    await browser.close(); // 确保关闭浏览器
  }
}

// 提示用户输入视频链接
rl.question("请输入视频链接: ", async (original) => {
  // 显示正在提取的动画效果
  const loadingText = "🚀正在提取";
  let loadingAnimation = "";
  const loadingInterval = setInterval(() => {
    process.stdout.write(`\r${loadingText}${loadingAnimation}`);
    loadingAnimation =
      loadingAnimation.length < 3 ? loadingAnimation + "." : "";
  }, 500);

  const info = await getDouyinVideoInfo(original);

  // 清除动画效果
  clearInterval(loadingInterval);
  console.log("\r✅提取完成\n");

  // 显示提取的信息
  console.log("视频封面:", info.cover);
  console.log("视频标题:", info.title);
  console.log("视频关键词:", info.keywords);
  console.log("视频描述:", info.description);
  console.log("视频来源:", info.source);
  console.log("视频地址:", info.iframe_url);

  rl.close(); // 关闭 readline 接口
});
文章目录