【前端甜点】某视频网站的m4s视频/音频下载方案(20240420)

引言

Sample:aHR0cHM6Ly93d3cuYmlsaWJpbGkuY29tL3ZpZGVvL0JWMWZKNDExUTdWeA==

我在很久以前写过一个小脚本,发XHR请求来获取某视频网站的m4s视频和音频:

// 唯一要改变的就是url(url must be https),a.download是文件名,只有Chrome和Firefox可用
function downloader(url, fname, rangeStart = 0) {
  let xhr = new XMLHttpRequest();
  xhr.open('GET', url, true);
  xhr.responseType = 'blob';
  // 啥请求头都没法设置:xhr.setRequestHeader("client_type", "DESKTOP_WEB");
  xhr.setRequestHeader('Range', `bytes=${rangeStart}-`);
  xhr.onload = function () {
    if (this.status === 200 || this.status === 206) {
      let blob = new Blob([this.response]);
      const blobUrl = window.URL.createObjectURL(blob);
      let a = document.createElement('a');
      a.download = fname;
      a.target = '_blank';
      a.href = blobUrl;
      console.log(a.href, this.response);
      document.body.append(a);
      a.click();
    }
  };
  xhr.send();
}

// 下载音频(复制到console里,注意分2次执行)
downloader('<m4s audio>', '1.mp3');
downloader('<m4s video>', '1.mp4');

从20年到上个月为止,it just works well。但20240420开始,不知道是Chrome浏览器升级还是什么原因,二进制数据包装的Blob对象转化为a标签后域名变成了https://www.example.comhttps://www.example.com/...,无法方便地下载m4s了,于是这个脚本不能用了。这个原因我一直都没找到。

作者:hans774882968以及hans774882968以及hans774882968

本文52pojie:https://www.52pojie.cn/thread-1915933-1-1.html

本文juejin:https://juejin.cn/post/7359821247676334115

本文CSDN:https://blog.csdn.net/hans774882968/article/details/138015611

正文

好在我很快又摸索出了一个稍微麻烦点的路子:先在浏览器控制台运行JS代码,获取base64字符串,然后在本地用python把它转为mp3。

在上述古老的脚本里,我将XHR返回的类型指定为Blob了,因此我需要将其转为base64字符串。最后我找到的API是FileReaderscrapt_m4s_new.js

// https://www.cnblogs.com/Sherries/p/14840404.html
function blobToDataURI(blob) {
  return new Promise((res, rej) => {
    const reader = new FileReader();
    reader.readAsDataURL(blob);
    reader.onload = (e) => {
      res(e.target.result);
    };
    reader.onerror = () => {
      rej(new Error('文件流异常'));
    };
  });
}

// 唯一要改变的就是url(url must be https),a.download是文件名,只有Chrome和Firefox可用
function sendXhrReq(url, rangeStart = 0) {
  return new Promise((res, rej) => {
    const xhr = new XMLHttpRequest();
    xhr.open('GET', url, true);
    xhr.responseType = 'blob';
    // 啥请求头都没法设置:xhr.setRequestHeader("client_type", "DESKTOP_WEB");
    xhr.setRequestHeader('Range', `bytes=${rangeStart}-`);
    xhr.onload = function () {
      if (this.status === 200 || this.status === 206) {
        res(this.response);
        return;
      }
      rej(`xhr error: ${this.status} ${this.response}`)
    };
    xhr.send();
  })
}

async function downloader(url, rangeStart = 0) {
  const blob = await sendXhrReq(url, rangeStart);
  console.log(blob); // type is Blob
  const dataURI = await blobToDataURI(blob);
  // data:application/octet-stream;base64,
  const rawBase64Str = String(dataURI);
  const base64Str = rawBase64Str.substring(rawBase64Str.indexOf('base64,') + 7);
  console.log(rawBase64Str.substring(0, 100));
  console.log(base64Str); // 之后在浏览器控制台复制字符串,粘贴到 base64_str_m4s.txt
}

downloader('<m4s file url>');

base64_str_to_m4s.py

import base64


def main():
    with open('base64_str_m4s.txt', 'r', encoding='utf-8') as f_in:
        inp = f_in.read()
        data = base64.b64decode(inp)
        with open('1.mp3', 'wb') as f_out:
            f_out.write(data)


if __name__ == '__main__':
    main()

福利:赠送mp3截取代码mp3_clip.py,使用的是moviepy

from moviepy.editor import AudioFileClip
import os


def clip_audio(fname, st, ed=None):
    audio = AudioFileClip(fname).subclip(st, ed)
    out_file_name = f'{os.path.splitext(fname)[0]}-out.mp3'
    audio.write_audiofile(out_file_name)


def main():
    clip_audio('1.mp3', 3.5)


if __name__ == '__main__':
    main()

参考资料

  1. blobToDataURI:https://www.cnblogs.com/Sherries/p/14840404.html
  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Boot是一个用于创建独立的、基于Spring的应用程序的框架。它简化了Spring应用程序的开发过程,提供了自动配置和约定优于配置的原则。通过使用Spring Boot,您可以快速搭建一个甜品网站。 以下是使用Spring Boot创建甜品网站的步骤: 1. 创建Spring Boot项目:使用Spring Initializr创建一个新的Spring Boot项目。在项目中添加所需的依赖,如Spring Web、Spring Data JPA等。 2. 设计数据库模型:根据甜品网站的需求,设计数据库模型。创建实体类来表示甜品、用户、购物车等。 3. 创建控制器:创建控制器类来处理用户的请求。例如,创建一个甜品控制器来处理甜品信息的展示和操作。 4. 创建服务层:创建服务层类来处理业务逻辑。例如,创建一个甜品服务类来处理甜品的增删改查操作。 5. 创建数据访问层:创建数据访问层接口和实现类来操作数据库。使用Spring Data JPA简化数据库操作。 6. 创建视图:创建HTML模板或使用前端框架来设计甜品网站的前台页面。根据需求,创建首页、甜品信息、通知公告、留言板、个人中心、购物车、在线客服等页面。 7. 实现用户注册和登录功能:根据需求,实现用户注册和登录功能。可以使用Spring Security来处理用户认证和授权。 8. 集成第三方支付:如果需要实现在线购买功能,可以集成第三方支付接口,如支付宝、微信支付等。 9. 部署和发布:将甜品网站部署到服务器上,并发布给用户访问。 这是一个简单的示例,您可以根据具体需求进行更详细的设计和实现。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值