当前位置: 首页 > article >正文

图集短视频去水印云函数开发实践——小红书

前两篇主要讲解了抖音和快手的图集短视频对去水印解析的云函数开发实践,今天说一些小红书图集解析的云函数实践。

图集短视频去水印云函数开发实践——抖音

图集短视频去水印云函数开发实践——快手

其实都是大差不差的,首先获取到小红书的分享链接,然后重定向到原地址,然后直接请求这个地址,获取到网页HTML,直接从中提取,这里比抖音快手还要简单一些。具体代码如下:

async getRedirectUrl(url) {
    try {
      const response = await this.curl(url, {
        method: "GET",
        headers: this.headers,
        followRedirect: false,
      });
      return this.safeGet(response, 'headers.location', url);
    } catch (error) {
      console.error("获取重定向URL时出错:", error);
      throw error;
    }
  }


  async getHtml(url) {
    try {
      const response = await this.curl(url, {
        headers: this.headers,
        dataType: "text",
      });
      return this.safeGet(response, 'data', null);
    } catch (error) {
      console.error("获取网页内容失败:", error);
      return null;
    }
  }


  parseHtml(html) {
    const jsonMatch = html.match(
      /<script>window\.__INITIAL_STATE__=(.*?)<\/script>/
    );


    if (!jsonMatch || jsonMatch.length < 2) {
      console.error("无法找到笔记信息");
      return null;
    }


    try {
      let jsonString = jsonMatch[1].replace(/undefined/g, "null");
      const data = JSON.parse(jsonString);


      const noteId = Object.keys(this.safeGet(data, 'note.noteDetailMap', {}))[0];
      if (!noteId) {
        console.error("无法找到笔记ID");
        return null;
      }


      const noteData = this.safeGet(data, `note.noteDetailMap.${noteId}.note`, null);
      if (!noteData) {
        console.error("无法获取笔记数据");
        return null;
      }


      const result = {
        title: this.safeGet(noteData, 'title', ''),
        desc: this.safeGet(noteData, 'desc', ''),
        type: this.safeGet(noteData, 'type', ''),
        user: {
          nickname: this.safeGet(noteData, 'user.nickname', ''),
          avatar: this.safeGet(noteData, 'user.avatar', ''),
          userId: this.safeGet(noteData, 'user.userId', ''),
        },
        time: this.safeGet(noteData, 'time', ''),
        likes: this.safeGet(noteData, 'interactInfo.likedCount', '0'),
        comments: this.safeGet(noteData, 'interactInfo.commentCount', '0'),
        collects: this.safeGet(noteData, 'interactInfo.collectedCount', '0'),
        view_count: this.safeGet(noteData, 'interactInfo.viewCount', '0'),
        share_count: this.safeGet(noteData, 'interactInfo.shareCount', '0'),
        platform: "xiaohongshu",
      };


      if (noteData.type === "video") {
        result.video = {
          url: this.safeGet(noteData, 'video.media.stream.h264.0.masterUrl', ''),
          cover: this.safeGet(noteData, 'video.cover.url', ''),
        };
      } else {
        result.images = this.safeGet(noteData, 'imageList', []).map((img) => ({
          url: this.safeGet(img, 'urlDefault', '') || this.safeGet(img, 'url', ''),
          width: this.safeGet(img, 'width', 0),
          height: this.safeGet(img, 'height', 0),
        }));
      }


      return result;
    } catch (error) {
      console.error("解析笔记信息失败:", error);
      return null;
    }
  }


  // 辅助方法:将字符串解析为数字
  parseNumber(value) {
    if (typeof value === "number") return value;
    if (!value) return 0;
    const num = parseInt(value.replace(/[^0-9]/g, ""));
    return isNaN(num) ? 0 : num;
  }


  safeGet(obj, path, defaultValue = '') {
    return path.split('.').reduce((acc, part) => {
      if (acc && typeof acc === 'object' && part in acc) {
        return acc[part];
      }
      return defaultValue;
    }, obj);
  }

没那么多废话了,看代码应该就可以明白了,不明白的留言问就好了。


http://www.kler.cn/news/364032.html

相关文章:

  • UE5之5.4 第一人称示例代码阅读2 子弹发射逻辑
  • sql-labs靶场第二十一关测试报告
  • 7. 配置
  • 【论文阅读】ESRGAN
  • “声音”音源设置和音效播放
  • elementui 的 table 组件回显已选数据时候使用toggleRowSelection 方法的坑点
  • 小白投资理财 - 解读市销率,市现率
  • 新电脑Win11家庭中文版跳过联网激活方法(教程)
  • Go 语言教程:8.数组
  • 毕业设计 基于STM32单片机健康检测/老人防跌倒系统 心率角度检测GSM远程报警 (程序+原理图+元件清单全套资料)
  • 基于springboot企业微信SCRM管理系统源码带本地搭建教程
  • python学习之路 - python进阶【闭包、装饰器、设计模式、多线程、socket、正则表达式】
  • centos-LAMP搭建与配置(论坛网站)
  • 20241024拿掉飞凌OK3588-C的开发板linux R4启动时的LOGO
  • NSSCTF
  • 大话红黑树之(2)源码讲解TreeMap-Java
  • 探索人工智能在自然语言处理中的应用
  • JVM学习之路(3)类加载器
  • 通过 Lighthouse 和 speed-measure-webpack 插件分析优化构建速度与体积
  • 算法通关--单调栈
  • 无废话、光速上手 React-Router
  • Anaconda从旧版本更新
  • 用nginx实现多ip访问多网址
  • Redis缓存实战-使用Spring AOP和Redis实现Dao层查询缓存优化实战
  • 云原生后端概述
  • RabbitMQ 确认模式(Acknowledgements Mode)详解