Steam愿望单工具

批量导入和导出愿望单

  1. // ==UserScript==
  2. // @name Steam愿望单工具
  3. // @namespace sourcewater
  4. // @version 0.1.11
  5. // @description 批量导入和导出愿望单
  6. // @author sourcewater
  7. // @match https://store.steampowered.com/wishlist/*
  8. // @grant none
  9. // ==/UserScript==
  10.  
  11. (function() {
  12. 'use strict';
  13.  
  14. function importWL(){
  15. console.log("导入愿望单");
  16. let file=file_chooser.files[0];
  17. let freader=new FileReader();
  18. freader.readAsText(file);
  19. freader.onload=function(){
  20. let appidlist;
  21. appidlist=freader.result.split(",");
  22. if(appidlist.length==0) return;
  23. let wl=[];
  24. function loadWL(){
  25. if(g_rgWishlistData){
  26. for(let i=0;i<g_rgWishlistData.length;++i){
  27. wl.push(g_rgWishlistData[i].appid);
  28. }
  29. }else{
  30. console.log("wait for the wishlist data...");
  31. setTimeout(loadWL,100);
  32. }
  33. }
  34. loadWL();
  35. let temp=[];
  36. for(let i=0;i<appidlist.length;++i){
  37. let index=wl.indexOf(parseInt(appidlist[i]));
  38. if(index<0){
  39. temp.push(appidlist[i]);
  40. }
  41. }
  42. if(temp.length>0){
  43. appidlist=temp;
  44. let i=0;
  45. let failed=0;
  46. let failedList=[];
  47. let bdialog;
  48. function addWL(){
  49. if(i==appidlist.length){
  50. if(failed>0){
  51. if(bdialog) bdialog.Dismiss();
  52. appidlist=failedList;
  53. i=0;
  54. failed=0;
  55. failedList=[];
  56. exportFailedWL(appidlist);
  57. ShowConfirmDialog("提示!", '是否重试添加愿望单失败的游戏?数量:'+appidlist.length+'<br><br>可能的失败原因:<br>1、切换过钱包区域(或者切换账单地址),游戏锁区了?<br>2、在导入愿望单之前购买了愿望单内的游戏?<br>3、游戏下架了?').done(function(){setTimeout(addWL,500);});
  58. }else{
  59. console.log("success");
  60. if(i!=0) bdialog.Dismiss();
  61. ShowAlertDialog("成功","已经全部添加至愿望单");
  62. file_chooser.value="";
  63. return;
  64. }
  65. }else{
  66. let appid=appidlist[i];
  67. let url = 'https://store.steampowered.com/api/addtowishlist';
  68. $J.post( url, {sessionid: g_sessionID, appid: appid} )
  69. .done( function( data ) {
  70. if ( data && data.success ) {
  71. ++i;
  72. }else {
  73. ++failed;
  74. ++i;
  75. failedList.push(appid);
  76. }
  77. if(bdialog) bdialog.Dismiss();
  78. bdialog=ShowBlockingWaitDialog('正在添加...',i+'/'+appidlist.length+'&nbsp;&nbsp;&nbsp;&nbsp;失败:'+failed);
  79. setTimeout(addWL,500);
  80. }).fail( function() {
  81. ++failed;
  82. ++i;
  83. failedList.push(appid);
  84. if(bdialog) bdialog.Dismiss();
  85. bdialog=ShowBlockingWaitDialog('正在添加...',i+'/'+appidlist.length+'&nbsp;&nbsp;&nbsp;&nbsp;失败:'+failed);
  86. setTimeout(addWL,500);
  87. });
  88. }
  89. }
  90. addWL();
  91. }else{
  92. ShowAlertDialog("提示","当前需要导入的已经存在于现有的愿望单中!");
  93. file_chooser.value="";
  94. }
  95. }
  96. }
  97.  
  98. function saveTxt(filename,data){
  99. let winObj=window.URL || window.webkitURL || window;
  100. let blob = new Blob([data],{type:'text/html'});
  101. let url=document.createElementNS("http://www.w3.org/1999/xhtml", "a");
  102. url.href=winObj.createObjectURL(blob);
  103. url.download = filename;
  104. let ev = new MouseEvent ("click");
  105. url.dispatchEvent(ev);
  106. }
  107.  
  108. function exportWL(){
  109. let wl=[];
  110. for(let i=0;i<g_rgWishlistData.length;++i){
  111. wl.push(g_rgWishlistData[i].appid);
  112. }
  113. let wln=wl.length;
  114. saveTxt("wishlist_total_"+wln+".txt",wl);
  115. }
  116.  
  117. function exportFailedWL(appidlist){
  118. let failedwl="";
  119. for(let i=0;i<appidlist.length;++i){
  120. failedwl+="https://store.steampowered.com/app/"+appidlist[i]+"\n";
  121. }
  122. failedwl+="\n===============================steam db===============================\n\n";
  123. for(let i=0;i<appidlist.length;++i){
  124. failedwl+="https://steamdb.info/app/"+appidlist[i]+"\n";
  125. }
  126. saveTxt("failed_wishlist_total_"+appidlist.length+".txt",failedwl);
  127. }
  128.  
  129. function emptyWL(){
  130. console.log("清空愿望单");
  131. exportWL();
  132. let wl=[];
  133. for(let i=0;i<g_rgWishlistData.length;++i){
  134. wl.push(g_rgWishlistData[i].appid);
  135. }
  136. let i=0;
  137. let fi=0;
  138. let bdialog;
  139. function removeWL(){
  140. if(i==(wl.length-1)){
  141. if(i!=0) bdialog.Dismiss();
  142. if(fi==0){
  143. ShowAlertDialog("成功","已经清空了所有愿望单!");
  144. }else{
  145. ShowAlertDialog("成功","已经成功从愿望单移除了"+(i-fi)+"个,还有"+fi+"个失败了!");
  146. }
  147. return;
  148. }
  149. let appId=wl[i];
  150. jQuery.ajax({ type: "POST",url: g_strWishlistBaseURL + 'remove/',data: {'appid':appId, sessionid: g_sessionID},success:function(html){
  151. if(bdialog) bdialog.Dismiss();
  152. bdialog=ShowBlockingWaitDialog('正在移除...',(i+1-fi)+'/'+wl.length+'&nbsp;&nbsp;&nbsp;&nbsp;失败:'+fi);
  153. ++i;
  154. setTimeout(removeWL,500);
  155. }}).fail(function(html){
  156. ++fi;
  157. if(bdialog) bdialog.Dismiss();
  158. bdialog=ShowBlockingWaitDialog('正在移除...',(i+1-fi)+'/'+wl.length+'&nbsp;&nbsp;&nbsp;&nbsp;失败:'+fi);
  159. ++i;
  160. setTimeout(removeWL,500);
  161. }).always(function(){
  162. //
  163. });
  164. }
  165. ShowConfirmDialog("警告!", "你确定要清空愿望单?").done(function(){removeWL();});
  166. }
  167.  
  168. let wl_header=document.getElementsByClassName("wishlist_header")[0];
  169. let wl_tools=document.createElement("span");
  170. wl_tools.style="margin-left:100px;";
  171. let export_btn=document.createElement("span");
  172. let import_btn=document.createElement("span");
  173. let empty_btn=document.createElement("span");
  174. export_btn.addEventListener("click",function(){exportWL()});
  175. empty_btn.addEventListener("click",function(){emptyWL()});
  176. export_btn.className="pulldown btnv6_blue_hoverfade btn_small";
  177. import_btn.className="pulldown btnv6_blue_hoverfade btn_small";
  178. empty_btn.className="btn_small s_s_s_empty_btn";
  179. export_btn.innerHTML="<span>导出愿望单</span>";
  180. import_btn.innerHTML="<span>导入愿望单</span>";
  181. empty_btn.innerHTML="<span>清空愿望单</span>";
  182. import_btn.style="position: relative;overflow: hidden;vertical-align:top;";
  183. let file_chooser=document.createElement("input");
  184. file_chooser.type="file";
  185. file_chooser.style="position: absolute;right: 0;top: 0;opacity: 0;display: inline-block;cursor:pointer;width:100%;height:100%;";
  186. file_chooser.addEventListener("change",function(){importWL()});
  187. import_btn.appendChild(file_chooser);
  188. wl_tools.appendChild(export_btn);
  189. wl_tools.appendChild(import_btn);
  190. wl_tools.appendChild(empty_btn);
  191. wl_header.appendChild(wl_tools);
  192. let empty_btn_style=document.createElement("style");
  193. empty_btn_style.innerHTML=`
  194. .s_s_s_empty_btn{
  195. border-radius: 2px;
  196. border: none;
  197. padding: 1px;
  198. display: inline-block;
  199. cursor: pointer;
  200. text-decoration: none !important;
  201. float: right;
  202. vertical-align: middle;
  203. margin: 0px;
  204. background-color:#9b1414;
  205. color:#ffffff;
  206. }
  207. .s_s_s_empty_btn:hover{
  208. color:#000000;
  209. background-color:#ee5555;
  210. }
  211. `;
  212. document.head.appendChild(empty_btn_style);
  213. })();

QingJ © 2025

镜像随时可能失效,请加Q群300939539或关注我们的公众号极客氢云获取最新地址