// ==UserScript==
// @name Redeem itch.io
// @namespace http://tampermonkey.net/
// @version 1.1.0
// @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
// @run-at document-end
// ==/UserScript==
(function() {
'use strict';
var closeWindow=true;//激活完成后自动关闭页面,改为'false'则为不自动关闭
var url = location.href;
/***************************检测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了,是否关闭?")) window.close();
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) 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<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('页面关闭超时!','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)
}
});
}
})();