// ==UserScript== // @name Redeem itch.io // @namespace http://tampermonkey.net/ // @version 1.1.1 // @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/jquery@3.4.1/dist/jquery.slim.min.js // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @grant GM_openInTab // @run-at document-end // @connect itch.io // @connect *.itch.io // @downloadURL none // ==/UserScript== (function() { 'use strict'; var closeWindow=true;//激活完成后自动关闭页面,改为'false'则为不自动关闭 var url = location.href; /***************************检测itch.io key链接***************************/ if (url.includes("gamecode.win")){ $("div.panel-body").append('
' + '

' + '

'); var redeemurl=document.getElementsByClassName("text-center"); for(var c=0;c0)&&closeWindow==1) window.close(); } /***********************领取免费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 { 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('页面关闭超时!','red') resolve() }, 1000 * 60 * 3) 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) } }); } })();