前因

由于某些原因 有时候电脑重装或者 Steam 图标缓存删掉 会导致游戏快捷方式变成白纸图标
啊 那有人问了 你电脑重装了为什么还有游戏快捷方式啊
因为桌面文件和 Steam 与 Windows 系统不在一个盘内 游戏快捷方式都放在桌面的 Games 文件夹里了
game-folder-before
那很多白纸怎么修复呢 这个和网上流传的普通的问题不一样
大多数人是因为 Local 文件夹下缓存的 IconCache.db 出了问题(Windows 老毛病)
一般都是删除后重启资源管理器 Explorer 让它重新生成即可
你打开任意一个游戏的快捷方式可以看出来 它的图标来源是 Steam 文件夹内/steam/game/里面缓存的图标
lnk-notepad
那这些图标哪里来的呢 是当你下载这个游戏的时候顺带给你下载的
这时候有人问了 那我平时在库里不就能看到我库里游戏的图标吗 这不是缓存下来了吗
你说的对 但是库里的游戏图标/banner 的位置在 Steam 文件夹内/appcache/librarycache/ 而且命名都是 Appid 不能直接复制拿来修复这个问题
librarycache-folder
这时候在 Github 上翻到了一个跟我想法一致的一个 repository

正好这次 Steam 又因为新版的某些原因(该死的 steamwebhelper)重装了 图标缓存文件全部消失 因此写此文章

如果你不会删除 IconCache.db 该 repository 也提供了一键删除 Windoos 图标缓存的批处理文件

使用截图

run
game-folder-after

repository 地址

本家: https://github.com/wordpress219/steam-icon-fix
yingzeliangzi 分支: https://github.com/yingzeliangzi/steam-icon-fix/tree/main

简介

用途:修复 Steam 创建的桌面快捷方式丢失(白图标)的异常情况

用法

方法一(内置环境,推荐):

1、下载 Release 中的程序包压缩文件(当前仅支持 Windows 系统),并解压
2、运行 main.exe,程序会自动弹出命令窗口并扫描 Steam 安装目录/库目录,然后自动下载图标

方法二(编程方法):

1、安装 Python2.7 以上或 Python3.4 以上的发行版本(推荐使用 Python3)
2、运行 pip install steam[client],安装依赖项,如果存在系统代理无法下载需加入条件 –proxy=127.0.0.1:端口
3、cd 到代码文件夹所在目录下(或 Shift+右键文件夹空白部分在这里打开命令行),执行 python main.py,程序会自动弹出命令窗口并扫描 Steam 安装目录/库目录,然后自动下载图标

原理:

1、程序首先自动按盘符字母顺序扫描默认的 Steam 安装目录(每个盘符下的”Program Files (x86)/Steam”, “Program Files/Steam”, “Steam”文件夹)有无 steam.exe 文件,有则作为 Steam 的安装目录
2、若程序未在默认目录下发现 Steam 安装,需要用户手动指定 Steam 的安装目录,即 steam.exe 文件所在文件夹,并进行校验直到找到 steam.exe 文件
3、程序会自动扫描 Steam 安装目录下 steamapps 文件夹中的 Steam 库配置文件 libraryfolders.vdf(保存 Steam 库的位置和游戏的 APPID),并读取所有游戏的 APPID,若该文件损坏则无法修复
4、扫描完成后程序会自动按照 APPID 检测 Steam 安装目录下 steam/games 中对应的游戏图标是否已经存在,若存在则跳过,否则在 Steam 网站上查询游戏的客户端图标并下载,下载完成后会提示状态

注意:

1、当前版本仅支持 Windows 系统
2、有些游戏在 Steam 商店上架时没有提供对应的中文名称翻译,因此这些游戏将直接显示英文名称
3、如果有些应用或游戏没有提供客户端图标(很罕见,几乎没有),下载时将会直接跳过并提示,Steam 常见再发行文件会被自动跳过且不提示
4、建议使用代理的用户手动配置环境变量,否则访问 Steam 网站时会出现 SSL EOF 错误 8,设置方法:
(1)Windows 系统:在控制面板中打开高级系统设置(win8 以上可以直接用搜索),选择环境变量,在用户变量中添加两条:变量名 1:HTTP_PROXY,变量值 1:包括协议的代理服务器地址;变量名 2:HTTPS_PROXY,变量值 2:包括协议的代理服务器地址
(2)注意:如果代理软件/服务器不支持 HTTPS/FTP 代理,只支持 HTTP/SOCKS,请将协议设置为其中之一,如 Clash(CFW),设置为”http://127.0.0.1::7890“ 或 “socks5://127.0.0.1::7890”开头的地址
5、修复完成之后一般刷新几下图标即可恢复正常,或者下载代码/tool 中的 rebuild_icon_cache.bat 文件重建图标缓存
6、如下载图标后快捷方式仍为白图标,在 Steam 中右键游戏重新创建快捷方式,由于部分 App 更换新图标,旧快捷方式的 clienticon 需要更新,如 100% Orange Juice!
强烈推荐使用 Clash 的 TUN 模式 避免大多数网络问题

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import string
import os
import vdf
from steam.client import SteamClient
from urllib.request import urlretrieve

cloudflare_icon_url = "https://cdn.cloudflare.steamstatic.com/steamcommunity/public/images/apps/"
steam_folder_finder = ['Program Files/Steam','Program Files(x86)/Steam','Steam']
disk_all = []
game_list = []

def get_disklist():
global disk_all
for c in string.ascii_uppercase:
disk = c + ':\\'
if os.path.isdir(disk):
disk_all.append(disk)

def get_steam_vdf():
global steam_vdf
for i in disk_all:
for j in steam_folder_finder:
if os.path.exists(os.path.join(i,j,'steamapps','libraryfolders.vdf')) is True:
steam_vdf = os.path.join(i,j,'steamapps','libraryfolders.vdf')
global steam_icon_folder
steam_icon_folder = os.path.join(i,j,'steam','games')

def get_gamelist():
global steam_vdf
global game_list
vdf_data = vdf.load(open(steam_vdf))
for i in range(len(vdf_data['libraryfolders'].keys())):
i_game_list = list(vdf_data['libraryfolders'][str(i)]['apps'].keys())
game_list.extend(i_game_list)
#print(game_list)


def get_icon():
client = SteamClient()
client.anonymous_login()
assert client.logged_on
for app_id in game_list:
app_id = int(app_id)
game_info = (client.get_product_info(apps=[app_id, ]))['apps'][app_id]['common']
try:
game_name = game_info["name_localized"]["english"]
except KeyError:
game_name = game_info["name"]
if game_info["name"] == "Steamworks Common Redistributables":
continue
if "clienticon" in list(game_info.keys()):
if os.path.exists(os.path.join(steam_icon_folder, game_info["clienticon"] + '.ico')):
print("# %s \t\tICON ALREADY EXISTS, SKIP." % game_name)
continue
game_icon_url = cloudflare_icon_url + str(app_id) + "/" + game_info["clienticon"] + '.ico'
game_icon_filename = os.path.join(steam_icon_folder, game_info["clienticon"] + '.ico')
urlretrieve(game_icon_url, game_icon_filename)
if os.path.exists(game_icon_filename):
print("# %s \t\tICON DOWNLOAD SUCCESSFUL." % game_name)
else:
print("# %s \t\tICON DOWNLOAD FAILED." % game_name)
else:
print("# %s \t\tDON'T HAVE ICON, SKIP." % game_name)
return True

if __name__ == '__main__':
get_disklist()
get_steam_vdf()
get_gamelist()
get_icon()