巨量下载

巨量广告视频下载

目前为 2022-03-11 提交的版本。查看 最新版本

// ==UserScript==
// @name         巨量下载
// @namespace    http://tampermonkey.net/
// @version      2.2.3
// @description  巨量广告视频下载
// @author       hayasol657
// @run-at       document-start
// @license      MIT License
// @grant        GM_download
// @include      *://cc.oceanengine.com/*
// @inject-into  page
// @require      https://greasyfork.org/scripts/440006-mono/code/mono.js?version=1026816
// ==/UserScript==

(function () {
    var mono = window['mono-descargar'];
    var failover = mono.FAIL_TO_DEFAULT;
    var $ = mono.jQuery;
    var md5 = mono.md5;
    var onRequest = mono.onRequest;
    var filename = mono.filename;

    var metaDict = {};
    var metaMap = { materials: 'material', items: 'douyin' };
    onRequest(({url, resp}) => {
        if (!resp) return;
        for (const key of Object.keys(metaMap)) {
            var prefix = `creative_radar_api/v1/${metaMap[key]}`;
            if (!url.includes(`${prefix}/info`) && 
                !url.includes(`${prefix}/list`)) continue;
            var res = JSON.parse(resp);
            if (res?.data && typeof res.data === 'object' && 'vid' in res.data) {
                res.data = { [key]: [res.data] };
            }
            if (res?.data && typeof res.data === 'object' &&
                key in res.data && res.data[key].length > 0) {
                const feeds = res.data[key];
                for (var i = 0; i < feeds.length; i++) {
                    const id = feeds[i].vid;
                    if (metaDict[id]) continue;
                    feeds[i].id = id;
                    metaDict[id] = feeds[i];
                }
            }
        }
    });

    var updateItems = async (items) => {
        if (items.length <= 0) return;
        return new Promise((resolve, reject) => {
            $.ajax({
                url: "https://cc.oceanengine.com/creative_content_server/api/video/info",
                type: 'POST',
                data: JSON.stringify({ "query_ids": items.map(im => im.meta.vid), "water_mark": 'ad' }),
                success: function (data) {
                    if (data?.data && Object.keys(data?.data).length > 0) {
                        items.forEach(item => {
                            item.url = data.data[item.meta.vid].video_url;
                            item.meta.video = data.data[item.meta.vid];
                            item.meta.cover = data.data[item.meta.vid].cover_url;
                            item.meta.title = item.meta.bestTitle || item.meta.item_title;
                            item.meta.name = filename(item.meta.title || document?.title);
                        });
                    }
                    resolve(items)
                },
                error: function (error) {
                    reject(error)
                },
            });
        });
    }

    var getItemByMeta = (meta) => {
        if (!meta || !meta.id) return null;
        if ($(`[mono-dsg-id=${meta.id}]`).length > 0) return null;
        return { id: meta.id, url: "", meta };
    }

    var detail = async (style) => {
        const mid = Object.keys(metaDict)[0];
        const item = getItemByMeta(metaDict[mid])
        if (item) {
            var $el = $(`.${style}`).find(".cc-video-player");
            if ($el.length > 0) {
                await updateItems([item]);
                item.container = $el[0];
                console.log(item);
                return [item];
            }
        }
        return [];
    }

    var list = async () => {
        const items = []
        for (const [id, meta] of Object.entries(metaDict)) {
            const imgUrl = new URL(meta.head_image_uri);
            const item = getItemByMeta(meta);
            if (item) {
                var $el = $(`.poster-image[style*='${imgUrl.pathname}']`).parent();
                if ($el.length > 0) {
                    item.container = $el[0];
                    items.push(item);
                }
            }
            if (items.length >= 10) break;
        }

        if (items.length > 0) {
            await updateItems(items);
        }

        return items;
    }

    var parser = async function () {
        var url = new URL(window.location.href);
        var lists = [
            "/inspiration/creative-radar/video", 
            "/inspiration/douyin/content"
        ];
        var ccdetail = "/inspiration/creative-radar/detail/";
        var dydetail = "/inspiration/douyin-detail/";
        if (lists.includes(url.pathname)) {
            return await list();
        } else if (url.pathname.indexOf(ccdetail) > -1) {
            return await detail('radar-detail-preview-box');
        } else if (url.pathname.indexOf(dydetail) > -1) {
            return await detail('creative-douyin-detail-info');
        } else {
            throw failover;
        }
    }

    if (mono?.init) mono.init({ parser });
})()