回复
25
查看
2407
收藏
36

21

赠楼

87%

赠楼率

226

蒸汽

122

主题

1057

帖子

2183

积分
发表于 2025-1-31 09:19:16 · 中国香港 | 显示全部楼层 |阅读模式
本文为 其乐用户(UID:270878) 发布的原创文章,转摘前请联系该用户获得许可
本帖最后由 270878 于 2025-1-31 09:19 编辑

前期提要:原始动机是我想“窃”走大佬们的游戏库,来回折腾发现最方便的做法还是
  • 把他们的游戏库数据“窃”过来;
  • 转换成 appid 列表;
  • 导到自己愿望单里。
解决信息淹没问题的方法也很简单,确保你今天不添加其他游戏到愿望单里就好,用添加日期来做标记。然而之前常用的愿望单插件已经不再有导入愿望单的功能了,所以抱着试试看的心态让 ai 帮我写了一个,没想到居然真的写出来了。不过本人完全不懂 python 和 js,所有方法和工具都是用 ai 生成的,赞美现代科技!

本帖包含如下工具
  • 游戏库页面数据转 appid 列表.py 用来把 steam 用户游戏库页面的信息转化为 appid 列表;
  • 一键导入愿望单 输入 appid 列表后自动导入到自己愿望单里去,如果这个游戏是你已经有的,则会自动移除愿望单后重新加入,用来统一这些游戏加入愿望单的时间。
之所以不整合成一个工具,是为了增加一键导入愿望单工具的适用范围。此外必备的有
  • Python
  • Chrome

把他们的游戏库数据“窃”过来



窃取方法不需要任何插件,有考虑过让 ai 写个 python 来自动处理,但需要安装一堆库,不适合分享出来了。推荐使用 Chrome 浏览器
  • 选中心仪大佬,找到其游戏库页面,例如谜之声的游戏库
  • 在游戏库页面下右键选择“检查”,在“元素”标签页下搜索“data-profile-gameslist”,搜索结果等号后面的内容包含了大佬游戏库里全部的 appid 信息。

    直接复制的话会显示“值过大,无法修改”,所以要在这里右键选择“以 HTML 格式修改”

    直接将内容复制到本地,保存为 文件名.txt 即可。
至此大功告成!

转换成 appid 列表



将以下代码保存为 游戏库页面数据转 appid 列表.py
  1. import json
  2. import os
  3. import tkinter as tk
  4. from tkinter import filedialog

  5. def process_games_file():
  6.     # 创建文件选择对话框
  7.     root = tk.Tk()
  8.     root.withdraw()

  9.     # 选择输入文件
  10.     input_path = filedialog.askopenfilename(
  11.         title="选择游戏数据文件",
  12.         filetypes=[("Text files", "*.txt"), ("All files", "*.*")]
  13.     )
  14.     if not input_path:
  15.         print("操作已取消")
  16.         return

  17.     try:
  18.         # 读取并处理文件
  19.         with open(input_path, "r", encoding="utf-8") as f:
  20.             html_content = f.read()

  21.         # 提取JSON数据
  22.         json_str = html_content.split('data-profile-gameslist="', 1)[1].split('"', 1)[0]
  23.         json_str = json_str.replace('"', '"')
  24.         data = json.loads(json_str)

  25.         # 提取所有appid
  26.         gcpd_ids = data.get("gcpdGames", [])
  27.         rg_ids = [game["appid"] for game in data.get("rgGames", []) if "appid" in game]
  28.         all_ids = sorted(set(gcpd_ids + rg_ids))

  29.         # 生成输出文件名
  30.         dir_name, file_name = os.path.split(input_path)
  31.         base_name, ext = os.path.splitext(file_name)
  32.         output_name = f"{base_name}(appid){ext}"
  33.         output_path = os.path.join(dir_name, output_name)

  34.         # 保存为逗号分隔格式
  35.         with open(output_path, "w", encoding="utf-8") as f:
  36.             f.write(",".join(map(str, all_ids)))  # 修改此处为逗号分隔

  37.         print(f"成功提取 {len(all_ids)} 个appid")
  38.         print(f"已保存到: {output_path}")

  39.     except Exception as e:
  40.         print(f"处理失败: {str(e)}")
  41.         print("请检查文件格式是否符合要求")

  42. if __name__ == "__main__":
  43.     process_games_file()
复制代码

运行以上 python 程序后,选择刚刚保存的 文件名.txt ,会在相同文件夹下自动生成 文件名(appid).txt。至此大功告成!

导到自己愿望单里



打开自己的愿望单页面,右键点选“检查”,选择“控制台”标签复制以下代码输入
  1. // == 在Steam愿望单页面(https://store.steampowered.com/wishlist/)执行 ==

  2. // 创建文件选择输入框
  3. const fileInput = document.createElement('input');
  4. fileInput.type = 'file';
  5. fileInput.accept = '.txt';
  6. fileInput.style.display = 'none';

  7. // 文件读取完成回调
  8. fileInput.onchange = async (e) => {
  9.     const file = e.target.files[0];
  10.     if (!file) return;

  11.     const reader = new FileReader();
  12.    
  13.     reader.onload = async (e) => {
  14.         const content = e.target.result;
  15.         // 解析appid(支持逗号分隔/换行分隔)
  16.         const appids = [...new Set(content.split(/[\n,]/)
  17.             .map(id => id.trim())
  18.             .filter(id => /^\d+$/.test(id))
  19.             .map(Number))];
  20.         
  21.         await executeReset(appids);
  22.     };

  23.     reader.readAsText(file);
  24. };

  25. // 主执行函数
  26. async function executeReset(appids) {
  27.     const sessionid = document.cookie.split('; ').find(c => c.startsWith('sessionid='))?.split('=')[1];
  28.     if (!sessionid) return alert('请先登录Steam');

  29.     const CONFIG = {
  30.         delay: 100,
  31.         retryCount: 1,
  32.         forceRefresh: true
  33.     };

  34.     let successCount = 0;
  35.     const total = appids.length;
  36.    
  37.     for (const [index, appid] of appids.entries()) {
  38.         let retry = 0;
  39.         while (retry < CONFIG.retryCount) {
  40.             try {
  41.                 // 第一步:移除愿望单
  42.                 await fetch(`https://store.steampowered.com/api/removefromwishlist`, {
  43.                     method: 'POST',
  44.                     headers: {
  45.                         'Content-Type': 'application/x-www-form-urlencoded',
  46.                         'X-Requested-With': 'XMLHttpRequest',
  47.                         'Origin': 'https://store.steampowered.com',
  48.                         'Referer': `https://store.steampowered.com/app/${appid}`
  49.                     },
  50.                     body: `appid=${appid}&sessionid=${sessionid}`
  51.                 });
  52.                
  53.                 // 第二步:重新添加
  54.                 const addResponse = await fetch(`https://store.steampowered.com/api/addtowishlist`, {
  55.                     method: 'POST',
  56.                     headers: {
  57.                         'Content-Type': 'application/x-www-form-urlencoded',
  58.                         'X-Requested-With': 'XMLHttpRequest',
  59.                         'Origin': 'https://store.steampowered.com',
  60.                         'Referer': `https://store.steampowered.com/app/${appid}`
  61.                     },
  62.                     body: `appid=${appid}&sessionid=${sessionid}`
  63.                 });

  64.                 const result = await addResponse.json();
  65.                 if (result.success) {
  66.                     console.log(`[${index+1}/${total}] ${appid}: ✅ 重置成功`);
  67.                     successCount++;
  68.                     break;
  69.                 } else {
  70.                     console.warn(`[${index+1}/${total}] ${appid}: ❌ 失败 (${result.strError})`);
  71.                     retry++;
  72.                 }
  73.             } catch (e) {
  74.                 console.error(`[${index+1}/${total}] ${appid}: 🚨 网络错误`, e);
  75.                 retry++;
  76.             }
  77.             await new Promise(r => setTimeout(r, CONFIG.delay * (retry + 1)));
  78.         }
  79.     }
  80.    
  81.     console.log(`\n完成! 成功重置 ${successCount}/${total} 个游戏`);
  82.     if (CONFIG.forceRefresh) {
  83.         alert('操作完成,请手动刷新愿望单页面查看最新排序');
  84.         window.location.reload();
  85.     }
  86. }

  87. // 触发文件选择
  88. document.body.appendChild(fileInput);
  89. fileInput.click();
复制代码
选择仅含 appid 列表的 txt 文件,内容格式形如“20,50,70,130,220,280,320,360,...”。
  • 对于自己库里有的游戏,会显示“失败”
  • 对于自己愿望单里已有的游戏,会移除愿望单后重新加入愿望单,以便使用添加日期作为标记。


以上程序自己实操了一遍,效果确实令人满意,故而分享出来。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

×

本帖被以下淘专辑推荐:

  • · 淘宝|主题: 855, 订阅: 131
回复

使用道具 举报

浏览本版块需要:
1. 初阶会员或更高等级;
2. (点击此处)绑定Steam账号
您需要登录后才可以回帖 登录 | 注册

本版积分规则

欢迎发帖参与讨论 o(*≧▽≦)ツ,请注意
1. 寻求帮助或答案的帖子请发到问题互助版块,悬赏有助于问题解决的速度。发错可能失去在该板块发布主题的权限(了解更多
2. 表达观点可以,也请务必注意语气和用词,以免影响他人浏览,特别是针对其他会员的内容。如觉得违规可使用举报功能 交由管理人员处理,请勿引用对方的内容。
3. 开箱晒物交易中心游戏互鉴福利放送版块请注意额外的置顶版规。
4. 除了提问帖和交易帖以外,不确认发在哪个版块的帖子可以先发在谈天说地

  作为民间站点,自 2004 年起为广大中文 Steam 用户提供技术支持与讨论空间。历经二十余载风雨,如今已发展为国内最大的正版玩家据点。

列表模式 · · 微博 · Bilibili频道 · Steam 群组 · 贴吧 · QQ群 
Keylol 其乐 ©2004-2025 Chinese Steam User Fan Site.
Designed by Lee in Balestier, Powered by Discuz!
推荐使用 ChromeMicrosoft Edge 来浏览本站
广告投放|手机版|广州数趣信息科技有限公司 版权所有|其乐 Keylol ( 粤ICP备17068105号 )
GMT+8, 2025-2-15 23:53
快速回复 返回顶部 返回列表