FB资料库视频下载插件

应对2024年2月1日fb资料库视频和无法右键下载的问题。 -脚本随缘更新

// ==UserScript==
// @name         FB资料库视频下载插件
// @namespace    http://tampermonkey.net/
// @version      0.30
// @description  应对2024年2月1日fb资料库视频和无法右键下载的问题。 -脚本随缘更新
// @author       LYL
// @icon         https://www.google.com/s2/favicons?sz=64&domain=facebook.com
// @include     *://www.facebook.com/ads/library/*
// @license MIT
// @grant        none
// ==/UserScript==

(function() {
    'use strict';


// 创建一个函数来添加下载按钮
function addDownloadButtonsToVideos() {
    // 找到所有符合条件的视频标签
    var videoElements = document.querySelectorAll('.x1lliihq.x5yr21d.xh8yej3');

    // 遍历每个视频标签
    videoElements.forEach(function(videoElement) {
        // 检查是否已经添加了下载按钮
        if (videoElement.parentElement.querySelector('.download-button')) {
            return; // 如果已经存在按钮,则不重复添加
        }

        // 创建下载按钮
        var downloadButton = document.createElement('button');
        downloadButton.innerText = '下载';
        downloadButton.className = 'download-button';
        downloadButton.style.position = 'absolute';
        downloadButton.style.top = '0';
        downloadButton.style.right = '0';
        downloadButton.style.zIndex = '999';

        // 获取视频链接
        var videoSrc = videoElement.getAttribute('src');

        // 检查 videoSrc 是否为 null
        if (videoSrc === null) {
            console.error('Video source is null. Skipping download button creation.');
            return;
        }

        // 提取文件名部分
        var fileNameMatch = videoSrc.match(/\/([^\/?#]+)(?:[?#]|$)/);
        var fileName = fileNameMatch !== null ? fileNameMatch[1] : 'video.mp4';

        // 添加点击事件,点击时触发下载
        downloadButton.addEventListener('click', function() {
            // 创建一个隐藏的链接并设置下载属性
            var xhr = new XMLHttpRequest();
            xhr.open("GET", videoSrc, true);
            xhr.responseType = "blob";

            xhr.onload = function () {
                var blob = new Blob([xhr.response], { type: "video/mp4" });

                // 创建一个隐藏的链接并设置下载属性
                var downloadLink = document.createElement('a');
                downloadLink.href = window.URL.createObjectURL(blob);
                downloadLink.download = fileName;

                // 添加链接到页面并触发点击
                document.body.appendChild(downloadLink);
                downloadLink.click();

                // 移除链接
                document.body.removeChild(downloadLink);
            };

            xhr.send();
        });
        // 添加鼠标悬停提示
        downloadButton.title = '若想下载高清版本请手动点击齿轮将视频清晰度切换成HD';
        // 将按钮添加到视频元素上
        videoElement.parentElement.appendChild(downloadButton);

        // 监听视频源链接的变化
        var observer = new MutationObserver(function(mutationsList, observer) {
            // 检查视频源链接是否发生变化
            var newSrc = videoElement.getAttribute('src');
            if (newSrc !== videoSrc) {
                // 更新 videoSrc
                videoSrc = newSrc;
                // 创建下载 HD 按钮
                var downloadHDButton = document.createElement('button');
                downloadHDButton.innerText = '下载HD';
                downloadHDButton.className = 'download-hd-button';
                downloadHDButton.style.position = 'absolute';
                downloadHDButton.style.top = '0';
                downloadHDButton.style.right = '60px'; // 调整位置
                downloadHDButton.style.zIndex = '999';

                // 添加点击事件,点击时触发下载 HD
                downloadHDButton.addEventListener('click', function() {
                    // 创建一个隐藏的链接并设置下载属性
                    var xhr = new XMLHttpRequest();
                    xhr.open("GET", newSrc, true);
                    xhr.responseType = "blob";

                    xhr.onload = function () {
                        var blob = new Blob([xhr.response], { type: "video/mp4" });

                        // 创建一个隐藏的链接并设置下载属性
                        var downloadLink = document.createElement('a');
                        downloadLink.href = window.URL.createObjectURL(blob);
                        downloadLink.download = fileName.replace('.mp4', '_HD.mp4'); // 添加_HD到文件名前面

                        // 添加链接到页面并触发点击
                        document.body.appendChild(downloadLink);
                        downloadLink.click();

                        // 移除链接
                        document.body.removeChild(downloadLink);
                    };

                    xhr.send();
                });

                // 将 HD 按钮添加到视频元素上
                videoElement.parentElement.appendChild(downloadHDButton);
            }
        });

        // 配置观察选项并开始观察视频源链接的变化
        observer.observe(videoElement, { attributes: true, attributeFilter: ['src'] });
    });
}

// 创建定时器来定时执行添加下载按钮的函数
var timer = setInterval(addDownloadButtonsToVideos, 3000);


})();