微博网页中视频使用JS直接下载
JS下载微博视频
比如这个地址:https://h5.video.weibo.com/show/1034:4915132212641842,切换到手机版
发现里面视频如下:
<video id="krvwungh_176368990540664670_html5_api" class="krv-tech" tabindex="-1" autoplay="" src="//f.video.weibocdn.com/o0/9CIPKxl2lx086pDxV2bu01041202pvYd0E010.mp4?label=mp4_720p&template=1280x720.25.0&ori=0&ps=IrBRQDE1x2Uj&Expires=1763693503&ssig=qn3Vtvjtg4&KID=unistore,video" playsinline="true" webkit-playsinline="true" x5-playsinline="true"></video>然后我们先用普通的方法:
// 1. 替换为你找到的视频真实地址(MP4 格式最佳)
const videoUrl = document.getElementById('video-id').src;
// 2. 创建 <a> 标签(用于触发下载)
const a = document.createElement("a");
a.href = videoUrl;
// 3. 设置下载文件名(可自定义,比如 "我的视频.mp4")
a.download = "weibo_video.mp4";
// 4. 触发点击下载
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
console.log("下载已触发,请注意浏览器下载提示!");这时候发现,浏览器不会自动下载,而是在一个新网页打开视频,直接打开视频还是403。
这时候可以考虑在网页中将视频转换为base64然后再下载:
// 1. 获取 video 元素 (请确保这个 ID 是正确的)
const video = document.querySelector('video');
// 2. 获取视频的真实播放地址
// 优先使用 video.currentSrc,如果它为空或无效,再回退到 video.src
const videoUrl = video.currentSrc || video.src;
if (!videoUrl) {
console.error("无法找到视频地址。");
} else {
console.log("找到视频地址:", videoUrl);
// 3. 使用 fetch 下载视频数据
fetch(videoUrl)
.then(response => {
// 检查响应是否成功
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
// 将响应体转换为 Blob 对象,指定 MIME 类型为 mp4
return response.blob();
})
.then(blob => {
// 4. 创建一个临时的 URL 指向这个 Blob 对象
const blobUrl = URL.createObjectURL(blob);
// 5. 创建 <a> 标签并设置属性
const a = document.createElement('a');
a.href = blobUrl;
a.download = 'weibo_video.mp4'; // 你可以自定义文件名
// 6. 触发下载
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
// 7. (重要) 释放临时 URL,防止内存泄漏
URL.revokeObjectURL(blobUrl);
console.log("下载已触发,请注意浏览器下载提示!");
})
.catch(error => {
console.error("下载过程中出错:", error);
alert("下载失败!可能是由于跨域限制或视频地址已失效。请查看控制台了解详细信息。");
});
}将上面这段代码,复制,然后在浏览器F12控制台中直接运行即可下载视频。
如果是blob
如果视频地址是blob:https://xxx开头(比如一些加密播放的视频),直接用上面的方法会下载失败,需要先解析出真实的视频源地址。
找到<video>标签,复制它的src属性(比如blob:https://weibo.com/xxx-xxx)。
在控制台解析 blob 地址
复制下面的代码,替换blobUrl,粘贴到控制台回车,会打印出真实的视频地址:
// 1. 替换为你找到的 blob 地址
const blobUrl = "blob:https://weibo.com/xxx-xxx"; // 这里替换为你的 blob 地址
// 2. 解析 blob 地址,获取真实视频源
async function getRealVideoUrl(blobUrl) {
try {
// 创建一个临时的 video 元素
const video = document.createElement("video");
video.src = blobUrl;
// 等待视频元数据加载完成
await video.play();
await new Promise(resolve => video.onloadedmetadata = resolve);
// 获取视频的真实源地址(可能是一个或多个分段地址)
const sources = video.srcObject
? Array.from(video.srcObject.getTracks()).map(track => track.src)
: [video.currentSrc];
console.log("解析到的真实视频地址:", sources);
return sources;
} catch (error) {
console.error("解析失败:", error);
return null;
}
}
// 执行解析
getRealVideoUrl(blobUrl);解析后会在控制台打印出 1 个或多个真实视频地址(通常是 MP4 或 M3U8 格式),复制其中的 MP4 地址,再用「方法一」的下载代码执行即可。
目录