xgqfrms™, xgqfrms® : xgqfrms's offical website of cnblogs! xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

Web 服务端如何实现禁用视频下载 All In One

Web 服务端如何实现禁用视频下载 All In One

difficulty: Medium / 难度: 中等

破解微信公众号禁用视频下载

  1. 破解 HTML5 video controlslist="nodownload", 禁用 controls 显示下载选项 ✅
// 开发者工具 定位 DOM 节点 body, 右键存储为全局变量 temp

// 动态插入 HTML 字符串(修正后的)
temp.insertAdjacentHTML(`beforeend`, `<video src="https://mpvideo.qpic.cn/0bc3buacaaaaoeao2nbjnftfadodeagqaiaa.f10002.mp4?dis_k=b99f5a70d922f3c0ad790806e4493429&amp;dis_t=1719720823&amp;play_scene=10120&amp;auth_info=d9qL3b9UEn5IwuHR2GsxGU0OGiMjN1NlSRMmXXIxfU5MZyhPaWYodR05DzFCD3IgQhpM&amp;auth_key=d18de2a426308feab5f87263c068c1b9&amp;vid=wxv_3429654558707007491&amp;format_id=10002&amp;support_redirect=0&amp;mmversion=false" crossorigin="anonymous" controls></video>`)

temp.insertAdjacentHTML(`beforeend`, `<video src="https://mpvideo.qpic.cn/0bc3buacaaaaoeao2nbjnftfadodeagqaiaa.f10002.mp4?dis_k=b99f5a70d922f3c0ad790806e4493429&amp;dis_t=1719720823&amp;play_scene=10120&amp;auth_info=d9qL3b9UEn5IwuHR2GsxGU0OGiMjN1NlSRMmXXIxfU5MZyhPaWYodR05DzFCD3IgQhpM&amp;auth_key=d18de2a426308feab5f87263c068c1b9" crossorigin="anonymous" controls></video>`)

  1. 点击下载视频时候,服务端会自动返回 .txt 错误文件, 导致下载失败 ❌ (❓待破解)

image

https://mp.weixin.qq.com/s/MrT7EWxwJ5JWEzPB90wShg#:~:text=01%3A18-,视频时长,-:1分18

demos

(🐞 反爬虫测试!打击盗版⚠️)如果你看到这个信息, 说明这是一篇剽窃的文章,请访问 https://www.cnblogs.com/xgqfrms/ 查看原创文章!

Node.js 如何在服务端实现禁用视频下载功能

原理分析:
服务端识别出客户端的下载请求
服务端返回错误文件类型,导致下载资源找不到,从而导致下载失败

疑问:
如何实现可以正常播放视频,但无法下载视频

  1. 流媒体,授权 token
  2. 禁用 非授权 iframe 和 批量下载

微信公众号,点击下载视频时候,服务端会自动返回 .txt 错误文件, 导致下载失败

image

https://www.cnblogs.com/xgqfrms/p/18276259#:~:text=com/s/MrT7EWxwJ5JWEzPB90wShg-,破解微信禁用视频下载,-破解 HTML5 video

Content-Disposition

Node.js 服务器控制浏览器下载文件还是预览文件


"use strict";

/**
 *
 * @author xgqfrms
 * @license MIT
 * @copyright xgqfrms
 * @created 2022-04-17
 * @modified
 *
 * @description
 * @augments
 * @example
 * @link
 * @solutions
 *
 *
 */

var fs = require('fs');
var path = require("path");

var express = require("express");
var app = express();


const log = console.log;

app.get("/", function(req,res) {
    var filename = 'logo.png';
    var filepath = path.join(__dirname, `./${filename}`);
    // console.log('__dirname', __dirname);
    // console.log('dir', dir);
    // ReferenceError: dir is not defined
    const dir = '/Users/xgqfrms-mbp/Documents/GitHub/learn-typescript-by-practice/000-xyz/download-preview/'
    console.log('filepath', filepath.replace(dir, ''));
    fs.readFile(filepath, function(err, data){
      res.set({
        'Content-Type': 'application/octet-stream',
        // 告诉浏览器这是一个二进制文件,浏览器不需要执行该文件,直接作为附件弹出下载对话框即可 ✅
        'Content-Disposition': `attachment; filename=${filename}`,
        // 告诉浏览器这是一个附件要下载是png图片
      });
      console.log('data =', data);
      res.end(data);
    });
});

app.get("/cdn", function(req,res) {
    // node.js render remote url file
    // cdn url ???
    const url = `https://cdn.xgqfrms.xyz/logo/icon.png`;
    var filename = 'logo.png';
    var filepath = path.join(__dirname, `./${filename}`);
    // log('__dirname', __dirname);
    fs.readFile(filepath, function(err, data){
      res.set({
        'Content-Type': 'application/octet-stream',
        // 告诉浏览器这是一个二进制文件,浏览器不需要执行该文件,直接作为附件弹出下载对话框即可 ✅
        'Content-Disposition': `attachment; filename=${filename}`,
        // 告诉浏览器这是一个附件要下载是png图片
      });
      console.log('data =', data);
      res.end(data);
    });
});

const port = 3000;
app.listen(port, function(){
  console.log(`server is running: http://localhost:${port}`);
});

https://www.cnblogs.com/xgqfrms/p/17533694.html

https://www.cnblogs.com/xgqfrms/p/16155131.html

refs

https://www.cnblogs.com/xgqfrms/p/16371270.html

https://www.cnblogs.com/xgqfrms/p/18276259



©xgqfrms 2012-2021

www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!

原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!


posted @ 2024-07-02 14:27  xgqfrms  阅读(7)  评论(1编辑  收藏  举报