Greasy Fork

Greasy Fork is available in English.

SteamRedeemKeys

Steam网页激活 —— 批量激活

目前为 2017-08-30 提交的版本,查看 最新版本

// ==UserScript==
// @name         SteamRedeemKeys
// @namespace    https://gist.github.com/zyfworks/ccb12bd87f09cf49d0a3465d167bece9
// @version      1.3
// @description  Steam网页激活 —— 批量激活
// @author       Makazeu
// @match        https://store.steampowered.com/account/registerkey
// @grant        GM_addStyle
// ==/UserScript==

(function() {
    'use strict';

	var keyCount = 0;

	var failureDetail = {
		14: '无效激活码',
		15: '重复激活',
		53: '次数上限',
		13: '地区限制',
		9: '已拥有',
		24: '缺少主游戏',
		36: '需要PS3?',
		50: '这是充值码',
	};

	var myTexts = {
		fail: '失败',
		success: '成功',
		network: '网络错误或超时',
		line: '——',
		nothing: '',
		others: '其他错误',
		unknown: '未知错误',
		redeeming: '激活中',
	};

	function redeemKey(key) {
		jQuery.ajax({
			url: 'https://store.steampowered.com/account/ajaxregisterkey/',
			data: {
				product_key: key,
				sessionid: g_sessionID
			},
			type: 'post',
			dataType: 'json',
			timeout: 150000,
			beforeSend: function(){
				if (jQuery('table').is(':hidden')) {
						jQuery('table').fadeIn();
				}
				tableInsertKey(key);
			},
			complete: function() {
				jQuery('#buttonRedeem').fadeIn();
				jQuery('#inputKey').removeAttr('disabled');
			},
			error: function() {
				tableUpdateKey(key, myTexts.fail, myTexts.network, 0, myTexts.nothing);
				return;
			},
			success: function(data) {
				console.log(data);

				if (data.success == 1) {
					tableUpdateKey(key, myTexts.success, myTexts.line, 
						data.purchase_receipt_info.line_items[0].packageid,
						data.purchase_receipt_info.line_items[0].line_item_description);
					return;
				} else if (data.purchase_result_details !== undefined && data.purchase_receipt_info) {
					if (!data.purchase_receipt_info.line_items[0]) {
						tableUpdateKey(key, myTexts.fail, 
							failureDetail[data.purchase_result_details] ? failureDetail[data.purchase_result_details] : myTexts.unknown,
							0, myTexts.nothing);
					} else {
						tableUpdateKey(key, myTexts.fail, 
							failureDetail[data.purchase_result_details] ? failureDetail[data.purchase_result_details] : myTexts.unknown,
							data.purchase_receipt_info.line_items[0].packageid,
							data.purchase_receipt_info.line_items[0].line_item_description);
					}
					return;
				}
				tableUpdateKey(key, myTexts.fail, myTexts.others, 0, myTexts.nothing);
			}
		});
	}
	function tableInsertKey(key) {
		keyCount++;
		var row = jQuery('<tr></tr>');
		// number
		row.append('<td class="nobr">' + keyCount + '</td>');
		//key
		row.append('<td class="nobr"><code>' + key + '</code></td>');
		//waiting...
		row.append('<td colspan="3">' + myTexts.redeeming + '...</td>');

		jQuery('tbody').prepend(row);
	}

	function tableUpdateKey(key, result, detail, subId, subName) {
		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(myTexts.redeeming)) {
				rowObject.children()[2].remove();

				// result
				if (result == myTexts.fail) rowObject.append('<td class="nobr" style="color:red">' + result + '</td>');
				else rowObject.append('<td class="nobr" style="color:green">' + result + '</td>');
				// detail
				rowObject.append('<td class="nobr">' + detail + '</td>');
				// sub
				if (subId === 0) {
					rowObject.append('<td>——</td>');
				} else {
					rowObject.append('<td><code>' + subId + '</code> <a href="https://steamdb.info/sub/' + 
						subId + '/" target="_blank">' + subName + '</a></td>');
				}
				break;
			}
		}
	}

	function getKeysByRE(text) {
		text = text.trim().toUpperCase();
		var reg = new RegExp('([0-9,A-Z]{5}-){2,4}[0-9,A-Z]{5}', 'g');
		var keys = [];

		var result = void 0;
		while (result = reg.exec(text)) {
			keys.push(result[0]);
		}

		return keys;
	}

	function redeemKeys() {
		var keys = getKeysByRE(jQuery('#inputKey').val().trim());
		if (keys.length <= 0) {
			return;
		}

		jQuery('#buttonRedeem').fadeOut();
		jQuery('#inputKey').attr('disabled', 'disabled');

		keys.forEach(function (key) {
			redeemKey(key);
		});
	}

	jQuery('#registerkey_examples_text').html(
		'<div class="table-responsive table-condensed">' +
		'<table class="table table-hover" style="display: none">' +
		'<caption><h2>激活记录</h2></caption><thead><th>No.</th><th>Key</th>' +
		'<th>结果</th><th>详情</th><th>Sub</th></thead><tbody></tbody>' +
		'</table></div><br>');


	jQuery('.registerkey_input_box_text').parent().append('<textarea class="form-control" rows="3"' +
		' id="inputKey" placeholder="支持批量激活,可以把整个网页文字复制过来' +
		'一次激活的数量不要超过9个,若超过则请多次激活并每次间隔半分钟"' +
		' style="margin: 3px 0px 0px; width: 525px; height: 102px;"></textarea><br>');
	jQuery('.registerkey_input_box_text').fadeOut();
	jQuery('#purchase_confirm_ssa').fadeOut();

	//jQuery('#register_btn').removeAttr('href').attr('href', 'javascript:redeemKeys()');
	//jQuery('#register_btn').parent().append('<button class="btnv6_blue_hoverfade btn_medium" id="buttonRedeem">激活!</button>');
	jQuery('#register_btn').parent().append('<a tabindex="300" class="btnv6_blue_hoverfade btn_medium"' + 
		' id="buttonRedeem"><span>激活!</span></a>');
	jQuery('#register_btn').remove();
	jQuery('#buttonRedeem').click(function() {
		redeemKeys();
	});

	var style = `
		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
		}
	`;
	GM_addStyle(style);
})();