保存kongregate上的Flash游戏以供离线游玩


前言

kongregate是一个Flash游戏网站,提供大量的游戏(没有中文,*),而我刚好维护着一个Flash收藏站,这不得抓取里面的游戏下了汉化?于是我就这么“刚”上了kongregate,抓取,开始!

抓取过程

1.挑选受害者

迷你塔防,就这款塔防小游戏吧,第一步完成

2.查看网络请求

按F12打开浏览器的开发者工具,找到上方的“网络”

现在什么都没有对吧,按F5刷新一下页面你会发现加载了一大堆的网络请求,而我们要的SWF就在里面

3.过滤数据

kongregate是通过GET请求获取地址的,返回的SWF地址格式如下所示:

http://chat.kongregate.com/gamez/<数字>/<数字>/live/<游戏名>.swf?kongregate_game_version=<数字>

其中chat.kongregate.com域名可能是其他的域名,数字是随机的。

我们可以在刚刚加载的一堆请求中按Ctrl+F搜索 chat.kongregate.com.swf 如果你看到如下内容就说明你找到它了:

点击它,然后你就可以在右侧的

把这段地址复制出来:

//chat.kongregate.com/gamez/0007/1458/live/miniTowerDefence.swf?kongregate_game_version=1385373388

在浏览器中输入这段地址,如果浏览器开始了下载(如果你装了Ruffle插件那么你会看到游戏界面),恭喜你,你成功拿到了你要的SWF游戏。

4.绕开、去除URL锁

kongregate的游戏都有URL锁,顾名思义就是锁定该Flash游戏只能kongregate.com这个域名中打开,无法放到其它网站上使用,这时候就需要用JPEXS Free Flash Decompiler这款开源免费的Flash反编译软件进行反编译了,使用JPEXS打开刚刚下载的miniTowerDefence.swf,打开游戏的主文件,搜索 URLLock

哎~这个URL锁的开关就这么明晃晃的摆在这儿,把true设置成false,再用Flash播放器打开,完事。(我想过一万种加密方式,但我就是没想到它很贴心的给我配了个开关🤣🤣🤣)

当然,一些简单的锁我们可以直接去除,但复杂的锁怎么办呢?

解决办法:

  • 找大佬帮解
  • V我50
  • 欺骗SWF,通过在本地模拟网站让SWF以为它在kongregate.com上

模拟网站

安装nodejs,然后找个文件夹创建server.js文件并复制文末代码,并在server.js的目录下创建一个名为kongregate.com的文件夹,把刚刚下载的SWF文件移到kongregate.com里。

运行node server.js,浏览器打开http://localhost:3000/kongregate.com/,你应该能够看见游戏界面了(如果你安装了**Ruffle**插件的话)

const http = require('http');
const fs = require('fs');
const path = require('path');

const server = http.createServer((req, res) => {
    const filePath = path.join(__dirname, req.url); 
    const ext = path.extname(filePath);

    fs.access(filePath, fs.constants.F_OK, (err) => {
        if (err) {
            res.writeHead(404, { 'Content-Type': 'text/plain' });
            res.end('404 Not Found');
            return;
        }

        const mimeTypes = {
            '.swf': 'application/x-shockwave-flash',
            '.html': 'text/html',
            '.txt': 'text/plain'
        };
        const contentType = mimeTypes[ext] || 'application/octet-stream';

        res.writeHead(200, { 'Content-Type': contentType });
        fs.createReadStream(filePath).pipe(res);
    });
});

server.listen(3000, () => {
    console.log('Server running at http://localhost:3000/');
});

好了,可以愉快的玩耍了。

我的Flash收藏站:https://flash.100713.xyz

你还在等什么?去玩啊!



  目录