Greasy Fork is available in English.
应对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);
})();