// ==UserScript== // @name Local Vk Downloader // @namespace vkDownloadAuto // @version 1.0.0 // @description Get Vk raw link without external service. // @match https://m.vk.com/mail* // @downloadURL none // ==/UserScript== var peer = null; function vkPlainGet(url, callback) { return ajax.plainpost( url, { _ajax: 1 }, (function (e) { callback(parseResponse(e)); }), (function () { callback(null) }), !0 ); } function vkGet(url, callback) { return vkPlainGet(url, function(e){ if(!e){ callback(null); return; } callback(parseResponse(e)); }); } function parseResponse(response) { if (typeof response == "string" && response.indexOf("") != -1) { return parseDialogPage(response); } return parseJSON(response); } function parseDialogPage(htmlString) { var html = parseDocumentToHtml(htmlString); var itemsContainer = html.querySelector(".items"); var items = itemsContainer.children[0]; var searchMore = itemsContainer.children[1]; return { data: [items.outerHTML, searchMore.outerHTML] } } function parseDocumentToHtml(documentString) { var htmlElement = document.createElement('html'); if (documentString.indexOf("") + 7); } htmlElement.innerHTML = documentString; return htmlElement; } function getMore(href) { vkGet(href, function (data) { receiveMore(data); }); } function getSearchMoreHref(data) { if (!data || !data[1]) { return; } var showMore = $(".show_more", $(data[1])); if (!showMore.length) { return; } var href = showMore.attr("href"); if (!href) { return null; } } function checkSearch() { var newPeer = getPeer(); if (newPeer && newPeer != peer) { getAllMedia(newPeer); } } function listenSearch() { window.setInterval(checkSearch, 500); } function getPeer() { var hash = window.location.search; var idx = hash.indexOf("peer"); if (idx == -1) { return null; } var end = hash.indexOf("&", idx); if (end == -1) { end = hash.length; } return hash.substring(idx + 5, end); } function getMediaUrl(newPeer, section) { var mediaUrlBase = "/mail?act=show_medias&peer="; var sectionUrl = "§ion="; return mediaUrlBase + newPeer + sectionUrl + section; } function recursiveGetVideos(searchMoreLink, data, finishState) { if (!searchMoreLink) { finishState.videos = true; finishSegment(data, "videos", finishState); return; } vkGet(searchMoreLink, function (result) { console.log("RECURSIVE RESULT:", result); if (result && result.data) { data.videos.concat(forEachVideoLink(result.data)); } var searchMoreLink = getSearchMoreHref(result.data); recursiveGetVideos(searchMoreLink, data, finishState); }); } function forEachVideoLink(data, callback) { var htmlElement = parseDocumentToHtml(data[0]); var items = htmlElement.querySelectorAll(".video_item"); if (!items || !items.length) { return; } for (var i = 0; i < items.length; ++i) { var item = items[i]; var itemData = {}; var previewImg = item.querySelector("img"); if (previewImg) { itemData.preview = previewImg.src; } var videoLength = item.querySelector(".thumb_label"); if (videoLength) { itemData.length = videoLength.innerText; } var videoTitle = item.querySelector(".vi_title_text"); if (videoTitle) { itemData.title = videoTitle.innerText; } var videoHref = item.querySelector(".video_href"); if (!videoHref) { continue; } itemData.href = videoHref.href; vkPlainGet(itemData.href, function (result) { var htmlElement = parseDocumentToHtml(result); var sources = htmlElement.querySelectorAll("source[type='video/mp4']"); if(!sources || !sources.length){ return; } itemData.sources = []; for(var i = 0; i < sources.length; ++i){ itemData.sources.push(sources[i].src); } callback(itemData); }); } } function getVideos(newPeer, data, finishState) { vkGet(getMediaUrl(newPeer, "video"), function (result) { if (result && result.data) { forEachVideoLink(result.data, function (item) { data.videos.push(item); }); } var searchMoreLink = getSearchMoreHref(result.data); recursiveGetVideos(searchMoreLink, data, finishState); }); } function getPhotos() { } function getDocs() { } function getAllMedia(newPeer) { console.log("***********************************ALL_MEDIA************************************") peer = newPeer; var data = { videos: [], photos: [], docs: [] } var finishState = { videos: false, photos: false, docs: false } getVideos(newPeer, data, finishState); getPhotos(newPeer, data, finishState); getDocs(newPeer, data, finishState); } function start() { var newPeer = getPeer(); if (newPeer != null) { getAllMedia(newPeer); } } function finishSegment(data, segment, finishState) { console.log(segment + ":", data[segment]); if (finishState.videos && finishState.photos && finishState.docs) { finish(data); } } function finish(data) { console.log(data); console.log("************************************FINISH**************************************") } listenSearch(); start();