Redeem itch.io

自动激活itch.io key链接和免费itch.io游戏

当前为 2020-04-01 提交的版本,查看 最新版本

您需要先安装一个扩展,例如 篡改猴Greasemonkey暴力猴,之后才能安装此脚本。

You will need to install an extension such as Tampermonkey to install this script.

您需要先安装一个扩展,例如 篡改猴暴力猴,之后才能安装此脚本。

您需要先安装一个扩展,例如 篡改猴Userscripts ,之后才能安装此脚本。

您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。

您需要先安装用户脚本管理器扩展后才能安装此脚本。

(我已经安装了用户脚本管理器,让我安装!)

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展,比如 Stylus,才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

您需要先安装一款用户样式管理器扩展后才能安装此样式。

(我已经安装了用户样式管理器,让我安装!)

// ==UserScript==
// @name         Redeem itch.io
// @namespace    http://tampermonkey.net/
// @version      1.1.4
// @description  自动激活itch.io key链接和免费itch.io游戏
// @author       HCLonely
// @include      *://gamecode.win/giveaway/*
// @include      *://*itch.io/*
// @include      *://keylol.com/*
// @supportURL   https://blog.hclonely.com/posts/578f9be7/
// @homepage     https://blog.hclonely.com/posts/578f9be7/
// @require      https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.slim.min.js
// @grant        GM_xmlhttpRequest
// @grant        GM_registerMenuCommand
// @grant        GM_openInTab
// @run-at       document-end
// @connect      itch.io
// @connect      *.itch.io
// ==/UserScript==

(function() {
    'use strict';

    var closeWindow=true;//激活完成后自动关闭页面,改为'false'则为不自动关闭
    var url = location.href;

    function closePage(){
        window.close();
        if (userAgent.indexOf("Firefox") != -1 || userAgent.indexOf("Chrome") !=-1) {
            window.location.href="about:blank";
            window.close();
        } else {
            window.opener = null;
            window.open("", "_self");
            window.close();
        }
    }
    /***************************检测itch.io key链接***************************/
    if (url.includes("gamecode.win")){
        $("div.panel-body").append('<div class="col-md-6">' + '<h4 class="text-center">' +
                                   '<button id="redeemItch" style="width: 160px;" class="btn btn-danger btn-sm">' +
                                   '<i class="fa fa-gamepad">' + '</i>' + '激活' + '</button></h4></div>');
        var redeemurl=document.getElementsByClassName("text-center");
        for(var c=0;c<redeemurl.length;c++){
            var redeemurl1=redeemurl[c].innerHTML;
            if (/https:\/\/[\w]{1,}\.itch\.io\/[\w]{1,}(-[\w]{1,}){0,}\/download\/[\d\w]{1,}(-[\d\w]{1,}){1,}/i.test(redeemurl1)){
                if (confirm("检测到itch.io激活链接,是否前往激活?")) window.open(redeemurl1, "_blank");
                break;
            }
            if (/No more keys left sorry \:\([ ]{0,}/.test(redeemurl1)){
                if (confirm("没有key了,是否关闭?")) closePage();
                break;
            }
        }
        jQuery('#redeemItch').click(function(){
            window.open(redeemurl1,"_blank");
        });
    }

    /***************************自动激活itch.io游戏链接***************************/
    if (/^https?:\/\/[\w\W]{1,}\.itch\.io\/[\w]{1,}(-[\w]{1,}){0,}\/download\/[\w\W]{0,}/i.test(url)){
        $("button.button").map(function(i,e){
            if(/(link)|(claim)/gim.test($(e).text())) e.click();
        });
        if((/This page is linked/gim.test($("div.inner_column").text())||$("a.button.download_btn[data-upload_id]").length>0)&&closeWindow==1) closePage();
    }

    /***********************领取免费itch.io游戏***************************/
    if(/^https?:\/\/.*?itch\.io\/.*?\/purchase(\?.*?)?$/.test(url)&&/No thanks\, just take me to the downloads/i.test($("a.direct_download_btn").text())){
        $("a.direct_download_btn")[0].click();
    }else if($(".purchase_banner_inner").length===0&&(/0\.00/gim.test($(".button_message").eq(0).find(".dollars[itemprop]").text())||/Name your own price/gim.test($(".button_message").eq(0).find(".buy_message").text()))){
        window.open(url+"/purchase","_self")
    }

    /************************限时免费游戏包*****************************/
    if(/https?:\/\/itch.io\/s\/[\d]{1,}\/[\w\W]{1,}/.test(url)){
        let gameLink=document.getElementsByClassName("thumb_link game_link");
        for(var x=0,y=gameLink.length;x<y;x++){
            if(x!==y-1){
                window.open(gameLink[x].href+"/purchase","_blank");
            }else{
                window.open(gameLink[x].href+"/purchase","_self");
            }
        }
    }
    if(url.includes('keylol.com/')){
        function log(e,c){
            console.log('%c'+e, 'color:'+c)
        }
        async function redeemGame(url){
            log('当前游戏/优惠包链接: '+url)
            if (/https?:\/\/itch.io\/s\/[\d]+\/.+/.test(url)){
                log('正在获取游戏信息...')
                await new Promise(resolve => {
                    GM_xmlhttpRequest({
                        url,
                        method:'get',
                        onload:async data=>{
                            if (data.status ===200){
                                if(data.responseText.includes('not_active_notification')) {
                                    log('活动已结束!','red')
                                    resolve()
                                }else{
                                    let games=$(data.responseText).find('.game_grid_widget.promo_game_grid a.thumb_link.game_link')
                                    for(let e of games){
                                        await isOwn(e.href)
                                    }
                                    resolve()
                                }
                            }else{
                                log('请求失败!', 'red')
                                resolve()
                            }
                        }
                    })
                }).then(()=>{
                    return true
                }).catch(()=>{
                    return false
                })
            } else if (/^https?:\/\/.+?\.itch\.io\/[^/]+?(\/purchase)?$/.test(url)){
                await isOwn(url.replace('/purchase',''))
            }
        }
        async function isOwn(url){
            log('当前游戏链接: '+url)
            log('正在检测游戏是否拥有...')
            await new Promise(resolve => {
                GM_xmlhttpRequest({
                    url,
                    method: 'get',
                    onload: async data => {
                        if (data.status === 200) {
                            if (data.responseText.includes('purchase_banner_inner')) {
                                log('游戏已拥有!', 'green')
                                resolve()
                            } else {
                                // await purchase(url)
                                await openPurchase(url)
                                resolve()
                            }
                        } else {
                            log('请求失败!', 'red')
                            resolve()
                        }
                    }
                })
            }).then(() => {
                return true
            }).catch(() => {
                return false
            })
        }
        async function openPurchase(url) {
            log('已打开购买页面...')
            await new Promise(resolve => {
                let timer=setTimeout(() => {
                    log('有的页面脚本不能自动关闭,请手动关闭!')
                    resolve()
                }, 15000)
                GM_openInTab(url + '/purchase', { active: true, setParent: true }).onclosed = () => {
                    log('已关闭购买页面,如果是自动关闭的说明游戏已领取!')
                    clearTimeout(timer)
                    resolve()
                }
            }).then(() => {
                return true
            }).catch(() => {
                return false
            })
        }
        async function purchase(url){
            log('正在加载购买页面...')
            await new Promise(resolve => {
                GM_xmlhttpRequest({
                    url: url + '/purchase',
                    method: 'get',
                    onload: async data => {
                        if (data.status === 200) {
                            if (/0\.00/gim.test($(data.responseText).find(".button_message:first .dollars[itemprop]").text()) || /Name your own price/gim.test($(data.responseText).find(".button_message:first .buy_message").text())) {
                                let csrf_token=$(data.responseText).find('[name="csrf_token"]').val()
                                await download(url, csrf_token)
                                resolve()
                            } else {
                                log('价格不为 0, 可能活动已结束!', 'red')
                                resolve()
                            }
                        } else {
                            log('请求失败!', 'red')
                            resolve()
                        }
                    }
                })
            }).then(() => {
                return true
            }).catch(() => {
                return false
            })
        }
        async function download(url, csrf_token) {
            log('正在请求下载页面...')
            await new Promise(resolve => {
                GM_xmlhttpRequest({
                    url: url + '/download_url',
                    method: 'post',
                    data: {csrf_token},
                    responseType:'json',
                    onload: async data => {
                        if (data.status === 200 && data.response && data.response.url ) {
                            // await loadDownload(data.response.url)
                            resolve()
                        } else {
                            log('请求失败!', 'red')
                            resolve()
                        }
                    }
                })
            }).then(() => {
                return true
            }).catch(() => {
                return false
            })
        }

        async function loadDownload(url) {
            log('正在加载下载页面...')
            await new Promise(resolve => {
                GM_xmlhttpRequest({
                    url: url,
                    method: 'get',
                    onload: async data => {
                        if (data.status === 200 && data.response && data.response.url) {

                        } else {
                            log('请求失败!', 'red')
                            resolve()
                        }
                    }
                })
            }).then(() => {
                return true
            }).catch(() => {
                return false
            })
        }
        GM_registerMenuCommand('提取所有链接',async ()=>{
            for(let e of $('a[href*="itch.io"]')){
                await redeemGame(e.href)
            }
        });
    }
})();