- Открыть страницу с видео, видеоплеер должен быть виден на странице
- Открыть средства разработчика в браузере (F12), открыть вкладку с консолью
- Выполнить:
document.querySelector('vk-video-player').store.actions.internal.downloadVideo()
-
-
Save tsvtt/65f335fde4f873b7d2702e7294334194 to your computer and use it in GitHub Desktop.
Thank you!!!!
Спасибо!
const players = document.querySelectorAll('vk-video-player'); const first = players[0]; const second = players[1];
//second.store.actions.internal.downloadVideo()
На случай если в посте несколько видео
Вывод консоли: undefined
ЧЯДНТ?
const players = window.document.querySelectorAll('vk-video-player');
const first = players[0];
const second = players[1];
//second.store.actions.internal.downloadVideo()
undefined((
undefined((
По идее метод просто возвращает undefined, но само видео должно начать скачиваться. У меня всё прекрасно качается и возвращается undefined
У меня нет. Воспользовался:
pip install boosty-downloader
спасибо!!!!!!
Четко)
У меня нет. Воспользовался:
pip install boosty-downloader
Спасибо, что пользуетесь моим детищем ❤️
Сделано с любовью: https://github.com/Glitchy-Sheep/boosty-downloader
Код выводит в консоль все найденные видео на странице, ссылки на разное качество этих видео
Бусти использует ВКшный плеер, из него можно вытянуть всё и вся, да и у бусти весь state лежит в одном месте, тоже легко достать всё что нужно
(() => {
const stateEl = document.getElementById('initial-state');
if (!stateEl) {
console.error('❌ initial-state не найден');
return;
}
const state = JSON.parse(stateEl.textContent);
const posts = state?.posts?.postsList?.data?.posts || [];
if (!posts.length) {
console.error('❌ Посты не найдены');
return;
}
const qualityMap = {
ultra_hd: '2160p',
quad_hd: '1440p',
full_hd: '1080p',
high: '720p',
medium: '480p',
low: '360p',
lowest: '240p',
tiny: '144p'
};
// Красивое форматирование длительности
const formatDuration = (sec) => {
if (!sec && sec !== 0) return '?';
const h = Math.floor(sec / 3600);
const m = Math.floor((sec % 3600) / 60);
const s = Math.floor(sec % 60);
if (h > 0) return `${h}:${String(m).padStart(2, '0')}:${String(s).padStart(2, '0')}`;
return `${m}:${String(s).padStart(2, '0')}`;
};
let videoIndex = 0;
posts.forEach((post, postIdx) => {
const postTitle = post.title || post.data?.find(x => x.type === 'text')?.content || `Пост #${postIdx + 1}`;
const videos = (post.data || []).filter(item => item.type === 'ok_video' && item.playerUrls);
if (!videos.length) return;
videos.forEach((video, vIdx) => {
videoIndex++;
const videoTitle = video.title || `Видео ${vIdx + 1}`;
const duration = formatDuration(video.duration);
console.log(`\n%c🎬 [${videoIndex}] ${videoTitle}`, 'font-size:14px; font-weight:bold; color:#0f0');
console.log(`%c📌 Пост: ${postTitle}`, 'color:#aaa');
console.log(`%c⏱ Длительность: ${duration} | ID: ${video.id || video.vid || '—'}`, 'color:#888');
const qualities = video.playerUrls
.filter(u => u.url && qualityMap[u.type])
.sort((a, b) => {
const order = ['ultra_hd','quad_hd','full_hd','high','medium','low','lowest','tiny'];
return order.indexOf(a.type) - order.indexOf(b.type);
});
if (!qualities.length) {
console.log('%c Нет прямых ссылок', 'color:#f55');
return;
}
qualities.forEach(q => {
console.log(` %c${qualityMap[q.type].padEnd(6)}`, 'color:#0af; font-weight:bold', q.url);
});
const hls = video.playerUrls.find(u => u.type === 'hls' && u.url);
const dash = video.playerUrls.find(u => u.type === 'dash' && u.url);
if (hls) console.log(` %cHLS `, 'color:#fa0; font-weight:bold', hls.url);
if (dash) console.log(` %cDASH `, 'color:#fa0; font-weight:bold', dash.url);
});
});
if (videoIndex === 0) {
console.log('%c❌ Видео типа ok_video на странице не найдено', 'color:#f55');
} else {
console.log(`\n%c✅ Найдено видео: ${videoIndex}`, 'font-weight:bold; color:#0f0');
}
})();
Thank you