您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
清空Steam愿望单 & 恢复Steam愿望单
"use strict"; function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } // ==UserScript== // @name Steam愿望单重置 // @namespace steam-wishlist-reset // @version 1.0.8 // @description 清空Steam愿望单 & 恢复Steam愿望单 // @author HCLonely // @license MIT // @iconURL https://auto-task-test.hclonely.com/img/favicon.ico // @homepage https://github.com/HCLonely/steam-wishlist-reset // @supportURL https://github.com/HCLonely/steam-wishlist-reset/issues // @include *://store.steampowered.com/wishlist/profiles/* // @include *://store.steampowered.com/wishlist/id/* // @require https://cdn.jsdelivr.net/npm/[email protected]/dist/sweetalert2.all.min.js // @require https://cdn.jsdelivr.net/npm/[email protected]/runtime.min.js // @grant GM_setValue // @grant GM_getValue // @grant GM_deleteValue // @grant GM_addStyle // @grant GM_xmlhttpRequest // @grant GM_registerMenuCommand // @run-at document-end // ==/UserScript== /* global Swal,g_sessionID,g_AccountID,Blob,FileReader */ (function () { GM_addStyle('#swal2-title{color:#000!important;}#swal2-content a{color:#2f89bc!important;}'); function clearWishlist() { return _clearWishlist.apply(this, arguments); } function _clearWishlist() { _clearWishlist = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2() { var limit, wishlistGames, _GM_setValue, list, time, len, i; return regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: limit = GM_getValue('limit') || 0; _context2.next = 3; return getWishlistFromServer(); case 3: wishlistGames = _context2.sent; wishlistGames.splice(0, limit); if (!((wishlistGames === null || wishlistGames === void 0 ? void 0 : wishlistGames.length) > 0)) { _context2.next = 22; break; } list = ((_GM_setValue = GM_setValue('list')) === null || _GM_setValue === void 0 ? void 0 : _GM_setValue.length) > 0 ? GM_setValue('list') : []; time = new Date().getTime(); list.push(time); GM_setValue(time, wishlistGames); GM_setValue('list', list); len = wishlistGames.length; i = 0; case 13: if (!(i < len)) { _context2.next = 19; break; } _context2.next = 16; return removeFromWishlist(wishlistGames[i], i, len); case 16: i++; _context2.next = 13; break; case 19: Swal.fire({ icon: 'success', title: '愿望单清空完成(忽略所有错误)', confirmButtonText: '保存愿望单数据到本地', showCancelButton: true, cancelButtonText: '关闭' }).then(function (_ref2) { var value = _ref2.value; if (value) { createAndDownloadFile('wishlists.json', JSON.stringify(wishlistGames)); } }); _context2.next = 23; break; case 22: Swal.fire({ icon: 'warning', title: '愿望单为空!' }); case 23: case "end": return _context2.stop(); } } }, _callee2); })); return _clearWishlist.apply(this, arguments); } function removeFromWishlist(gameId, i, len) { return new Promise(function (resolve) { Swal[i === 0 ? 'fire' : 'update']({ title: '正在移除愿望单游戏', text: gameId + ' (' + (i + 1) + '/' + len + ')' }); GM_xmlhttpRequest({ url: 'https://store.steampowered.com/api/removefromwishlist', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, data: "sessionid=".concat(g_sessionID, "&appid=").concat(gameId), responseType: 'json', onload: function onload(response) { console.log(response); resolve(); }, ontimeout: resolve, onerror: resolve, onabort: resolve }); }); } function recoverWishlist(_x) { return _recoverWishlist.apply(this, arguments); } function _recoverWishlist() { _recoverWishlist = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(games) { var oldWishlist, newWishlist, failedGames, len, i, _newWishlist; return regeneratorRuntime.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: if (games) { _context3.next = 10; break; } _context3.next = 3; return getWishlistFromLocal(); case 3: oldWishlist = _context3.sent; if (!(oldWishlist === 'cancel')) { _context3.next = 6; break; } return _context3.abrupt("return"); case 6: _context3.next = 8; return getWishlistFromServer(); case 8: newWishlist = _context3.sent; games = oldWishlist === null || oldWishlist === void 0 ? void 0 : oldWishlist.filter(function (item) { return !(newWishlist !== null && newWishlist !== void 0 && newWishlist.includes(item)); }); case 10: if (!games) { _context3.next = 30; break; } failedGames = []; len = games.length; i = 0; case 14: if (!(i < len)) { _context3.next = 22; break; } _context3.next = 17; return addToWishlist(games[i], i, len); case 17: if (_context3.sent) { _context3.next = 19; break; } failedGames.push(games[i]); case 19: i++; _context3.next = 14; break; case 22: _context3.next = 24; return getWishlistFromServer(); case 24: _newWishlist = _context3.sent; if (_newWishlist) { failedGames = games.filter(function (item) { return !_newWishlist.includes(item); }); } console.log('恢复失败的游戏:', failedGames); Swal.fire({ icon: 'success', title: failedGames.length > 0 ? '愿望单恢复完成,恢复失败的游戏:' : '所有愿望单游戏恢复完成!', html: failedGames.length > 0 ? JSON.stringify(failedGames).replace(/[\d]+/g, function (gameId) { return "<a href=https://store.steampowered.com/app/".concat(gameId, " target=\"_blank\">").concat(gameId, "</a>"); }) : '', showConfirmButton: failedGames.length > 0, confirmButtonText: '重新恢复失败的游戏', showCancelButton: true, cancelButtonText: '关闭' }).then(function (_ref3) { var value = _ref3.value; if (value) { recoverWishlist(failedGames); } }); _context3.next = 31; break; case 30: Swal.fire({ icon: 'error', title: '没有读取到游戏列表' }); case 31: case "end": return _context3.stop(); } } }, _callee3); })); return _recoverWishlist.apply(this, arguments); } function addToWishlist(gameId, i, len) { return new Promise(function (resolve) { Swal[i === 0 ? 'fire' : 'update']({ title: '正在恢复愿望单游戏', text: gameId + ' (' + (i + 1) + '/' + len + ')' }); GM_xmlhttpRequest({ url: 'https://store.steampowered.com/api/addtowishlist', method: 'POST', headers: { 'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' }, data: "sessionid=".concat(g_sessionID, "&appid=").concat(gameId), responseType: 'json', onload: function onload(response) { var _response$response; console.log(response); if (response.status === 200 && ((_response$response = response.response) === null || _response$response === void 0 ? void 0 : _response$response.success) === true) { resolve(true); } else { resolve(false); } }, ontimeout: function ontimeout() { resolve(false); }, onerror: function onerror() { resolve(false); }, onabort: function onabort() { resolve(false); } }); }); } function exportWishlist() { return _exportWishlist.apply(this, arguments); } function _exportWishlist() { _exportWishlist = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee4() { var wishlists; return regeneratorRuntime.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return getWishlistFromServer(); case 2: wishlists = _context4.sent; createAndDownloadFile('wishlists.json', JSON.stringify(wishlists)); case 4: case "end": return _context4.stop(); } } }, _callee4); })); return _exportWishlist.apply(this, arguments); } function createAndDownloadFile(fileName, content) { var aTag = document.createElement('a'); var blob = new Blob([content]); aTag.download = fileName; aTag.href = URL.createObjectURL(blob); aTag.click(); URL.revokeObjectURL(blob); } function getWishlistFromServer() { return new Promise(function (resolve) { Swal.fire({ title: '正在获取愿望单列表', text: '请耐心等待...' }); GM_xmlhttpRequest({ method: 'GET', url: 'https://store.steampowered.com/dynamicstore/userdata/?id=' + g_AccountID + '&cc=CN&v=70', nocache: true, responseType: 'json', onload: function () { var _onload = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(response) { var _response$response2; return regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (response.status === 200 && response !== null && response !== void 0 && (_response$response2 = response.response) !== null && _response$response2 !== void 0 && _response$response2.rgWishlist) { Swal.fire({ icon: 'success', title: '获取愿望单列表成功!' }); resolve(response.response.rgWishlist); } else { Swal.fire({ icon: 'error', title: '获取愿望单列表失败!' }); resolve(false); } case 1: case "end": return _context.stop(); } } }, _callee); })); function onload(_x2) { return _onload.apply(this, arguments); } return onload; }(), ontimeout: function ontimeout(e) { console.log(e); Swal.fire({ icon: 'error', title: '获取愿望单列表失败!' }); resolve(false); }, onerror: function onerror(e) { console.log(e); Swal.fire({ icon: 'error', title: '获取愿望单列表失败!' }); resolve(false); }, onabort: function onabort(e) { console.log(e); Swal.fire({ icon: 'error', title: '获取愿望单列表失败!' }); resolve(false); } }); }); } function getWishlistFromLocal() { return _getWishlistFromLocal.apply(this, arguments); } function _getWishlistFromLocal() { _getWishlistFromLocal = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee5() { var games, type, list, listId, _yield$Swal$fire, file; return regeneratorRuntime.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return Swal.fire({ confirmButtonText: '从缓存中读取', showDenyButton: true, denyButtonText: '从文件中读取' }).then(function (result) { if (result.isConfirmed) { return 'cache'; } if (result.isDenied) { return 'file'; } return false; }); case 2: type = _context5.sent; if (!(type === 'cache')) { _context5.next = 10; break; } Swal.fire({ title: '正在读取愿望单列表', text: '请稍等...' }); list = GM_getValue('list'); listId = list ? list[list.length - 1] : null; games = listId ? GM_getValue(listId) : null; _context5.next = 23; break; case 10: if (!(type === 'file')) { _context5.next = 22; break; } _context5.next = 13; return Swal.fire({ title: '请选择要读取的文件', input: 'file', inputAttributes: { accept: 'application/json', 'aria-label': '上传你的愿望单列表' } }); case 13: _yield$Swal$fire = _context5.sent; file = _yield$Swal$fire.value; if (!file) { _context5.next = 20; break; } Swal.fire({ title: '正在读取愿望单列表', text: '如果长时间没反应,请打开控制台查看报错' }); _context5.next = 19; return new Promise(function (resolve) { var reader = new FileReader(); reader.onload = function (e) { resolve(JSON.parse(e.target.result)); }; reader.onerror = function (e) { resolve(false); }; reader.readAsText(file); }); case 19: games = _context5.sent; case 20: _context5.next = 23; break; case 22: games = 'cancel'; case 23: return _context5.abrupt("return", games); case 24: case "end": return _context5.stop(); } } }, _callee5); })); return _getWishlistFromLocal.apply(this, arguments); } function setting() { Swal.fire({ title: '请输入要保留的游戏数量', input: 'text', inputLabel: '由于忽略了错误,实际保留的游戏数量可能比你设置的要多几个!', inputValue: GM_getValue('limit') || 0, showCancelButton: true, inputValidator: function inputValidator(value) { if (!/^[\d]+$/.test(value)) { return '请输入正确的数字!'; } } }).then(function (_ref) { var value = _ref.value; if (/^[\d]+$/.test(value)) { GM_setValue('limit', parseInt(value)); Swal.fire({ title: '保存成功', icon: 'success' }); } else if (value) { Swal.fire({ title: '请输入正确的数字!', icon: 'error' }); } }); } GM_registerMenuCommand('清空愿望单', clearWishlist); GM_registerMenuCommand('恢复愿望单', function () { recoverWishlist(); }); GM_registerMenuCommand('导出愿望单', exportWishlist); GM_registerMenuCommand('保留的游戏数量', setting); })();