@zhouzhouli
2017-08-31T02:34:13.000000Z
字数 2525
阅读 708
该文档为成都海盗海科技有限公司所有,任何人未经允许不得转发,公司官网:http://www.steamrobot.me/
Steam机器人与对接系统之间通过redis进行报价请求的交互.
机器人使用的报价数据格式如下
{
'status': 0,
'trade_no': null,
'steamer': {
'steamid': '765611xxxxxxxxx',
'tradeurl': 'https: //steamcommunity.com/tradeoffer/new/?partner=xxxxx&token=xxxxxx'
},
'uid': '123456789',
'message': 'GRKHM0HK',
'myItems': [{
'name': '九头蛇大行动”武器箱钥匙',
'classid': '2303508264',
'appid': '730',
'contextid': '2',
'assetid': '11684150890'
}],
'theirItems': [{
'name': '格洛克 18 型 | 地下水',
'classid': '310779514',
'appid': '730',
'contextid': '2',
'assetid': '11368533135'
}],
'steamid': '765611xxxxxxxxx',
'offer_state': null
}
各字段的具体含义如下表
字段 | 说明 |
---|---|
status | 报价单状态; 0:初始化,1:报价交易成功;2:报价交易失败, 需要发送的报价单初始化为0,机器人处理完成后,如果报价交易成功则会写入1,报价失败则会写入2;所以对接系统只需要一直检查该字段是否为1或者2即可 |
trade_no | steam生成的报价单编号,初始化为null即可。机器人向steam提交报价单成功后,会将steam返回的此次报价单号写回此字段 |
steamer | 报价目标, steamid为报价目标的steamid, tradeurl为报价目标的报价链接,机器人将通过此报价链接向目标发送报价 |
uid | 报价单唯一编号,对接系统对此处报价的唯一编号 |
message | 报价单的附言,此字段内容会填入该次报价附带的消息框中 |
myItems | 此次报价的要发送的道具;代表此次报价我方要发送的道具;比如需要将机器人的某个库存道具发送给目标,则需要将该道具的appid、contextid、assetid填入这里,name、classid为可选字段;没有要发送的道具则填空数组: [] |
theirItems | 此次报价要请求的目标玩家的道具;比如这次报价是玩家要存入他的某些道具,则需要将他的道具的appid、contextid、assetid填入这里,name、classid同理为可选字段;没有要请求的道具,则填空数组:[] |
steamid | 指定此次报价用的机器人steamid,即此次报价会通过这里指定的机器人发送 |
offer_state | steam报价单状态,备用可选字段,可不填 |
trade_no 为steam的交易编号,通过 https://steamcommunity.com/tradeoffer/ + 交易编号 即可得到此次报价的报价页面;比如报价编号为 2308582253, 则用户可以通过这个链接 https://steamcommunity.com/tradeoffer/2308582253 打开改报价页面
一般可以通过 http://steamcommunity.com/inventory/{steamid}/{appid}/{contextid}?l=schinese&count=5000
即可查看某人开放的库存信息;其中steamid为要查看的玩家steamid,appid为游戏id,contextid为库存id;
CSGO的appid为730,contextid为2
Dota2的appid为570,contextid为2
其他游戏的都能在网络上查到
对接系统,将上面的报价结构以格式化为字符串后,以uid的值为key,格式的json字符串为值的键值对写入redis,
set "123456789" "{\"status\":0,\"trade_no\":null,\"steamer\":{\"steamid\":\"765611xxxxxxxxx\",\"tradeurl\":\"https://steamcommunity.com/tradeoffer/new/?partner=xxxxx&token=xxxxx\"},\"uid\":tid,\"message\":\"GRKHM0HK\",\"myItems\":[{\"name\":\"九头蛇大行动”武器箱钥匙\",\"classid\":\"2303508264\",\"appid\":\"730\",\"contextid\":\"2\",\"assetid\":\"11684150890\"}],\"theirItems\":[{\"name\":\"格洛克18型|地下水\",\"classid\":\"310779514\",\"appid\":\"730\",\"contextid\":\"2\",\"assetid\":\"11368533135\"}],\"steamid\":\"765611xxxxxxxxx\",\"offer_state\":null}"
然后将该key写入固定的redis列表 trade_list
lpush trade_list "123456789"
机器人会从 trade_list列表中读取所有待处理的报价单key,然后根据key去读取报价请求的json数据包;然后完成报价交易;
根据交易结果机器人会去更新上面提到的status字段;
为了避免数据冗余,建议对接系统在读取到交易结果后,比如读到status为2或者1之后,就将该报价单的键值对删除,并从trade_list移除
目前机器人报价固定超时为10分钟,即对所有报价发送出去后,超过10分钟玩家都没确认该报价,则会取消该报价,并更新报价结果status为失败