【微信小程序】知乎视频一键保存

逻辑星轨
• 阅读 6164

【微信小程序】知乎视频一键保存

前言

浏览知乎的时候发现知乎里的视频没有提供保存到本地的功能。搜索了一波解决方法后,发现有个答主做的小程序应该是最佳解决方案,不过答主并没有给出实现方式。正好最近在学小程序开发,所以就研究了一下,做了一个叫"积木小盒"的微信小程序,将知乎视频下载功能实现了。

使用

仅需两步:
1.
在知乎回答页点击右上角,出现弹出框,再点击复制链接
【微信小程序】知乎视频一键保存
2.
打开"积木小盒"微信小程序,点击知乎视频。粘贴链接后,点击视频下载,即可爬取知乎回答页的所有视频并自动保存到本地相册。
【微信小程序】知乎视频一键保存

功能分析

使用小程序十分方便,一些其他解决方案比如在pc端打开网页查找元素,找到相应视频链接再下载,操作上其实比不上小程序。一方面对于非开发的小白用户来说,使用控制台查看元素其实还是有一点成本的。另一方面,这种方式需要借助pc端,无法全部在手机上操作完成,大部分用户的使用习惯还是会更倾向于在手机上便捷操作。

原理

知乎视频下载的实现原理其实和在网页中查看元素,找到视频链接下载视频的操作是一样的。它的实现分为两步:1.利用cheerio爬取视频链接 2.使用小程序下载和保存视频。很显然,第一步才是实现的关键。

1. 利用cheerio爬取视频链接

由于微信小程序访问的api地址受白名单限制,所以爬取操作都放在node.js服务端进行。我们只需要实现一个接口,传入复制的知乎链接,返回爬取的该网页链接下所有视频的下载地址。这样在爬取阶段我们只需要将服务端域名 https://www.readingblog.cn 添加到访问白名单中,而不是将各式各样的知乎域名添加到小程序白名单中。

接下来让我们看看服务端是怎么实现的:

const axios = require('axios');
const cheerio = require('cheerio');

const videoUrlPrefix = 'https://lens.zhihu.com/api/v4/videos/';

exports.urlFetchAll = async (pageUrl) => {
    const pageRes = await axios.get(pageUrl);
    const videoSrcList = [];
    if (pageRes.status === 200) {
        $ = cheerio.load(pageRes.data);
        const videoBox = $('.video-box');
        for (let i = 0, len = videoBox.length; i < len; i ++) {
            const videoPageUrl = $(videoBox[i]).attr('href');
            const params = videoPageUrl.split('/');
            const videoId = params[params.length - 1];
            const videoRes = await axios.get(`${videoUrlPrefix}${videoId}`);
            if (videoRes.status === 200) {
                const videoSrc = videoRes.data.playlist.LD.play_url;
                videoSrcList.push(videoSrc);
            }
        }
    }
    return videoSrcList;
};

还是比较容易看出它的实现思路的,这里使用了页面爬取和接口爬取相结合的方式。由于知乎网页使用了js动态渲染,爬取页面没有能够直接爬取到视频元素的链接。所以在页面爬取阶段,我们其实只获取了它的videoId。经过对整个页面元素的过滤、筛选,我们发现带video-box类名的href属性会直接带上videoId,我们直接爬取它。再通过抓包分析,我们发现只要向 https://lens.zhihu.com/api/v4... 接口传入videoId就可以返回视频的下载地址,所以通过知乎链接爬取视频下载地址的接口就实现了。

2. 使用小程序将视频保存到本地

实现了爬取接口整个功能主体就完成了,剩下的我们在微信小程序调用这个接口,传入用户输入的知乎链接地址,获取视频下载地址。再调用wx的api,downloadFile和saveVideoToPhotosAlbum分别下载和保存视频。

Page({
  data: {
    zhihuPageUrl: '',
  },
  handleUrlChange(e) {
    this.setData({
      zhihuPageUrl: e.detail.value
    })
  },
  downloadVideo() {
    const pageUrl = this.data.zhihuPageUrl;
    if (!this.data.zhihuPageUrl) {
      wx.showToast({
        title:'链接为空!',
        icon:'none',
        duration:2000
      });
      return;
    }
    wx.request({
      url: vedioFetchUrl,
      data: {
        pageUrl,
      },
      header: {
        'content-type': 'application/json'
      },
      success: (res) => {
        res = res.data;
        if (res.code === 1) {
          const total = res.data.length;
          wx.showToast({
            title:`开始下载!`,
            icon:'success',
            duration:2000
          });
          res.data.forEach((url, index) => {
            wx.downloadFile({
              url,
              success: (res) => {
                const filePath = res.tempFilePath;
                wx.saveVideoToPhotosAlbum({
                  filePath: filePath,
                  success() {
                    wx.showToast({
                      title:`${index + 1}/${total}下载成功!`,
                      icon:'success',
                      duration:2000
                    });
                  }
                })
              }
            })
          })
        } else {
          wx.showToast({
            title:'请求失败!',
            icon:'none',
            duration:2000
          });
        }
      }
    });
  },
})

"积木小盒"微信小程序

【微信小程序】知乎视频一键保存

点赞
收藏
评论区
推荐文章
samzhangjy samzhangjy
4年前
知乎文章转Markdown的艰辛历程
好吧,让我们从头说起。众所不周知,我有了我自己的博客,于是就想把我的知乎内容同步到博客上去(目前还空空如也)。但是,出于能犯懒就犯懒的原则,我决定做一个自动化程序,自动将知乎上的文章转换成Markdown食用。嗯……结果还挺满意的,就是好像时间耗费的长了一点(三个月啊,中间搁置了两个月零30天)。。总之,我Python爬虫,成功构建了一个知乎2MD全自动转换
Jacquelyn38 Jacquelyn38
4年前
SimpleMarkDown编辑器离线版以及桌面应用版上线
之前,我们开发了。今天,我们又推出了离线版和桌面应用版。主要功能:1.页面简约;2.实时保存;3.一键清空内容;4.支持微信公众号、知乎、稀土掘金、CSDN等多个平台;5.可复制HTMl格式文本;6.可复制MarkDown格式文本;7.可下载为MarkDown文件;
DevOpSec DevOpSec
4年前
《Google SRE》读后感
注:从我的知乎搬移过来,方便管理,link:《GoogleSRE》读后感(https://link.jianshu.com/?thttps://zhuanlan.zhihu.com/p/22912741?group_id815131133242134528)(https://imghelloworld.osscnbeijing.a
徐小夕 徐小夕
4年前
5分钟教你使用console.log发布公司的招聘信息
前言我们在打开百度或者知乎等网站查看源代码时,在控制台往往会看到如下图所示的信息:(https://imghelloworld.osscnbeijing
Wesley13 Wesley13
3年前
#xubuntu#字体丑的问题
!(http://static.oschina.net/uploads/space/2016/0723/145816_Ws0T_987833.jpeg)最近一直在找一个合适的虚拟机linux桌面做python开发,最后选择了xubuntu。安装完整的中文字体后,发现pycharm和其他不少应用的字体都眼瞎,在知乎找到了解决方法首先出现这个
Easter79 Easter79
3年前
TiDB 在知乎万亿量级业务数据下的实践和挑战
一、业务场景知乎从问答起步,在过去的8年中逐步成长为一个大规模的综合性知识内容平台,目前,知乎上有多达3000万个问题,共收获了超过1.3亿个回答,同时知乎还沉淀了数量众多的文章、电子书以及其他付费内容,目前注册用户数是2.2亿,这几个数字还是蛮惊人的。我们有1.3亿个回答,还有更多的专栏文章,所以如何高效的把用户最感兴
马尚 马尚
1年前
使用 Puppeteer 破解知乎滑块验证码
我们将使用Puppeteer(一个基于Chrome的Node.js库)来自动填写知乎的账号和密码,并尝试破解知乎的滑块验证码。首先,我们需要安装Puppeteer:bashnpminstallpuppeteer接下来,创建一个新的Node.js文件,例如z