英雄联盟旧版本回放文件下载教程

英雄联盟的 .rofl 回放文件依赖客户端版本。客户端更新后,旧版本回放可能会显示 incompatible,从而无法通过客户端正常下载或播放。

本文记录一种通过客户端 F12 控制台调用 SGP 回放接口,手动下载旧版本 .rofl 文件的方法。

本文推荐使用 Pengu Loader 打开英雄联盟客户端内置浏览器的 F12 控制台。Pengu Loader 是面向英雄联盟客户端的 JavaScript 插件加载器,支持在客户端内使用 Chrome DevTools,也更方便访问 LCU 相关接口。

下载地址:https://pengu.lol/

在安装并启动后,通常可以通过以下快捷键打开客户端 DevTools:

Ctrl + Shift + I

Pengu Loader 文档中也提到,可在客户端内使用 Chrome DevTools,并提供 window.openDevTools() 用于打开内置 DevTools。

注意:
请勿将 idTokenleagueTokenmucJwtAuthorization Token 等登录态相关内容公开发布或发送给他人。
如果调试过程中不慎复制或公开,建议结束后退出英雄联盟客户端并重新登录。


一、获取目标对局的 gameId

打开英雄联盟客户端并登录账号。

如果已经安装 Pengu Loader,
可以通过 Ctrl + Shift + I 打开客户端内置浏览器的 DevTools,然后进入 Console 控制台。

在 Console 中执行:

1
2
3
4
5
6
7
8
9
10
11
12
13
const res = await fetch('/lol-match-history/v1/products/lol/current-summoner/matches?begIndex=0&endIndex=20');
const data = await res.json();

const games = data.games?.games ?? [];

console.table(games.map(g => ({
gameId: g.gameId,
time: g.gameCreation ? new Date(g.gameCreation).toLocaleString() : '',
queueId: g.queueId,
gameMode: g.gameMode,
gameType: g.gameType,
gameVersion: g.gameVersion
})));

图 1:通过最近对局列表获取 gameId

执行后会列出最近 20 场对局。

找到需要下载的那一局,记录对应的 gameId

示例:

1
40096571****

二、获取目标对局的大区 platformId

下载回放文件时,不能只使用 gameId,还需要知道该局所属大区,也就是 platformId

在 Console 中执行:

1
console.log(await fetch('/lol-lobby/v1/parties/player').then(r => r.text()));

图 2:通过大厅接口获取 platformId

在返回内容中查找:

1
"platformId":"TJ101"

例如这里的 platformId 为:

1
TJ101

那么该局回放对应的 matchId 应为:

1
TJ101_40096571****

最终保存的文件名可以使用:

1
TJ101-40096571****.rofl

platformId 必须与对局所属大区一致。
如果大区填错,SGP 接口通常会返回 NoSuchKey


三、确认对局所属大区与版本

为了避免 platformId 填错,可以进一步查询目标对局信息:

1
2
3
4
5
const gameId = 40096571****;

const res = await fetch(`/lol-match-history/v1/games/${gameId}`);
console.log(res.status, res.statusText);
console.log(await res.text());

图 3:确认对局所属大区与版本

重点检查以下字段:

1
2
platformId
currentPlatformId

如果玩家信息中均显示:

1
2
platformId: TJ101
currentPlatformId: TJ101

即可确认该局属于 TJ101

同时可以关注 gameVersion 字段。
例如目标对局版本为 16.10,而当前客户端已经更新到 16.11,客户端就可能将该回放标记为不兼容。


四、通过 SGP 接口下载 .rofl 文件

确认 gameIdplatformId 后,即可通过 SGP 回放接口下载 .rofl 文件。

需要修改的字段只有两个:

1
2
const gameId = 40096571****;
const platformId = "TJ101";

完整代码如下:

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
(async () => {
const gameId = 40096571****;
const platformId = "TJ101";
const matchId = `${platformId}_${gameId}`;
const fileName = `${platformId}-${gameId}.rofl`;

let leagueToken = await fetch('/lol-league-session/v1/league-session-token')
.then(r => r.json());

if (typeof leagueToken !== "string") {
leagueToken = leagueToken.token || leagueToken.leagueSessionToken || leagueToken.value || "";
}

const settings = await fetch('/client-config/v2/namespace/lol.client_settings')
.then(r => r.json());

const baseUrl =
settings["lol.client_settings.account_verification_edge.url"] ||
settings["lol.client_settings.league_edge.url"];

console.log("baseUrl =", baseUrl);
console.log("matchId =", matchId);

const url = `${baseUrl}/match-history-query/v3/product/LoL/matchId/${matchId}/infoType/replay`;

const res = await fetch(url, {
method: "GET",
headers: {
"Authorization": `Bearer ${leagueToken}`,
"Accept": "application/octet-stream"
}
});

console.log(res.status, res.statusText);
console.log("content-type:", res.headers.get("content-type"));

if (!res.ok) {
console.log(await res.text().catch(() => ""));
return;
}

const blob = await res.blob();
console.log("size:", blob.size);

const a = document.createElement("a");
a.href = URL.createObjectURL(blob);
a.download = fileName;
document.body.appendChild(a);
a.click();
a.remove();

console.log("已触发下载:", fileName);
})();

图 4-1:执行 SGP 下载脚本并输出 baseUrl 与 matchId

图 4-2:SGP 接口返回文件大小并触发下载

成功输出 baseUrl 后,根据网络情况等待一段时间,浏览器会弹出保存窗口或直接开始下载:

图 4-3:选择 .rofl 回放文件保存位置

最终会下载类似文件:

1
TJ101-40096571****.rofl

该文件即为英雄联盟回放文件。


五、使用 ReplayBook 播放旧版本回放

如果客户端尚未更新,ReplayBook 通常可以直接调用当前版本客户端播放对应版本的 .rofl 回放文件;如果客户端已经更新完成,旧版本回放可能会因为版本不一致而无法播放。此时需要准备与回放 gameVersion 对应的旧版客户端文件,再在 ReplayBook 中添加旧版本 League of Legends/Game 路径并扫描。旧版客户端可以前往 replays.xyz / Old League Clients 下载,该页面提供了多个历史版本的英雄联盟客户端归档,并说明压缩包需要使用 7-Zip 解压。:contentReference[oaicite:0]{index=0}
.rofl 文件不是普通视频文件,而是需要通过对应版本的英雄联盟游戏程序重放比赛过程。

因此,旧版本回放通常需要准备对应补丁版本的:

1
League of Legends/Game

如果缺少对应版本的 Game 文件夹,即使已经下载到 .rofl 文件,也可能无法正常播放。


六、常见问题

1. Identifier has already been declared

如果 Console 中出现:

1
Uncaught SyntaxError: Identifier 'leagueToken' has already been declared

说明之前已经声明过同名变量。

本文使用的是自执行函数写法:

1
2
3
(async () => {
// code
})();

这种写法可以避免变量反复声明导致的冲突。


2. NoSuchKey

如果返回:

1
2
<Code>NoSuchKey</Code>
<Message>The specified key does not exist.</Message>

通常是 platformId 与对局实际大区不一致。

例如 SGP 地址为:

1
https://tj101-sgp.lol.qq.com:21019

但请求的 matchId 是:

1
NJ100_40096571****

此时服务器会在 TJ101 的回放资源中查找 NJ100 的回放,自然无法命中。

应改为:

1
TJ101_40096571****

3. 文件体积异常

如果下载的文件只有几 KB,通常不是有效回放,而是错误信息被保存成了 .rofl

可以根据 Console 输出检查:

1
2
content-type
size

正常回放文件一般会有一定体积,不应只有几 KB。


4. state 为 incompatible

如果通过回放 metadata 查询到:

1
"state": "incompatible"

说明当前客户端无法直接播放该局回放。

这并不一定代表回放文件无法下载,只代表当前客户端版本不匹配。

后续需要使用 ReplayBook,并准备对应版本的 League of Legends/Game 文件夹。


5. 客户端下载接口返回 204,但目录中没有 .rofl

客户端自带的回放下载接口可能返回:

1
204 No Content

204 只代表接口调用成功,不代表 .rofl 文件一定已经成功写入磁盘。

如果回放版本与当前客户端不兼容,客户端可能识别到该局回放,但不实际落盘文件。

这种情况下,可以直接使用本文的 SGP 接口方式下载。


如果客户端已经更新,但对局刚结束不久,可以优先尝试本文方法。
如果英雄联盟的服务器端已删除或未保存该局 replay 文件,通过该方法也无法恢复。