// ==UserScript==
// @name Steam添加FOD
// @namespace sourcewater
// @version 0.39.17
// @description 更多请访问链接:https://keylol.com/t514316-1-1
// @author sourcewater
// @match https://store.steampowered.com/account/registerkey
// @grant GM_xmlhttpRequest
// @connect steamstore-a.akamaihd.net
// @downloadURL https://update.greasyfork.icu/scripts/389189/Steam%E6%B7%BB%E5%8A%A0FOD.user.js
// @updateURL https://update.greasyfork.icu/scripts/389189/Steam%E6%B7%BB%E5%8A%A0FOD.meta.js
// ==/UserScript==
(function() {
'use strict';
function getText(f){
return f.toString().replace(/^[^\/]+\/\*!?\s?/, '').replace(/\*\/[^\/]+$/, '');
}
let maincontent=document.getElementById("main_content");
let leftcontent=document.getElementsByClassName("leftcol")[0];
let headelement=document.getElementsByTagName("head")[0];
let dselectscriptnode=document.createElement("script");
dselectscriptnode.type="text/javascript";
GM_xmlhttpRequest({
method: "get",
url: "https://steamstore-a.akamaihd.net/public/shared/javascript/dselect.js?v=yT8Q5U2-O4wX&l=schinese",
onload: function(res){
if(res.status === 200){
dselectscriptnode.innerHTML=res.responseText;
}else{
console.log("load dselect script failed!")
}
},onerror : function(err){
console.log("server error!")
}
});
let steamaccountcss=getText(function(){/*
.steamaccount_currencyselect {
text-align: right;
}
.steamaccount_currencyselect .dselect_container {
display: inline-block;
vertical-align: middle;
text-align: left;
}
.currency_change_confirm_dialog {
max-width: 670px;
}
.currency_change_confirm_dialog p {
margin: 24px 0;
}
.currency_change_confirm_dialog b {
color: #67c1f5;
font-weight: normal;
}
.currency_change_option_ctn {
vertical-align: top;
margin: 0 6%;
}
.currency_change_option_ctn:first-child {
margin-bottom: 12px;
}
.currency_change_option {
font-family: "Motiva Sans", Sans-serif;
font-weight: 300;
display: block;
}
.currency_change_option > span {
display: block;
padding: 9px 19px;
}
.currency_change_option .country {
font-size: 20px;
}
.currency_change_option .notes {
font-size: 13px;
line-height: 18px;
}
.currency_change_option_ctn > p {
font-size: 12px;
margin: 8px 8px 0 8px;
}
p.currency_change_confirm_dialog_footer {
margin-top: 128px;
}
.youraccount_updating_shipping_button_row {
padding-top: 10px;
}
#s_s_s_s_free_game_list span,
#s_s_s_s_free_game_list_failed span,
#s_s_s_s_free_game_list_owned span{
font-weight: bold;
display: inline-block;
font-size: 13px;
vertical-align: middle;
line-height: 20px;
height: 20px;
}
#s_s_s_s_free_game_list .s_s_s_s_free_game_list_row,
#s_s_s_s_free_game_list_failed .s_s_s_s_free_game_list_row,
#s_s_s_s_free_game_list_owned .s_s_s_s_free_game_list_row{
margin-top: 7px;
white-space: nowrap;
}
#s_s_s_s_free_game_list .s_s_s_s_free_game_list_index,
#s_s_s_s_free_game_list_failed .s_s_s_s_free_game_list_index,
#s_s_s_s_free_game_list_owned .s_s_s_s_free_game_list_index{
width: 30px;
text-align: right;
padding: 0px 5px;
border-radius:4px;
}
#s_s_s_s_free_game_list .s_s_s_s_free_game_list_subid,
#s_s_s_s_free_game_list_failed .s_s_s_s_free_game_list_subid,
#s_s_s_s_free_game_list_owned .s_s_s_s_free_game_list_subid{
color: #ffffff;
background-color: rgba(199,99,158,0.5);
margin: 0px 3px;
width: 70px;
text-align: center;
padding: 0px 5px;
border-radius:4px;
}
#s_s_s_s_free_game_list .s_s_s_s_free_game_list_status,
#s_s_s_s_free_game_list_owned .s_s_s_s_free_game_list_status{
color: #d00;
background-color: #aaa;
margin: 0px 3px;
text-align: center;
padding: 0px 5px;
border-radius:4px;
}
#s_s_s_s_free_game_list .s_s_s_s_free_game_list_status{
width: 30px;
}
#s_s_s_s_free_game_list_owned .s_s_s_s_free_game_list_status{
width: 45px;
}
#s_s_s_s_free_game_list .s_s_s_s_free_game_list_name,
#s_s_s_s_free_game_list_failed .s_s_s_s_free_game_list_status{
margin: 0px 3px;
padding: 0px 5px;
border-radius:4px;
text-align: left;
}
#s_s_s_s_free_game_list_failed .s_s_s_s_free_game_list_status{
color: #ff7b00;
background-color: rgba(255,255,255,0.1);
}
#s_s_s_s_free_game_list .s_s_s_s_free_game_list_name{
color: #236;
background-color: #eeeeee;
}
*/});
let cleardiv=getText(function(){/*
*/});
let steamaccountcssnode=document.createElement("style");
steamaccountcssnode.type="text/css";
steamaccountcssnode.innerHTML=steamaccountcss;
headelement.appendChild(steamaccountcssnode);
let changecurrencycontainer=document.createElement("div");
changecurrencycontainer.setAttribute("id","s_s_s_s_change_currency_container");
jQuery.get("//store.steampowered.com/cart",function(result){
let framenode=document.createElement("frame");
framenode.innerHTML=result;
let allscripts=framenode.getElementsByTagName("script");
let changecurrencyscript;
let ccnodes=framenode.getElementsByClassName("cart_currency_select");
if(ccnodes.length>0){
let changecurrency=ccnodes[0];
changecurrency.style="position:relative;";
changecurrency=changecurrency.parentNode;
for(let i=0;i');
listObject.html(key + ' ( ' + reason +
(subId != 0 ? (': ' + subId + '
' + subName) : '') +
' )');
jQuery('#unusedKeys').append(listObject);
s_s_s_allUnusedKeys.push(key);
}
}
function s_s_s_tableInsertKey(key) {
s_s_s_keyCount++;
var row = jQuery(' ');
// number
row.append('' + s_s_s_keyCount + ' ');
//key
row.append('' + key + '
');
//redeeming...
row.append('' + s_s_s_myTexts.redeeming + '... ');
jQuery('tbody').prepend(row);
}
function s_s_s_tableWaitKey(key) {
s_s_s_keyCount++;
var row = jQuery(' ');
// number
row.append('' + s_s_s_keyCount + ' ');
//key
row.append('' + key + '
');
//waiting...
row.append('' + s_s_s_myTexts.waiting +
' (' + s_s_s_waitingSeconds + '秒)... ');
jQuery('tbody').prepend(row);
}
function s_s_s_tableUpdateKey(key, result, detail, subId, subName) {
s_s_s_setUnusedKeys(key, result === s_s_s_myTexts.success, detail, subId, subName);
s_s_s_recvCount++;
if (s_s_s_recvCount == s_s_s_keyCount) {
jQuery('#buttonRedeem').fadeIn();
jQuery('#inputKey').removeAttr('disabled');
}
var rowObjects = jQuery('tr');
for (var i = 1; i < rowObjects.length; i++) {
var rowElement = rowObjects[i];
var rowObject = jQuery(rowElement);
if (rowObject.children()[1].innerHTML.includes(key)&&
rowObject.children()[2].innerHTML.includes(s_s_s_myTexts.redeeming)) {
rowObject.children()[2].remove();
// result
if (result == s_s_s_myTexts.fail) rowObject.append('' + result + ' ');
else rowObject.append('' + result + ' ');
// detail
rowObject.append('' + detail + ' ');
// sub
if (subId === 0) {
rowObject.append('—— ');
} else {
rowObject.append('' + subId + '
' + subName + ' ');
}
break;
}
}
}
function s_s_s_getKeysByRE(text) {
text = text.trim().toUpperCase();
var reg = new RegExp('([0-9A-Z]{5}-?){2,4}[0-9A-Z]{5}', 'g');
var keys = [];
var result = void 0;
while (result = reg.exec(text)) {
keys.push(result[0]);
}
return keys;
}
function s_s_s_startTimer() {
s_s_s_timer = setInterval(function() {
var flag = false;
var nowKey = 0;
var rowObjects = jQuery('tr');
for (var i = rowObjects.length - 1; i >= 1; i--) {
var rowElement = rowObjects[i];
var rowObject = jQuery(rowElement);
if (rowObject.children()[2].innerHTML.includes(s_s_s_myTexts.waiting)) {
nowKey++;
if (nowKey <= s_s_s_autoDivideNum) {
var key = rowObject.children()[1].innerHTML.substring(6);
key = key.substring(0, key.indexOf(''));
rowObject.children()[2].innerHTML = '' + s_s_s_myTexts.redeeming + '... ';
s_s_s_redeemKey(key);
} else {
flag = true;
break;
}
}
}
if (!flag) {
clearInterval(s_s_s_timer);
}
}, 1000 * s_s_s_waitingSeconds);
}
function s_s_s_redeemKeys() {
var keys = s_s_s_getKeysByRE(jQuery('#inputKey').val().trim());
if (keys.length <= 0) {
ShowAlertDialog("失败","没有找到符合格式的key!");
return;
}
jQuery('#buttonRedeem').fadeOut();
jQuery('#inputKey').attr('disabled', 'disabled');
var nowKey = 0;
keys.forEach(function (key) {
nowKey++;
if (nowKey <= s_s_s_autoDivideNum) {
s_s_s_tableInsertKey(key);
s_s_s_redeemKey(key);
} else {
s_s_s_tableWaitKey(key);
}
});
if (nowKey > s_s_s_autoDivideNum) {
s_s_s_startTimer();
}
}
function s_s_s_toggleUnusedKeyArea() {
if (jQuery('#unusedKeyArea').is(':hidden')) {
jQuery('#unusedKeyArea').fadeIn();
} else {
jQuery('#unusedKeyArea').fadeOut();
}
}
function s_s_s_showUnusedKey() {
s_s_s_toggleUnusedKeyArea();
if (this.innerHTML.includes(s_s_s_myTexts.showUnusedKey)) {
this.innerHTML = this.innerHTML.replace(s_s_s_myTexts.showUnusedKey, s_s_s_myTexts.hideUnusedKey);
} else {
this.innerHTML = this.innerHTML.replace(s_s_s_myTexts.hideUnusedKey, s_s_s_myTexts.showUnusedKey);
}
}
*/});
let batchredeemscriptnode=document.createElement("script");
batchredeemscriptnode.innerHTML=batchredeemscript;
headelement.appendChild(batchredeemscriptnode);
let batchredeemkey=getText(function(){/*
*/});
document.getElementById("registerkey_form").style.display="none";
let keyexamplestext=document.getElementById("registerkey_examples_text");
keyexamplestext.outerHTML=batchredeemkey+keyexamplestext.outerHTML;
let outputtablecss = `
table a {
color: pink;
}
td {
white-space: nowrap;
overflow: hidden;
}
code {
padding:2px 4px;
font-size:90%;
color:#c7254e;
background-color:#f9f2f4;
border-radius:3px
}
.notice_box_content {
border: 1px solid #a25024;
border-radius: 3px;
width: 525px;
color: #acb2b8;
font-size: 14px;
font-family: "Motiva Sans", Sans-serif;
font-weight: normal;
padding: 15px 15px;
margin-bottom: 15px;
}
.notice_box_content b {
font-weight: normal;
color: #f47b20;
}
li {
white-space: nowrap;
overflow: hidden;
}
`;
let outputtablenode=document.createElement("style");
outputtablenode.type="text/css";
outputtablenode.innerHTML=outputtablecss;
headelement.appendChild(outputtablenode);
let addtowishlistscript=getText(function(){/*
function s_s_s_addtowishlistfunction(){
let args=arguments[0].split(",");
if(!args[0].trim().match(/^[\d]+$/)){
ShowAlertDialog("失败","请输入APP ID,多个APP ID用“,”隔开");
return;
}
let appidlist=new Array();
for(let i=0;i
输入APP ID添加锁偏好游戏至愿望单,输入SUB ID在Steam上添加免费产品。多个ID之间用“,”隔开。(锁国区的游戏需要切换账单。切换帐单会有点延迟,取决于网速,一开始点不动的话,等一会就能点了。 )
输入APP ID
同时关注游戏
*/});
var addfreescript=getText(function(){/*
function s_s_s_addfreefunction(){
let args=arguments[0].split(",");
if(!args[0].trim().match(/^[\d]+$/)){
ShowAlertDialog("失败","请输入SUB ID,多个SUB ID用“,”隔开");
return;
}
let subidlist=new Array();
for(let i=0;i索引 SUB ID 状态 `;
}
let freegamelistownedItem=`${ownedCount} ${freePackages[i]} 已拥有 `;
addFreeOwnedEle.innerHTML+=freegamelistownedItem;
modal.Dismiss();
if (loaded === total) {
ShowAlertDialog('完成!', '已全部添加完毕。');
} else {
modal = ShowBlockingWaitDialog('正在添加...', '载入 ' + loaded + '/' + total);
++i;
addfreelicense();
}
}else{
jQuery.post(
'//store.steampowered.com/checkout/addfreelicense', {
action: 'add_to_cart',
sessionid: g_sessionID,
subid: freePackages[i]
},
function(data) {
++loaded;
let resultFrame=document.createElement("frame");
resultFrame.innerHTML=data;
let afs=resultFrame.getElementsByClassName("add_free_content_success_area");
let errs=resultFrame.getElementsByClassName("error");
if(afs.length>0){
++count;
if(freegamelistEle.getElementsByClassName("s_s_s_s_free_game_list_row").length==0){
freegamelistEle.innerHTML+=`索引 SUB ID 状态 游戏名称 `;
}
let addFreeSuccess=afs[0];
let gameName=/([^\n\r]*) 已被绑定至您的 Steam 帐户。/.exec(addFreeSuccess.firstElementChild.innerHTML)[1];
let freegamelistItem=`${count} ${freePackages[i]} 成功 ${gameName} `;
freegamelistEle.innerHTML+=freegamelistItem;
}
if(errs.length>0){
let errMessage=errs[0].innerHTML;
++failCount;
if(addFreeFailedEle.getElementsByClassName("s_s_s_s_free_game_list_row").length==0){
addFreeFailedEle.innerHTML+=`索引 SUB ID 状态 `;
}
let freegamefailedlistItem=`${failCount} ${freePackages[i]} ${errMessage} `;
addFreeFailedEle.innerHTML+=freegamefailedlistItem;
}
modal.Dismiss();
if (loaded === total) {
ShowAlertDialog('完成!', '已全部添加完毕。');
} else {
modal = ShowBlockingWaitDialog('正在添加...', '载入 ' + loaded + '/' + total);
++i;
setTimeout(addfreelicense,200);
}
}
).fail(function() {
++loaded;
modal.Dismiss();
if (loaded === total) {
ShowAlertDialog('完成!', '已全部添加完毕。');
} else {
modal = ShowBlockingWaitDialog('正在添加...', '载入 ' + loaded + '/' + total);
++i;
++failCount;
if(addFreeFailedEle.getElementsByClassName("s_s_s_s_free_game_list_row").length==0){
addFreeFailedEle.innerHTML+=`索引 SUB ID 状态 `;
}
let freegamefailedlistItem=`${failCount} ${freePackages[i]} 发送请求错误! `;
addFreeFailedEle.innerHTML+=freegamefailedlistItem;
setTimeout(addfreelicense,200);
}
});
}
}
addfreelicense();
}
*/});
let addfreescriptnode=document.createElement("script");
addfreescriptnode.innerHTML=addfreescript;
headelement.appendChild(addfreescriptnode);
let addfree=getText(function(){/*
输入SUB ID在Steam上添加免费产品。多个ID之间用“,”隔开。(锁国区的游戏需要切换账单。切换帐单会有点延迟,取决于网速,一开始点不动的话,等一会就能点了。注意:已经添加成功的SUB ID,如果在短时间内重复添加相同的SUB ID,因为网页缓存的关系请按下Ctrl+F5快捷键强制刷新,否则脚本无法判断该SUB ID是否已拥有! )
输入SUB ID
*/});
leftcontent.innerHTML=leftcontent.innerHTML+addfree;//+addtowishlist;
leftcontent.appendChild(changecurrencycontainer);
let cleardivnode=document.createElement("div");
leftcontent.appendChild(cleardivnode);
cleardivnode.outerHTML=cleardiv;
let freegamelist=document.createElement("div");
freegamelist.setAttribute("id","s_s_s_s_free_game_list");
freegamelist.innerHTML=" ";
leftcontent.appendChild(freegamelist);
let freegamelistFailed=document.createElement("div");
freegamelistFailed.setAttribute("id","s_s_s_s_free_game_list_failed");
freegamelistFailed.innerHTML=" ";
leftcontent.appendChild(freegamelistFailed);
let freegamelistOwned=document.createElement("div");
freegamelistOwned.setAttribute("id","s_s_s_s_free_game_list_owned");
freegamelistOwned.innerHTML=" ";
leftcontent.appendChild(freegamelistOwned);
leftcontent.innerHTML+=" ";
})();