《链游Farmers World【农民世界】爆火,发布一个免费开源的辅助挂机脚本》
https://blog.csdn.net/CharlesSimonyi/article/details/121512342
在上一篇文章中,我们开源了一个【农民世界】挂机脚本,本系列最后一遍文章,我们来简单解析一下具体实现原理

思路

一般来说,网页游戏辅助软件最终极的形态就是直接和服务器发HTTP请求,不用打开浏览器,没有模拟点击操作,不用判断屏幕上显示的内容,悄无声息的在后台默默的工作。这种基于协议直接和服务器通信实现的辅助软件,我们一般称为【脱机外挂】。这种形式的辅助软件可以做到最高效率,一台机器可以多开上百上千个账号,但实现起来同时也是最难的。当然,和端游、手游不同,网页游戏所有的客户端JavaScript代码,都在浏览器中可见,可能会做一些打包和混淆,但总体来讲,分析这些代码难度比端游的本机代码要容易很多。那么我们只需要打开浏览器调试工具,抓包分析内容,在它的JavaScript代码中下断点调试,就可以写出模拟操作的脚本。

抓包

以【农民世界】为例,我们打开火狐浏览器,登录游戏,查看它发送的这些HTTP请求,很容易就能找到一些关键数据。
在这里插入图片描述
可以看到这个HTTP请求,获取到了我们账户上的能量、金币、食物、木头的信息。
接下来,我们只需要用python的requests包,学着浏览器的样子去发送这个HTTP请求,就能拿到这些数据。

import requests
from pprint import pprint

url = "https://api.wax.alohaeos.com/v1/chain/get_table_rows"
post_data = {
    "json": True,
    "code": "farmersworld",
    "scope": "farmersworld",
    "table": "accounts",
    "lower_bound": "m45yy.wam",
    "upper_bound": "m45yy.wam",
    "index_position": 1,
    "key_type": "i64",
    "limit": 100,
    "reverse": False,
    "show_payer": False
}
resp = requests.post(url, json=post_data).json()
pprint(resp)

在这里插入图片描述
同理,我们也可以找到我们的所有正在栽的农作物和小鸡等相关的HTTP请求,上图中我们可以看到,这个HTTP请求返回的数据表明我正在种的玉米的信息。
在这里插入图片描述
不过,当我们分析浇水、收割等操作的HTTP请求时,就会发现有点复杂,里面有很多数据我们不知道如何去模拟,先不用急,我们大致可以猜到,他实际上是和WAX钱包进行了交互,当你点确认签署交易的时候,WAX钱包对该笔交易进行签名,发送数据到智能合约。

顺藤摸瓜

我们看到这些HTTP请求,都有一个共同的结尾,就是 get_table_rows,于是我们去网上搜索这个关键词,发现,原来这就是 EOS RPC API,而WAX就是EOS克隆过来的兼容网络,自然也是用这一套API,我们查看关于get_table_rows的文档:
https://developers.eos.io/manuals/eos/latest/nodeos/plugins/chain_api_plugin/api-reference/index#operation/get_table_rows
就知道,原来这个API,本质上是去查询智能合约的数据,而农民世界的智能合约名为【farmersworld】,于是我们直接去WAX Explorer上查询该智能合约的相关信息:
https://wax.bloks.io/account/farmersworld
在这里插入图片描述
我们可以直接看到这个智能合约有哪些表【tables】,有哪些【Actions】,我们甚至可以直接在这里输入账号,就可以查询到我们账号上的资源、农作物、工具,等信息。
在这里插入图片描述
同理,再看【Actions】,我们就找到了农民世界中当你点击收割,喂鸡,浇水,背后对应的函数。比如【cropclaim】就是对农作物进行浇水,我们甚至可以在这里填写【owner】(账号)和【asset_id】(农作物id),然后点发送事务,在弹出的WAX钱包中授权,就可以完成农作物的浇水操作。
至此,我们终于理解,整个【农民世界】的游戏其实都是对该智能合约的操作,从【Tables】中读取数据,执行【Actions】操作处理农作物。【Tables】中的所有条目,我们都可以直接发送HTTP请求进行查询,接下来就是直接调用该智能合约【Actions】中的函数,即可完成自动化操作。

调用智能合约

调用WAX上的智能合约,最简单的方法当然是直接使用官方提供的SDK,由于WAX本质上就是EOS网络,当然也是使用【eosjs】 https://github.com/EOSIO/eosjs 这个SDK来和智能合约交互。
我们简单看一下【eosjs】的文档:https://developers.eos.io/manuals/eosjs/latest/how-to-guides/how-to-submit-a-transaction
便知道如何去【发送事务】,大致是调用eosjs中的这个函数【api.transact】,那么对于农民世界来说,调用这个函数的时候,参数该怎么写呢,这时我们可以回到火狐或Chrome浏览器中,调试它的JavaScript代码,看他怎么填这些参数,我们自己的辅助脚本也照着去填,就可以实现同样的操作。
在这里插入图片描述
在网页的JavaScript代码中搜索【api.transact】并下断点,然后去游戏中点一下浇水,看看他是怎么【浇水】的,那么我们的代码也是原模原样的用这些参数去调用【api.transact】即可。

不过需要注意的是,【农民世界】本身使用的并不是【eos.js】,而是WAX云钱包【WAX Cloud Wallet】的SDK:
【waxjs】https://developer.wax.io/waa/use-waxjs
其实本质上,【waxjs】最终也是调用【eos.js】,只是涉及到私钥的问题,【waxjs】做了一层包装。

因为大多数【农民世界】世界的玩家默认都是通过WAX云钱包登录游戏的,而你的私钥是由WAX云钱包托管的,并且不可以导出私钥。而直接使用【eos.js】的话,是要提供私钥的,于是【waxjs】做了一层包装,增加了一个【login()】方法,弹出一个web小窗口让你输入账号密码进行登录,并且在调用【api.transact】的时候,也会弹出一个小窗口让你授权,但你确认授权以后,WAX云钱包使用托管在云端的私钥对交易数据进行签名,然后下发签名数据,最终在你的浏览器端通过【eos.js】发送交易,这样可以保证的私钥不会泄露,同时也能签署交易。

其实对于工作室来说,完全可以不通过WAX云钱包注册账号,而是自行在WAX网络上创建钱包,这样私钥也可以直接掌握在手里,配合【eos.js】,完全不需要浏览器,就可以签署交易,发送交易,完成【农民世界】的所有操作。

Python实现

市面上的大多数【农民世界】的挂机脚本,都需要借助浏览器或者Webbrowser来运行,就是因为WAX云钱包的关系,大多数用户都是通过WAX云钱包注册的账号,而WAX云钱包只有【waxjs】这个SDK,而这个SDK是JavaScript写的,而且还没法在node上运行,因为它需要在浏览器中弹出登录窗口和授权窗口,需要有浏览器的环境。理论上我们可以分析【waxjs】的代码,通过模拟发送HTTP请求的方法完成【登录窗口】和【授权窗口】做的事情,但是由于时间精力有限,其实并没有必要了,快速出一个能用的东西,先用起来再说,不然去晚了汤都喝不上。

而我们开源的【OpenFarmer】之所以需要selenium和chrome,就是这个原因,需要有一个chrome窗口,是为了在里面跑【waxjs】,然后由于我们使用python来开发,所以我们借助selenium,就可以用python去调用【waxjs】这个JavaScript写的SDK的【api.transact】方法,实现自动化操作。

其实这个项目最适合用JavaScript来写,因为WAX和WAX云钱包只提供了JavaScript的SDK,如果是【Ethereum】或【BSC】上的链游,由于我们有python版本的SDK【Web3.py】https://github.com/ethereum/web3.py
用它直接和链上的智能合约交互会方便些

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐