Greasy Fork

一键下载 4399, 7k7k flash游戏 + flash 播放器

✨一键下载 4399, 7k7k flash 游戏, 并提供 flash 播放器✨

当前为 2022-06-21 提交的版本,查看 最新版本

// ==UserScript==
// @name         一键下载 4399, 7k7k flash游戏 + flash 播放器
// @description  ✨一键下载 4399, 7k7k flash 游戏, 并提供 flash 播放器✨
// @namespace    https://fcmsb250.github.io/
// @version      0.2.1
// @author       mininb666 https://greasyfork.org/zh-CN/users/822325-mininb666 / dsy4567 https://github.com/dsy4567
// @license      GPL-3.0
// @run-at       document-start

// @match        *://*.4399.com/*
// @match        *://*.7k7k.com/*

// @connect      *.4399.com
// @connect      *.7k7k.com

// @grant        GM_addValueChangeListener
// @grant        GM_openInTab
// @grant        GM_registerMenuCommand
// @grant        GM_setValue
// @grant        unsafeWindow
// @require      https://code.jquery.com/jquery-3.6.0.min.js

// @homepageURL  https://fcmsb250.github.io/
// @supportURL   https://github.com/dsy4567/Fucking-Anti-Indulgence/

// ==/UserScript==

try {
    Object.defineProperty(unsafeWindow, "showBlockFlashIE", {
        value: ()=>{},
        writable: false,
    });
} catch (e) {}
try {
    Object.defineProperty(unsafeWindow, "showBlockFlash", {
        value: ()=>{},
        writable: false,
    });
} catch (e) {}

// ==download.js==

//download.js v4.2, by dandavis; 2008-2016. [CCBY2] see http://danml.com/download.html for tests/usage
// v1 landed a FF+Chrome compat way of downloading strings to local un-named files, upgraded to use a hidden frame and optional mime
// v2 added named files via a[download], msSaveBlob, IE (10+) support, and window.URL support for larger+faster saves than dataURLs
// v3 added dataURL and Blob Input, bind-toggle arity, and legacy dataURL fallback was improved with force-download mime and base64 support. 3.1 improved safari handling.
// v4 adds AMD/UMD, commonJS, and plain browser support
// v4.1 adds url download capability via solo URL argument (same domain/CORS only)
// v4.2 adds semantic variable names, long (over 2MB) dataURL support, and hidden by default temp anchors
// https://github.com/rndme/download

(function (root, factory) {
    if (typeof define === "function" && define.amd) {
        // AMD. Register as an anonymous module.
        define([], factory);
    } else if (typeof exports === "object") {
        // Node. Does not work with strict CommonJS, but
        // only CommonJS-like environments that support module.exports,
        // like Node.
        module.exports = factory();
    } else {
        // Browser globals (root is window)
        root.download = factory();
    }
})(this, function () {
    return function download(data, strFileName, strMimeType) {
        var self = window, // this script is only for browsers anyway...
            defaultMime = "application/octet-stream", // this default mime also triggers iframe downloads
            mimeType = strMimeType || defaultMime,
            payload = data,
            url = !strFileName && !strMimeType && payload,
            anchor = document.createElement("a"),
            toString = function (a) {
                return String(a);
            },
            myBlob = self.Blob || self.MozBlob || self.WebKitBlob || toString,
            fileName = strFileName || "download",
            blob,
            reader;
        myBlob = myBlob.call ? myBlob.bind(self) : Blob;

        if (String(this) === "true") {
            //reverse arguments, allowing download.bind(true, "text/xml", "export.xml") to act as a callback
            payload = [payload, mimeType];
            mimeType = payload[0];
            payload = payload[1];
        }

        if (url && url.length < 2048) {
            // if no filename and no mime, assume a url was passed as the only argument
            fileName = url.split("/").pop().split("?")[0];
            anchor.href = url; // assign href prop to temp anchor
            if (anchor.href.indexOf(url) !== -1) {
                // if the browser determines that it's a potentially valid url path:
                var ajax = new XMLHttpRequest();
                ajax.open("GET", url, true);
                ajax.responseType = "blob";
                ajax.onload = function (e) {
                    download(e.target.response, fileName, defaultMime);
                };
                setTimeout(function () {
                    ajax.send();
                }, 0); // allows setting custom ajax headers using the return:
                return ajax;
            } // end if valid url?
        } // end if url?

        //go ahead and download dataURLs right away
        if (/^data\:[\w+\-]+\/[\w+\-]+[,;]/.test(payload)) {
            if (payload.length > 1024 * 1024 * 1.999 && myBlob !== toString) {
                payload = dataUrlToBlob(payload);
                mimeType = payload.type || defaultMime;
            } else {
                return navigator.msSaveBlob // IE10 can't do a[download], only Blobs:
                    ? navigator.msSaveBlob(dataUrlToBlob(payload), fileName)
                    : saver(payload); // everyone else can save dataURLs un-processed
            }
        } //end if dataURL passed?

        blob = payload instanceof myBlob ? payload : new myBlob([payload], { type: mimeType });

        function dataUrlToBlob(strUrl) {
            var parts = strUrl.split(/[:;,]/),
                type = parts[1],
                decoder = parts[2] == "base64" ? atob : decodeURIComponent,
                binData = decoder(parts.pop()),
                mx = binData.length,
                i = 0,
                uiArr = new Uint8Array(mx);

            for (i; i < mx; ++i) uiArr[i] = binData.charCodeAt(i);

            return new myBlob([uiArr], { type: type });
        }

        function saver(url, winMode) {
            if ("download" in anchor) {
                //html5 A[download]
                anchor.href = url;
                anchor.setAttribute("download", fileName);
                anchor.className = "download-js-link";
                anchor.innerHTML = "downloading...";
                anchor.style.display = "none";
                document.body.appendChild(anchor);
                setTimeout(function () {
                    anchor.click();
                    document.body.removeChild(anchor);
                    if (winMode === true) {
                        setTimeout(function () {
                            self.URL.revokeObjectURL(anchor.href);
                        }, 250);
                    }
                }, 66);
                return true;
            }

            // handle non-a[download] safari as best we can:
            if (/(Version)\/(\d+)\.(\d+)(?:\.(\d+))?.*Safari\//.test(navigator.userAgent)) {
                url = url.replace(/^data:([\w\/\-\+]+)/, defaultMime);
                if (!window.open(url)) {
                    // popup blocked, offer direct download:
                    if (
                        confirm(
                            "Displaying New Document\n\nUse Save As... to download, then click back to return to this page."
                        )
                    ) {
                        location.href = url;
                    }
                }
                return true;
            }

            //do iframe dataURL download (old ch+FF):
            var f = document.createElement("iframe");
            document.body.appendChild(f);

            if (!winMode) {
                // force a mime that will download:
                url = "data:" + url.replace(/^data:([\w\/\-\+]+)/, defaultMime);
            }
            f.src = url;
            setTimeout(function () {
                document.body.removeChild(f);
            }, 333);
        } //end saver

        if (navigator.msSaveBlob) {
            // IE10+ : (has Blob, but not a[download] or URL)
            return navigator.msSaveBlob(blob, fileName);
        }

        if (self.URL) {
            // simple fast and modern way using Blob and URL:
            saver(self.URL.createObjectURL(blob), true);
        } else {
            // handle non-Blob()+non-URL browsers:
            if (typeof blob === "string" || blob.constructor === toString) {
                try {
                    return saver("data:" + mimeType + ";base64," + self.btoa(blob));
                } catch (y) {
                    return saver("data:" + mimeType + "," + encodeURIComponent(blob));
                }
            }

            // Blob but not URL support:
            reader = new FileReader();
            reader.onload = function (e) {
                saver(this.result);
            };
            reader.readAsDataURL(blob);
        }
        return true;
    }; /* end download() */
});

// ==/download.js==

// ==Fucking-Anti-Indulgence.user.js==

/**
 * @name 🎇🎇🎇防沉迷减点料🎇🎇🎇
 * @author mininb666 https://greasyfork.org/zh-CN/users/822325-mininb666 / dsy4567 https://github.com/dsy4567
 * @license GPL-3.0
 */

/**
 *
 * @param {String} 开始
 * @param {String} 结束
 * @param {String} 值
 * @param {String} 类型 "1": url, "2": 字母+数字, "3": 数字
 * @param {String} 前面追加
 * @returns {String}
 */
function 获取中间(开始, 结束, 值, 类型, 前面追加) {
    if (开始 && !值.indexOf(开始) != -1) {
        值 = 值.substring(值.indexOf(开始) + 开始.length);
    }
    if (结束) {
        值 = decodeURI(值.substring(0, 值.indexOf(结束)));
    }
    if (前面追加) {
        值 = 前面追加 + 值;
    }
    switch (类型) {
        case "1":
            if (
                !(
                    值.substring(0, 2) == "//" ||
                    值.substring(0, 7) == "http://" ||
                    值.substring(0, 8) == "https://"
                )
            ) {
                throw new Error("不正确的字符串");
            }
            break;
        case "2":
            if (!/^[0-9a-zA-Z]*$/g.test(值)) {
                throw new Error("不正确的字符串");
            }
            break;
        case "3":
            if (isNaN(Number(值))) {
                throw new Error("不正确的字符串");
            }
            break;

        default:
            break;
    }
    return 值;
}

// ==/Fucking-Anti-Indulgence.user.js==

(() => {
    if (self == top) {
        GM_registerMenuCommand("注意: 请勿直接下载 h5 游戏");
        GM_registerMenuCommand("注意: 请勿在下载时同时打开其它游戏");
        GM_registerMenuCommand("注意: 建议在游戏加载完成后下载游戏");
        GM_registerMenuCommand("注意: 若等待时间过长则说明下载失败");
        GM_registerMenuCommand("----------");
        GM_registerMenuCommand("打开flash播放器", () => {
            GM_openInTab("https://fcmsb250.github.io/flash.html");
        });

        GM_registerMenuCommand("下载4399 flash 游戏", () => {
            let url = "";
            try {
                url = document.querySelector("#flashgame > param[name='movie']").value;
                if (url.includes("?")) {
                    url = 获取中间("gameswf=", ".swf", url) + ".swf";
                }
            } catch (e) {
                console.error(e);
                try {
                    url = document.querySelector("#swf1 > param[name='movie']").value;

                    if (url.includes("?")) {
                        url = 获取中间("gameswf=", ".swf", url) + ".swf";
                    }
                } catch (e) {
                    console.error(e);
                }
            }
            if (url) {
                if (
                    !(
                        url.substring(0, 2) == "//" ||
                        url.substring(0, 7) == "http://" ||
                        url.substring(0, 8) == "https://"
                    )
                ) {
                    url = location.href.substring(0, location.href.lastIndexOf("/") + 1) + url;
                }
                GM_setValue("url", url);
            } else {
                console.log("失败");
                GM_setValue("down4399", Math.random());
            }
        });

        GM_registerMenuCommand("下载7k7k flash 游戏", () => {
            try {
                let url = document.querySelector("#gameobj").src;
                if (url == location.href || !url) {
                    throw "";
                }
                location.href = url;
            } catch (e) {
                console.error(e);
                try {
                    var game_path = "";
                    var game_id = unsafeWindow.gameInfo.gameId;
                    //同步请求
                    $.ajaxSettings.async = false;
                    $.get(
                        "http://www.7k7k.com/open_api/request?action=Flash.Game&game=" + game_id,
                        function (data) {
                            try {
                                game_path = JSON.parse(data).result.url;
                                location.href = game_path;
                            } catch (e) {
                                alert("失败");
                            }
                        }
                    );
                    $.ajaxSettings.async = true;
                } catch (e) {
                    console.error(e);
                    alert("失败");
                }
            }
        });

        GM_addValueChangeListener("url", (name, old_value, new_value, remote) => {
            location.href = new_value;
        });
    } else {
        if (location.href.includes("4399") && location.href.includes("upload_swf")) {
            GM_addValueChangeListener("down4399", (name, old_value, new_value, remote) => {
                let url = "";
                try {
                    url = document.querySelector("#flashgame > param[name='movie']").value;
                    if (url.includes("?")) {
                        url = 获取中间("gameswf=", ".swf", url) + ".swf";
                    }
                } catch (e) {
                    console.error(e);
                    try {
                        url = document.querySelector("#swf1 > param[name='movie']").value;

                        if (url.includes("?")) {
                            url = 获取中间("gameswf=", ".swf", url) + ".swf";
                        }
                    } catch (e) {
                        console.error(e);
                    }
                }
                if (url) {
                    if (
                        !(
                            url.substring(0, 2) == "//" ||
                            url.substring(0, 7) == "http://" ||
                            url.substring(0, 8) == "https://"
                        )
                    ) {
                        url = location.href.substring(0, location.href.lastIndexOf("/") + 1) + url;
                    }
                    GM_setValue("url", url);
                } else {
                    console.log("失败");
                }
            });
        }
    }

    if (
        location.pathname.includes(".swf") &&
        !document.documentElement.innerHTML.includes("was not found on this server.")
    ) {
        download(location.href);
        return;
    }
})();