agario-client, node.js agar.io 客户端实现

分享于 

23分钟阅读

GitHub

  繁體 雙語
Node.js agar.io client implementation
  • 源代码名称:agario-client
  • 源代码网址:http://www.github.com/pulviscriptor/agario-client
  • agario-client源代码文档
  • agario-client源代码下载
  • Git URL:
    git://www.github.com/pulviscriptor/agario-client.git
    Git Clone代码到本地:
    git clone http://www.github.com/pulviscriptor/agario-client
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/pulviscriptor/agario-client
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    agario客户端

    使用API的agar.io的Node.js 客户端。

    过时 !

    琼脂开发者为游戏制作了全新的代码。 现在代码运行在我不能反向工程的虚拟机中,因为缺乏知识和经验。 不幸的是,该跟 agario-client 告别了。 最初 agario-client的想法是让我学习 web sockets,二进制协议,逆向工程,github和有趣的整体。 我相信我已经做到了。 感谢你的帮助 !

    命令行指令

    • 安装 node.js
    • 使用 npm install agario-client 安装客户端( 忽略 python 错误)
    • 运行 node./node_modules/agario-client/examples/basic.js ( 用于测试目的)
    • 如果成功了,你就可以查看API和代码了
    API

    有两种类型的对象具有 API:

    • 向 agar.io 前端服务器连接的客户端,并与它进行通信。 如果你想繁殖和控制你的Ball,你需要与 Client 交谈
    • 的球。 游戏中的所有东西都是 Balls (viruses/food/players...).,你不能控制 Balls 对象,只观察它们做了什么。

    两个对象都具有来自 events.EventEmitter的事件的相同方法:

    • .on('eventName', callback) 将侦听器附加到事件
    • .once('eventName', callback) 将侦听器附加到事件,但只执行一次
    • .removeListener('eventName', callback) 从事件中移除侦听器
    • .removeAllListeners('eventName') 从事件中删除所有侦听器
    • .emit('eventName', p1, p2...) 发出你自己的事件
    • 查看更多关于文档的信息。
    客户端 API
    
    var AgarioClient = require('agario-client');
    
    
    var client = new AgarioClient(client_name);
    
    
    
    

    client_name 是用于日志记录的客户端的字符串。 这不是你的名字。

    客户端属性

    你可以更改的属性:

    • client.debug 调试级别 0 -5. 0完全无提示。5是超详细的。 默认值:1
    • client.connect() 调用中使用的client.server 地址
    • client.connect() 调用中使用的client.key
    • 登录令牌。请参见如何在附加信息中获取令牌。
    • 用于连接的client.agent 代理。 检查附加信息。
    • 绑定到网络连接的client.local_address 本地接口( 接口的IP地址)
    • client.headers 对象,带有 web socket连接头。 默认值:{'Origin':'http://agar.io'}
    • 如果你知道他在游戏中的位置,我们将不会知道他在游戏中的动作,因为他只知道你看到的场。 原始代码 destroy()Ball 当他从视图中 disappear 时。 如果你想出于某种原因,你可以在 client.on('ballDisappear') 中做这个。 默认值:5 *60*1000 ( 5 分钟)
    • 在毫秒内搜索和销毁非活动 Balls 时的client.inactive_check 时间。 默认值:10 *1000 ( 10秒)
    • client.spawn_attempts 在断开(。在官方服务器上产生不稳定的繁殖) 之前,我们需要多少次尝试。 默认值:25
    • 在繁殖过程中 client.spawn_interval的时间。 默认值:200

    最好不要改变或者你可以打破一些东西:

    • client.balls 对象,Client 所知道的所有 Balls。 访问 Ballclient.balls[ball_id]
    • Client 拥有的活动 Ball of的client.my_balls array,可以控制。
    • client.score 自繁殖以来的个人得分
    • FFA模式下的主机 id Ballsclient.leaders array。 ( 玩家可以有很多 Balls,但是sever只发送一个 Ball的一个 ID )
    • 团队模式中团队得分的client.teams_scores array
    • 你为 Client 设置的client.client_name 名称( 不是昵称)
    • 接收( 因为它们包含了关于 Balls的信息的信息)的数据包的client.tick_counter 数量( 我称它们为 ticks )

    客户端方法

    • client.connect(server, key) 连接到 agar.io 应用层服务器。 检查服务器中的部分以了解如何获取服务器IP和密钥。 每台服务器都有几个房间,所以你可能需要连接几次才能进入你想要的空间。 如果你连接到正确的房间,你可以查看 client.once('leaderBoardUpdate') 以了解是否已经连接
    • client.disconnect() 断开与服务器的连接
    • client.spawn(name) 将使用昵称生成 Ball。 当服务器发送 Ball 信息时,将调用 client.on('myNewBall')。 如果未建立连接,将返回 false
    • client.spectate() 将激活spectating模式。 查看 client.on('spectateFieldUpdate')的视野更新。 如果未建立连接,将返回 false
    • spectating模式( 正式客户的 Q ) 中的client.spectateModeToggle() 切换spectate模式。 使用 client.moveTo() 移动你的"相机"。 查看 client.on('spectateFieldUpdate')的移动更新。 如果未建立连接,将返回 false
    • client.moveTo(x,y) 发送移动命令 xy 是你要移动的数字。 坐标( 大小) 你可以在 client.on('mapSizeLoad') 中得到。 你的Balls 将移动到指定的坐标,直到你发送新坐标才能移动。 原始源代码在每次和split之前完成。 如果未建立连接,将返回 false
    • client.split() 将把你的Balls 分成两个。 Ball 将在你使用 client.moveTo() 发送的最后一个方向被弹出。 当服务器发送 Balls 信息时,将调用 client.on('myNewBall')。 如果未建立连接,将返回 false
    • client.eject() 会从你的Balls 中弹出一些质量。 质量将在你使用 client.moveTo() 发送的最后一个方向被弹出。 弹出质量为 Ball ( 但我们不属于他们)。 因此,当服务器发送弹出的质量 Balls 信息时,将调用 client.on('ballAppear')。 如果未建立连接,将返回 false

    客户端事件

    在这个列表中 on.eventName(param1, param2) 意味着你需要做 client.on('eventName', function(param1, param2) {.. . })

    • on.connecting() 连接到服务器
    • on.connected() 连接到服务器并准备繁殖
    • on.connectionError(err) 连接错误
    • on.disconnect() 已经断开连接
    • 从服务器接收到 on.message(packet) 新数据包( 检查 packet.js )
    • on.myNewBall(ball_id) 我的新 Ball 创建了 (spawn/split/explode...)
    • on.somebodyAteSomething(eater_id, eaten_id) 有人吃了点东西
    • on.scoreUpdate(old_score, new_score) 个人评分已经更新
    • on.leaderBoardUpdate(old_highlights, new_highlights, old_names, new_names) 在FFA模式下更新领导者。 ( names 是领导者的昵称,而 highlights 是数字 0 或者 1 对应于名字的名称,即在引导面板中显示昵称( 例如昵称)
    • on.teamsScoresUpdate(old_scores, new_scores) 团队的array 在团队模式下得分
    • on.mapSizeLoad(min_x, min_y, max_x, max_y) 地图尺寸更新( 更新为16.02.2016这里调用然后是新的地图接收的虚拟大小)
    • 当我们删除所有 Balls 和停止定时器( 连接丢失) 时 on.reset()
    • on.winner(ball_id) 有人赢了,服务器要重启
    • on.ballAction(ball_id, coordinate_x, coordinate_y, size, is_virus, nick) 关于 Ball的一些行动
    • on.ballAppear(ball_id)Ball 出现在"屏幕"( 视图字段) 上
    • on.ballDisappear(ball_id)Ball 从"屏幕"( 视野) 中消失
    • ( 在本文档底部) 删除了 on.ballDestroy(ball_id, reason)Ball ( 检查原因
    • on.mineBallDestroy(ball_id, reason) 矿井( 你的) Ball 删除( 检查这里文档底部的原因)
    • on.lostMyBalls() 所有 Balls 销毁/吃掉
    • on.merge(destroyed_ball_id) 矿井两个 Balls 连接到一个
    • on.ballMove(ball_id, old_x, old_y, new_x, new_y)Ball 移动
    • on.ballResize(ball_id, old_size, new_size)Ball 调整大小
    • on.ballRename(ball_id, old_name, new_name)Ball 集名称/更改名称/我们发现名称
    • on.ballUpdate(ball_id, old_update_time, new_update_time) 收到有关球的新数据
    • on.spectateFieldUpdate(cord_x, cord_y, zoom_level)client.spectate() 模式下的视图域坐标
    • on.experienceUpdate(level, current_exp, need_exp) 体验信息更新( 如果logined使用认证令牌 )
    • on.packetError(packet, err, preventCrash) 无法解析数据包。这可能意味着琼脂更改协议或者问题为 #46. 默认情况下客户端将崩溃。 但是如果你确定这不是协议更改并且不需要新问题,那么在回调执行结束之前需要调用。 如果发生这里错误,我强烈建议断开 Client
    • on.debugLine(line_x, line_y) 有时会向客户端发送一行,以便从你的球体向点呈现,尽管不希望看到它。
    • on.gotLogin() 服务器授权你在原始代码中,检查问题 94
    • on.logoutRequest() 服务器强制客户端调用 window.logout()
    球 API

    var ball = client.balls[ball_id]; ball_id 是你可以从事件中获取的数字

    球特性

    你可以更改的属性:

    • 如果需要,你可以创建不存在的属性,但如果你想要

    最好不要改变或者你可以打破一些东西:

    • Ball ( 数字)的ball.id ID
    • 拥有 Ball的播放机的ball.name 昵称
    • ball.x 最后一个名为 Ball的坐标( 如果 ball.visibletrue,则为当前坐标)
    • ball.y 最后一个已经知的Ball 坐标( 如果 ball.visibletrue,则为当前坐标)
    • ball.size 最后一个已经知的大小( 如果 ball.visibletrue,则它的当前大小为 Ball )
    • ball.size 计算的球的ball.mass 质量
    • 带有 Ball 颜色的ball.color 字符串
    • ball.virus 如果 true 则是病毒( 爆炸大球的绿色物体)
    • 如果 ball.minetrue,那么我们就拥有这个 Ball
    • 了解这里 Ballball.clientClient ( 如果不是 ball.destroyed )
    • 如果 ball.destroyedtrue,那么这个 Ball 就不再存在了,
    • 如果在我们的"屏幕"上看到这个值,那么我们就可以看到这个( 视图域)
    • 我们上次看到这个 Ball 时的ball.last_update 时间戳
    • 当我们看到这个 Ball 时,ball.update_tick 最后一次出现

    球方法

    • 如果设置了 ball.idball.toString() 将返回和 (ball.name)。 所以你可以直接记录 Ball
    • 其他方法用于内部使用

    球事件

    在这个列表中 on.eventName(param1, param2) 意味着你需要做 ball.on('eventName', function(param1, param2) {.. . })

    • ( 在本文档底部) 删除了 on.destroy(reason)Ball ( 检查原因
    • on.move(old_x, old_y, new_x, new_y)Ball 移动
    • on.resize(old_size, new_size)Ball 调整大小
    • on.update(old_time, new_time) 收到有关 Ball的新数据
    • on.rename(old_name, new_name)Ball 更改/设置名称/我们发现名称
    • on.appear()Ball 出现在"屏幕"( 视图字段) 上
    • on.disappear()Ball 从"屏幕"( 视野) 中消失
    电子邮件服务器

    当你做 var AgarioClient = require('agario-client'); 你可以访问 AgarioClient.servers 函数需要 opt 作为选项对象,而 cb 作为回调函数。

    服务器选项

    所有函数都可以接受:opt.agent 用于连接。 检查附加信息opt.local_address 本地接口绑定到网络连接( 接口的IP地址) opt.resolve 设置为 true,如果你通过其他方式解析 m.agar.ip IP,则在客户端( 因为SOCKS4不能接受域名) opt.ip 中解析 IP。

    • servers.getFFAServer(opt, cb) 请求FFA服务器。
      需要 opt.region
    • servers.getTeamsServer(opt, cb) 请求团队服务器。
      需要 opt.region
    • servers.getExperimentalServer(opt, cb) 请求实验服务器。
      需要 opt.region
      你自己的风险 ! agario客户端不能保证实验服务器的支持 !
    • 请求方服务器的servers.getPartyServer(opt, cb)
      需要 opt.party_key
    • 请求方服务器的servers.createParty(opt, cb)
      需要 opt.region

    检查这里文件下面的区域列表

    服务器回调

    回调将使用可以包含以下内容的单个对象调用:

    • server 服务器( 在传递给之前添加 ws://
    • key - 服务器的密钥
    • error - 错误代码( WRONG_HTTP_CODE/WRONG_DATA_FORMAT/REQUEST_ERROR/LOOKUP_FAIL )
    • error_source - 当可以用时从 req.on.error 传递的错误对象( 例如,当 REQUEST_ERROR 发生时)
    • res - 响应对象可以用时( 例如发生 WRONG_HTTP_CODE 时)
    • data - 可用时响应数据字符串( 例如当发生 WRONG_DATA_FORMAT 时)

    如果 opt.lookup 设置为 true,并且只有 error_source,则 LOOKUP_FAIL 可能发生

    你可以检查 examples/basic.js 如何使用这里。

    附加信息

    agario-devtools

    如果你希望记录/重复或者观看你的客户端通过网络浏览器进行的操作,你可能需要检查 agario-devtools。

    区域列表

    • 巴西
    • cn中国
    • eu伦敦
    • jp东京
    • 运行俄罗斯
    • sg新加坡
    • tk土耳其
    • 美国亚特兰大

    Ball原因列表

    • {'reason':'reset'}Client 破坏所有内容( 连接丢失)?
    • {'reason':'inactive'} 当我们没有看到 client.inactive_destroyBall
    • {'reason': 'eaten', 'by': ball_id}Ball 被吃掉时
    • Ball 与其他 Ball 合并时,{'reason':'merge'}
    • {'reason':'server-forced'} 用于删除所有球的服务器命令

    授权令牌

    要登录到你的帐户,你需要请求令牌。 你可以在 examples/auth_token.js 中检查示例,首先创建新的AgarioClient.Account

    var account =newAgarioClient.Account();

    然后你需要登录到 http://agar.io,然后转到 http://www.facebook.com/,然后获取 Cookies c_user,datr,xs。 以下是 account的属性列表:

    • account.c_user - 从 http://www.facebook.com/ 设置为 cookie"c_user"。
    • account.datr - 从 http://www.facebook.com/ 设置为 cookie"datr"。
    • account.xs - 从 http://www.facebook.com/ 设置为 cookie"xs"。
    • account.agent - 连接代理。 测试表明你可以从任何IP请求令牌,然后在任何IP上使用它,这样你就不需要 socks/代理。
    • 收费 account.debug - 显示警告,否则为英镑。默认值:1
    • account.token_expire - 在令牌过期时包含时间戳以毫秒为单位。 令牌对于 1 -2小时有效。 if (+new Date)>account.token_expire 然后你需要申请新的令牌,并在新的连接到琼脂。

    然后你打电话

    account.requestFBToken(function(token, info) {
     //If you have `token` then you can set it to `client.auth_token` // and `client.connect()` to agar server});

    如果 token 为空,则出现错误。 检查可以包含以下内容的info:

    • info.error - 连接错误的error
    • info.res - 响应 http.IncomingMessage 对象的
    • info.data - 页面内容

    socks/代理支持

    你可以更改 AgarioClientAgarioClient.servers的默认代理以用于连接。 你可以使用库来完成它。 对于测试和示例我使用了 socks。 执行 node./node_modules/agario-client/examples/socks.js 测试并读取 examples/socks.js 文件以了解如何使用 SOCKS。 对于代理,你需要使用其他的库。

    添加属性/事件

    你可以将自己的属性/事件添加到客户/球。 var AgarioClient = require('agario-client');

    • Client的Prototype位于 AgarioClient.prototype.
    • Ball的Prototype位于 AgarioClient.Ball.prototype.

    例如:

    AgarioClient.Ball.prototype.isMyFriend=function() { ... }; //to call ball.isMyFriend()AgarioClient.prototype.addFriend=function(ball_id) { ... }; //to call client.addFriend(1234)

    事件:

    client.on('somebodyAteSomething', function(eater_id, eaten_id) { #eat eventif(client.balls[eaten_id].isMyFriend()) { //if this is my friendclient.emit('friendEaten', eater_id, eaten_id); //emit custom event }
    });client.on('friendEaten', function(eater_id, friend_id) { //on friend eatenclient.log('My friend got eaten!');
    });

    检查 examples/basic.js 中的完整示例

    反馈

    如果有什么问题,请发电子邮件给我,或者是创建问题。 在有人告诉我之前我不会知道什么是坏的。

    许可证

    MIT