Local Vk Downloader

Get Vk raw link without external service.

Από την 24/04/2020. Δείτε την τελευταία έκδοση.

// ==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*
// ==/UserScript==
var peer = null;

function vkPlainGet(url, callback) {
    return ajax.plainpost(
        url,
        { _ajax: 1 },
        (function (e) {
            callback(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("<!DOCTYPE html>") != -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("<body") != -1) {
        documentString = documentString.substring(documentString.indexOf("<body"), documentString.indexOf("</body>") + 7);
    }
    htmlElement.innerHTML = documentString;
    return htmlElement;
}

function getMore(href) {
    vkGet(href, function (data) {
        receiveMore(data);
    });
}

function getSearchMoreHref(data) {
    if (!data || !data[1]) {
        return;
    }
    var htmlElement = parseDocumentToHtml(data[1]);
    if (!htmlElement) {
        return;
    }
    var showMore = htmlElement.querySelector(".show_more");
    if (!showMore) {
        return;
    }
    var href = showMore.href;
    if (!href) {
        return null;
    }
    return href;
}

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 = "&section=";
    return mediaUrlBase + newPeer + sectionUrl + section;
}

function recursiveGetVideos(searchMoreLink, data, finishState) {
    if (!searchMoreLink) {
        finishState.videos = true;
        finishSegment(data, "videos", finishState);
        return;
    }
    vkGet(searchMoreLink, function (result) {
        if (!result || !result.data) {
            finishSegment(data, "videos", finishState);
            return;
        }
        getVideosLinks(result.data, function (items) {
            data.videos.concat(items);
            var searchMoreLink = getSearchMoreHref(result.data);
            recursiveGetVideos(searchMoreLink, data, finishState);
        })
    });
}

function getVideosLinks(data, callback) {
    var htmlElement = parseDocumentToHtml(data[0]);
    var items = htmlElement.querySelectorAll(".video_item");
    if (!items || !items.length) {
        return;
    }
    var videos = [];
    var fetchLinksCount = items.length;
    var reduceFetched = function () {
        --fetchLinksCount;
        if (fetchLinksCount == 0) {
            callback(videos);
        }
    }
    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) {
            reduceFetched();
            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) {
                reduceFetched();
                return;
            }
            itemData.sources = [];
            for (var i = 0; i < sources.length; ++i) {
                itemData.sources.push(sources[i].src);
            }
            videos.push(itemData);
            reduceFetched();
        });
    }
}

function getVideos(newPeer, data, finishState) {
    vkGet(getMediaUrl(newPeer, "video"), function (result) {
        if (!result || !result.data) {
            finishSegment(data, "videos", finishState);
            return;
        }
        getVideosLinks(result.data, function (item) {
            data.videos.concat(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();
长期地址
遇到问题?请前往 GitHub 提 Issues,或加Q群1031348184

赞助商

Fishcpy

广告

Rainyun

注册一下就行

Rainyun

一年攒够 12 元