Steam数据科普

2019-09-30  本文已影响0人  Steam那些事儿

原作者:海盗海官方

原出处:海盗海官网

原文链接:Steam数据科普

这里对steam道具的一些字段做一些简单的介绍,方便开发人员理解对应的业务

交易

steam的帐号之间可以通过他人的报价链接,与其他steam帐号进行交易,只要是自己steam帐号库存内运行交易的道具,都可以通过这种方式交易给别人,详细业务可以参见 官方说明

库存

玩家交易的道具都是在自己steam库存中的,只要玩家开放了其的库存隐私,其他人都可以查看玩家公开的库存信息,比如可以在 这里 看到我公开的库存

库存交易

官方并未开放正式的api接口用于道具交易,通常玩家只能在浏览器上,登录后,在自己的steam社区页面给别人报价,或者登录后,点击别人的报价链接来进行报价交易;

我们封装了一个steam机器人,模拟了官方在浏览器上通过报价链接报价进行交易的流程,实现了后台报价交易;

为了通过后台对玩家进行报价交易,有几个必要的参数信息:

报价链接

每个steam用户都可以在 //steamcommunity.com/id/me/tradeoffers/privacy#trade_offer_access_url这个地址查看自己的报价链接

玩家库存道具数据

如果玩家的steam库存是公开的,则可以通过http://steamcommunity.com/inventory/76561198042231205/730/2?l=schinese&count=5000 这样的地址获取到玩家的库存信息,其中url路径中的76561198042231205是对应玩家的steamid,730是游戏的appid(730对应CSGO),2是游戏库存的contextid,所以通过上面的链接就可以获取到玩家76561198042231205的CSGO库存信息

所以为了通过我们的机器人给玩家报价,需要玩家提供他自己的报价链接,并且公开他的库存,我们好读取玩家的库存信息

库存字段介绍

上面的玩家库存接口返回的json数据,格式大概是这样

{

    "assets": [

        {

            "appid": 730,

            "contextid": "2",

            "assetid": "13680926359",

            "classid": "310777518",

            "instanceid": "302028390",

            "amount": "1"

        }

    ],

        "descriptions": [

        {

            "appid": 730,

            "classid": "310777518",

            "instanceid": "302028390",

            "currency": 0,

            "background_color": "",

            "icon_url": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpos7asPwJf0v73ci9b_8i3mIyCjfLwDLndg25u5cB1g_zMu9qjjVDlrRBqamzzdYOXc1Q-NVHX_QDokOq6jcO5tZ7JzSEwsnFw4nzD30vgZ_ZT_P4",

            "icon_url_large": "-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgpos7asPwJf0v73ci9b_8i3mIyCjfLwDLndg25u5cB1g_zMyoD0mlOx5UVqNj3yctWTewM-MF3S-wO-lefogsfq7ZmcwSdmsyMi4SyOl0TlhhtSLrs4dN-aNjc",

            "descriptions": [

                {

                    "type": "html",

                    "value": "外观: 久经沙场"

                },

                {

                    "type": "html",

                    "value": " "

                },

                {

                    "type": "html",

                    "value": "两把具有大弹匣的 Beretta 同时开火会降低精准度,并增加换弹时间。不过你得往好处想,这不,别人只有—把枪,而你可以同时用两把 Beretta 射个痛快。 这把武器以金属涂料进行了涂装,使用结晶外膜制作图案。\n\n<i>人人都想有所作为</i>"

                },

                {

                    "type": "html",

                    "value": " "

                },

                {

                    "type": "html",

                    "value": "湖畔激战收藏品",

                    "color": "9da1a9"

                },

                {

                    "type": "html",

                    "value": " "

                },

                {

                    "type": "html",

                    "value": " "

                }

            ],

            "tradable": 1,

            "actions": [

                {

                    "link": "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20S%owner_steamid%A%assetid%D343540768138723478",

                    "name": "在游戏中检视…"

                }

            ],

            "name": "双持贝瑞塔 | 钴蓝石英",

            "name_color": "D2D2D2",

            "type": "受限 手枪",

            "market_name": "双持贝瑞塔 | 钴蓝石英 (久经沙场)",

            "market_hash_name": "Dual Berettas | Cobalt Quartz (Field-Tested)",

            "market_actions": [

                {

                    "link": "steam://rungame/730/76561202255233023/+csgo_econ_action_preview%20M%listingid%A%assetid%D343540768138723478",

                    "name": "在游戏中检视…"

                }

            ],

            "commodity": 0,

            "market_tradable_restriction": 7,

            "marketable": 1,

            "tags": [

                {

                    "category": "Type",

                    "internal_name": "CSGO_Type_Pistol",

                    "localized_category_name": "类型",

                    "localized_tag_name": "手枪"

                },

                {

                    "category": "Weapon",

                    "internal_name": "weapon_elite",

                    "localized_category_name": "武器",

                    "localized_tag_name": "双持贝瑞塔"

                },

                {

                    "category": "ItemSet",

                    "internal_name": "set_lake",

                    "localized_category_name": "收藏品",

                    "localized_tag_name": "湖畔激战收藏品"

                },

                {

                    "category": "Quality",

                    "internal_name": "normal",

                    "localized_category_name": "类别",

                    "localized_tag_name": "普通"

                },

                {

                    "category": "Rarity",

                    "internal_name": "Rarity_Mythical_Weapon",

                    "localized_category_name": "品质",

                    "localized_tag_name": "受限",

                    "color": "8847ff"

                },

                {

                    "category": "Exterior",

                    "internal_name": "WearCategory2",

                    "localized_category_name": "外观",

                    "localized_tag_name": "久经沙场"

                }

            ]

        }

        ],

    "total_inventory_count": 1,

    "success": 1,

    "rwgrsn": -2

}

其中的assets部分为道具的id标识数据,一个对象对应一个道具,每个道具的assetid是不同的

descriptions为一类道具通用数据,代表一类道具的公共属性,一个classid代表一类公共属性,所以根据上面的assets中道具的classid,可以在descriptions中找到这个道具的其他属性信息,如道具名称、图片、类型等等。

而对于交易机器人,必须知道要请求的玩家库存道具的appid、contextid、assetid 数据,才能通过玩家的报价链接对其报价,请求交易assetid对应道具。

字段说明

为了方便库存道具在网站显示、交易,以下为一些需要从玩家库存保存下来的信息

appid

道具的游戏id,常用的三个游戏id,730 代表CSGO,570代表Dota2,578080代表PUBG

contextid

道具的游戏库存id,对于CSGO,Dota2,PUBG,这个值都是2

classid

道具分类id,代表一类基础属性相同的道具

instanceid

道具实例id?,意义暂不明

assetid

道具唯一id,而且在道具交易之后会变化,比如在玩家A库存中一个道具assetid是13680926359,当玩家将其交易给B之后,这个道具assetid可能就变成了13680926360

name

道具名称,简称,比如 “双持贝瑞塔 | 钴蓝石英”

market_name

道具市场通称,一般会在简称基础上加上属性修饰词,比如 "双持贝瑞塔 | 钴蓝石英 (久经沙场)"

market_hash_name

道具的市场hash名称,steam官方也有一个交易市场,玩家可以将库存发布到官方市场上,而官方市场对道具进行分类的原则就是这个market_hash_name,所有market_hash_name一样的道具,在市场上都会被划分为同一类道具,按同等道具进行定价;这个的范围比classid的大,所以可能出现两个道具market_hash_name相同,但是他们的classid不同,原因可能有很多种,比如两个道具是不同的赛季限定出的,所以他们的classid就不一样了

icon_url

从steam库存接口获取到的道具的图片url都是cdn图片后缀地址,格式形如"-9a81dlWLwJ2UUGcVs_nsVtzdOEdtWwKGZZLQHTxDZ7I56KU0Zwwo4NUX4oFJZEHLbXH5ApeO4YmlhxYQknCRvCo04DEVlxkKgposem2LFZfwOP3ZTxS6eOlnI-Zg8j-JrXWmm5u5Mx2gv2Ppd7zjATirxFkNWD2JIGde1Q4MlyCrAe8x-u705a6uJ7Aynph6SUq4GGdwUKYnSlmwg”,加上cdn前缀地址和分辨率后缀(非必须)即可得到完整的图片地址: //steamcommunity-a.akamaihd.net/economy/image/ + icon_url + /70fx50f

icon_url_large

与icon_url同理,不过是大尺寸的图片,此属性有可能为空

descriptions

道具的描述信息,html格式文本

除了以上基础属性外,道具还有一个常用的tags属性,其中以数组的方式,列出了道具拥有的一些分类tag,其具体tag的含义可以直接参考对应tag的 localized_category_name、localized_tag_name,其对应的key和值分别为 category和internal_name;

为了方便将此tag在关系数据库中保存,我们将此tag进行了平面话,将其category定义为数据库字段,而其internal_name作为字段值,另外将其附带的color属性,我们扩展为xxx_color字段,如下

type | exterior | rarity | ratity_color | quality | quality_color | weapon | item_set

--- | --- | --- | --- | --- | --- | --- | --- | ---

CSGO_Type_Pistol | WearCategory2 | Rarity_Mythical_Weapon | 8847ff | normal | NULL | weapon_elite | set_lake

Dota2道具的其他tag类型,如 hero、slot,也是同理

CSGO tag分类

对于CSGO,以上tag部分,各tag可能的取值,及其含义可以参考 http://steamcommunity.com/market/appfilters/730?l=schinese 返回的数据

以上接口返回的数据格式大致如下:

{

    "success": true,

    "facets": {

        "730_Exterior": {

            "appid": 730,

            "name": "Exterior",

            "localized_name": "外观",

            "tags": {

                "WearCategory2": {

                    "localized_name": "久经沙场",

                    "matches": "1,970,860"

                },

                "WearCategory1": {

                    "localized_name": "略有磨损",

                    "matches": "622,471"

                },

                "WearCategory3": {

                    "localized_name": "破损不堪",

                    "matches": "289,635"

                },

                "WearCategory4": {

                    "localized_name": "战痕累累",

                    "matches": "274,712"

                },

                "WearCategory0": {

                    "localized_name": "崭新出厂",

                    "matches": "209,107"

                },

                "WearCategoryNA": {

                    "localized_name": "无涂装",

                    "matches": "198"

                }

            }

        },

                "730_ItemSet": {

            "appid": 730,

            "name": "ItemSet",

            "localized_name": "收藏品",

            "tags": {[

                        ]}

              }

      }

}

对应上面的数据,在facets下的每个子对象,对应了一个道具的tag属性的取值范围及其含义;以CSGO的外观tag为例,在上面的json中,可以看到Exterior下的tags包含了6个子key,每个key与上面数据库中的exterior字段的值是对应的,而key下面的localized_name属性就代表了这个key代表的含义,即需要在页面前端显示的名称,其他tag属性rarity、quality、type、weapon等同理,只需要关注数据库定义了的tag字段即可,数据库中未定义的字段如:ProPlayer、SprayCapsule等不需要关注。

以上内容由海盗海科技提供,如需转载请联系我们。

上一篇下一篇

猜你喜欢

热点阅读