Jump to content
McKay Development

Dr. McKay

Administrator
  • Posts

    3392
  • Joined

  • Last visited

Reputation Activity

  1. Like
    Dr. McKay got a reaction from Robert Lutece in Identifying Steam Items   
    Sometimes it can be a little confusing to identify a specific item in the Steam economy. There are several different types of IDs present in one particular item, and a lot of vague terminology. This guide aims to clear all that up for you.

    For starters, the "official" term for a Steam item is an asset. When I say a "Steam item", I mean a particular copy of an item. I'm not referring to the item's definition, name, image, or anything. I'm referring to a specific, unique copy of the item.

    In a general sense, every item on Steam must be owned by an app. An "app" is a game, software, or whatever on Steam. Every app has its own unique AppID. You can find a particular game's AppID by going to its store page or community hub and looking at the URL. For example, TF2's AppID is 440 so TF2's store page can be found at http://store.steampowered.com/app/440. CS:GO's is 730, Dota 2's is 570, and so on. Note that Steam Community items, Steam gifts, and other "Steam" items are owned by the "Steam" app, which has AppID 753. To identify an item, you'll need the AppID of the game which owns it.

    Of course, the AppID alone isn't enough. You also need two other IDs. Have you ever noticed how some games have multiple inventories, which appear in a drop-down list? An example is the Steam inventory, which has sub-inventories for "Community", "Gifts", "Coupons", etc. These "sub-inventories" are called contexts, and each context has its own context ID. If a game doesn't have a drop-down menu to select a context, that doesn't mean that it's without contexts. That only means that it has one single visible context. That single context still has an ID. For all current Valve games, the context ID for the publicly-visible context is 2.

    Context IDs can be a bit tricky. It's entirely up to the game's developer to determine how they work. For example, Valve games take the "single shared inventory" model in which there's one context ID which is shared by everyone. Under this model, an item belongs to one particular context and never leaves that context. Consequently, the item's context ID never changes. It is, however, possible for game developers to create contexts in any way they choose. For example, Spiral Knights uses the "per-character inventory" model in which everyone who plays the game has their own context IDs for their characters. Creating a new character creates a new context ID. This means that when an item is traded between users, its context ID will change as it moved out of a particular character's inventory.

    Those are the two different types of "containers" in the Steam economy. Apps own contexts, and contexts own assets. Every asset on Steam has, in addition to its AppID and context ID, an asset ID which is guaranteed to be unique inside of a given AppID+ContextID combination. Notice that this means that asset IDs are not unique across all of Steam. They aren't even unique across a particular app. They are only unique inside of a given context. For example, there could be two items with asset ID 1 in the same game, as long as they have different context IDs. An item's asset ID may be referred to as "assetid" or just plain "id".

    Context IDs and asset IDs are assigned by the game developer and can follow any pattern. They can change when traded or not. They may both be up to 64 bits in size. Consequently, Steam returns them (like all other 64-bit values) in JSON as strings.

    Still following? All of what we've learned so far leads us to this conclusion: in order to uniquely identify an item, you need its AppID, its context ID, and its asset ID. Once you have these three things, only then can you uniquely identify it. In fact, this is how you link to a particular item in a user's inventory: steamcommunity.com/profiles/steamid/inventory#appid_contextid_assetid. Here's an example: https://steamcommunity.com/id/DoctorMcKay/inventory#440_2_134161610

    What are these "classid" and "instanceid" values though?
    The observant reader may have noticed that there are two more IDs attached to a particular item which I haven't mentioned. These are the "classid" and "instanceid". These IDs are used to map an asset to its description.

    What's a description? A description is what you need in order to actually display an item. An item's description contains its name, image, color, market_name, whether it's tradable or not, whether it's marketable or not, and more. There are many endpoints on Steam which return JSON objects representing assets that only contain the asset's AppID, context ID, asset ID, classid, instanceid, and amount. An item's amount is how big of a stack it is. Unstackable items always have an amount of 1. Stackable items (such as Steam gems) may have a larger amount. Stacked items always have the same asset ID.

    What's the difference between a classid and an instanceid? In a nutshell, a classid "owns" an instanceid. The classid is all you need to get a general overview of an item. For example, items with the same classid will pretty much always have the same name and image. The instanceid allows you to get finer details such as how many kills are on a strange/StatTrak weapon, or custom names/descriptions.

    You can turn a classid/instanceid pair into a description using the GetAssetClassInfo WebAPI method. Notice that the instanceid is actually optional: if you only have a classid that's fine, you just won't get finer details for the item.

    Name? Market Name? Market Hash Name?
    Every asset on Steam has a name. Without a name, there's nothing to show in your inventory. The item's name is the name property of its description. The item's name may be localized if the game's developer has set it up to be.

    Every marketable item also has a "market name". This name may be the same as—or different from—the item's regular name. The item's market name is the market_name property of its description. This is the name that's displayed in the Steam Community Market when the item is up for sale. Why the distinction? There are some items which have value-affecting data that isn't in their name; for example, CS:GO skins have 5 different tiers of "wear", which isn't in their names. The wear tier is appended to each skin's market name however, so that the different tiers of wear are separated in the market. The market name may be localized or not, and may not exist at all if the item isn't marketable. It's up to the game's developer.

    Finally, every marketable item also has a "market hash name", available under the market_hash_name property. This name is supposed to be the English version of the item's market name, but in practice it may vary. For example, Steam Community items prepend the AppID of the originating app to each item's market hash name, but not to the market name. The market hash name is never localized, and may not exist if the item isn't marketable. Again, it's up to the game's developer. You can view the Community Market listings for any marketable item using this URL formula: steamcommunity.com/market/listings/appid/market_hash_name. Here's an example: https://steamcommunity.com/market/listings/440/Mann%20Co.%20Supply%20Crate%20Key

    Note that the Community Market has no concept of contexts. Consequently, market [hash] names are unique for a particular "class" of items per-app (and by extension per-context). This means that for marketable items, two items with identical market hash names will be worth roughly the same (with some exceptions, like unusual TF2 items).

    Questions?
    Ask below. I'm happy to help!
  2. Like
    Dr. McKay got a reaction from Nickers in Identifying Steam Items   
    Sometimes it can be a little confusing to identify a specific item in the Steam economy. There are several different types of IDs present in one particular item, and a lot of vague terminology. This guide aims to clear all that up for you.

    For starters, the "official" term for a Steam item is an asset. When I say a "Steam item", I mean a particular copy of an item. I'm not referring to the item's definition, name, image, or anything. I'm referring to a specific, unique copy of the item.

    In a general sense, every item on Steam must be owned by an app. An "app" is a game, software, or whatever on Steam. Every app has its own unique AppID. You can find a particular game's AppID by going to its store page or community hub and looking at the URL. For example, TF2's AppID is 440 so TF2's store page can be found at http://store.steampowered.com/app/440. CS:GO's is 730, Dota 2's is 570, and so on. Note that Steam Community items, Steam gifts, and other "Steam" items are owned by the "Steam" app, which has AppID 753. To identify an item, you'll need the AppID of the game which owns it.

    Of course, the AppID alone isn't enough. You also need two other IDs. Have you ever noticed how some games have multiple inventories, which appear in a drop-down list? An example is the Steam inventory, which has sub-inventories for "Community", "Gifts", "Coupons", etc. These "sub-inventories" are called contexts, and each context has its own context ID. If a game doesn't have a drop-down menu to select a context, that doesn't mean that it's without contexts. That only means that it has one single visible context. That single context still has an ID. For all current Valve games, the context ID for the publicly-visible context is 2.

    Context IDs can be a bit tricky. It's entirely up to the game's developer to determine how they work. For example, Valve games take the "single shared inventory" model in which there's one context ID which is shared by everyone. Under this model, an item belongs to one particular context and never leaves that context. Consequently, the item's context ID never changes. It is, however, possible for game developers to create contexts in any way they choose. For example, Spiral Knights uses the "per-character inventory" model in which everyone who plays the game has their own context IDs for their characters. Creating a new character creates a new context ID. This means that when an item is traded between users, its context ID will change as it moved out of a particular character's inventory.

    Those are the two different types of "containers" in the Steam economy. Apps own contexts, and contexts own assets. Every asset on Steam has, in addition to its AppID and context ID, an asset ID which is guaranteed to be unique inside of a given AppID+ContextID combination. Notice that this means that asset IDs are not unique across all of Steam. They aren't even unique across a particular app. They are only unique inside of a given context. For example, there could be two items with asset ID 1 in the same game, as long as they have different context IDs. An item's asset ID may be referred to as "assetid" or just plain "id".

    Context IDs and asset IDs are assigned by the game developer and can follow any pattern. They can change when traded or not. They may both be up to 64 bits in size. Consequently, Steam returns them (like all other 64-bit values) in JSON as strings.

    Still following? All of what we've learned so far leads us to this conclusion: in order to uniquely identify an item, you need its AppID, its context ID, and its asset ID. Once you have these three things, only then can you uniquely identify it. In fact, this is how you link to a particular item in a user's inventory: steamcommunity.com/profiles/steamid/inventory#appid_contextid_assetid. Here's an example: https://steamcommunity.com/id/DoctorMcKay/inventory#440_2_134161610

    What are these "classid" and "instanceid" values though?
    The observant reader may have noticed that there are two more IDs attached to a particular item which I haven't mentioned. These are the "classid" and "instanceid". These IDs are used to map an asset to its description.

    What's a description? A description is what you need in order to actually display an item. An item's description contains its name, image, color, market_name, whether it's tradable or not, whether it's marketable or not, and more. There are many endpoints on Steam which return JSON objects representing assets that only contain the asset's AppID, context ID, asset ID, classid, instanceid, and amount. An item's amount is how big of a stack it is. Unstackable items always have an amount of 1. Stackable items (such as Steam gems) may have a larger amount. Stacked items always have the same asset ID.

    What's the difference between a classid and an instanceid? In a nutshell, a classid "owns" an instanceid. The classid is all you need to get a general overview of an item. For example, items with the same classid will pretty much always have the same name and image. The instanceid allows you to get finer details such as how many kills are on a strange/StatTrak weapon, or custom names/descriptions.

    You can turn a classid/instanceid pair into a description using the GetAssetClassInfo WebAPI method. Notice that the instanceid is actually optional: if you only have a classid that's fine, you just won't get finer details for the item.

    Name? Market Name? Market Hash Name?
    Every asset on Steam has a name. Without a name, there's nothing to show in your inventory. The item's name is the name property of its description. The item's name may be localized if the game's developer has set it up to be.

    Every marketable item also has a "market name". This name may be the same as—or different from—the item's regular name. The item's market name is the market_name property of its description. This is the name that's displayed in the Steam Community Market when the item is up for sale. Why the distinction? There are some items which have value-affecting data that isn't in their name; for example, CS:GO skins have 5 different tiers of "wear", which isn't in their names. The wear tier is appended to each skin's market name however, so that the different tiers of wear are separated in the market. The market name may be localized or not, and may not exist at all if the item isn't marketable. It's up to the game's developer.

    Finally, every marketable item also has a "market hash name", available under the market_hash_name property. This name is supposed to be the English version of the item's market name, but in practice it may vary. For example, Steam Community items prepend the AppID of the originating app to each item's market hash name, but not to the market name. The market hash name is never localized, and may not exist if the item isn't marketable. Again, it's up to the game's developer. You can view the Community Market listings for any marketable item using this URL formula: steamcommunity.com/market/listings/appid/market_hash_name. Here's an example: https://steamcommunity.com/market/listings/440/Mann%20Co.%20Supply%20Crate%20Key

    Note that the Community Market has no concept of contexts. Consequently, market [hash] names are unique for a particular "class" of items per-app (and by extension per-context). This means that for marketable items, two items with identical market hash names will be worth roughly the same (with some exceptions, like unusual TF2 items).

    Questions?
    Ask below. I'm happy to help!
  3. Like
    Dr. McKay got a reaction from Magalon in confirmationChecker limiting?   
    The documentation suggests that you don't go lower than 10 seconds.
  4. Like
    Dr. McKay got a reaction from I'm L! in How to createOffer properly?   
    var offer = manager.createOffer("[U:1:46143802]"); offer.addMyItem({"appid": 440, "contextid": 2, "assetid": "1234567890"}); offer.send("Hi there", "KYworVTM", function(err, status) {     if (err) {         console.log(err);     } else {         console.log("Offer #" + offer.id + " " + status);     } }); 
    Something like that, where [u:1:46143802] is my SteamID and KYworVTM is my trade token.
  5. Like
    Dr. McKay got a reaction from UKF in Receive friend requests/Adding friends   
    client.on('friendRelationship', function(steamID, relationship) {     if (relationship == SteamUser.Steam.EFriendRelationship.RequestRecipient) {         client.addFriend(steamID);     } }); 
    You can use getPersonas to get names and other profile data.
  6. Like
    Dr. McKay got a reaction from timgfx in Accepting trades with mobile authenticator   
    I've made a new pinned post detailing this: https://dev.doctormckay.com/topic/289-trading-and-escrow-mobile-trade-confirmations/
  7. Like
    Dr. McKay got a reaction from trzyrazyzero in Is steam api calls count as ratelimit?   
    Officially there's a 100,000 request-per-day limit, but besides that there's no IP/key rate-limit or throttling.
  8. Like
    Dr. McKay got a reaction from MakeCodeNotWar in How to createOffer properly?   
    Check out the storehouse examples on GitHub.
  9. Like
    Dr. McKay got a reaction from Lucas in Help with configuration   
  10. Like
    Dr. McKay got a reaction from Mole in Combine steam-user with steamcommunity   
    Round peg, round hole.
  11. Like
    Dr. McKay got a reaction from Mole in An issue about NodeJS *likely*   
    That's normal. As of version 3 (if I remember correctly), npm flattens dependencies by putting them all in the first-level node_modules where possible. This both helps to avoid duplicate installations, and prevents issues where paths get too long.
  12. Like
    Dr. McKay got a reaction from Mole in Offer accepting bug   
    Welcome to Steam.
     
    You should use the receivedOfferChanged event to determine whether an offer was accepted.
  13. Like
    Dr. McKay got a reaction from Lucas in Little questions about all modules   
    "Modules" are self-contained bits of code. Each module (generally) performs a specific task. In essence, "modules" are Node's version of "libraries". They're pretty much the cornerstone of Node so yes, they're rather important.
     
    You can't make a bot without using at least the built-in modules (like net which provides network communication). You could definitely make a bot using only the built in modules, but only if you're insane. You'd have a lot of work ahead of you if you decided to make a bot without using any third-party modules.
     
    For example, the steam-user module exposes an interface with which you can log into and interact with Steam. You could do that yourself, but then you'd need to implement the crypto, protobuf, protocol, and more yourself. Not a small task by any measure.
  14. Like
    Dr. McKay got a reaction from Infrox in Setting persona state   
    All you can do is go online using chatLogon. You can't go "in-game".
  15. Like
    Dr. McKay got a reaction from Nogtail in Detect when Steam kills my sessions   
    No, the event won't fire if there isn't any HTTP traffic going on. But if you pass the SteamCommunity instance to the constructor of TradeOfferManager, then the manager will use that community for its HTTP requests and so no-session requests triggered by the manager will fire the event.
  16. Like
    Dr. McKay got a reaction from seler in Error: Access Denied with a full steam account.   
    Yes.
  17. Like
    Dr. McKay got a reaction from trzyrazyzero in data method   
    Yes. Offer data is stored in poll data, so as long as you're saving and restoring poll data, then the offer's data should be available forever.
  18. Like
    Dr. McKay got a reaction from Nogtail in Use Tradeoffer Manager with Node Cluster   
    Yeah making your bots separate from your site is probably your best bet.
  19. Like
    Dr. McKay got a reaction from spock in [Question] New steam accounts and trade holds   
    Any new Steam account will be unable to trade entirely for 15 days, since you need SG enabled for 15 days in order to trade.
     
    A sentry file is how Steam remembers a "device" for Steam Guard. You'll get sent one when you login without one, and you should save it and use it for subsequent logins. node-steam-user does this for you.
     
    You can't bypass the 15-day waiting period for Steam Guard. Trade holds (which last for 15 days) can be disabled by enabling the mobile authenticator. Once the mobile authenticator is enabled, after you wait 7 days, trade holds go away. You can wait out the 7 days at the same time as the 15 days.
     
    So the quickest way to get a new Steam account tradable is to verify its email and immediately enable the mobile authenticator. Once done, it will be able to trade in 15 days.
  20. Like
    Dr. McKay got a reaction from PEPZ in How can i sent trade offer from php?   
    The way I generally do it is set up a bot in node.js using steam-tradeoffer-manager, and create a Web server in that bot which accepts commands to send trade offers. Then use curl in php to command the bot to send an offer.
     
    I believe there are php libraries for interacting with Steam, but I don't personally think php is well suited for that task.
  21. Like
    Dr. McKay got a reaction from Mole in TradeOfferManager v2   
    Here's an idea. Three options for createOffer():
    manager.createOffer(steamID); // create an offer without a token. you can set it later manager.createOffer(steamID, token); // create an offer with a token manager.createOffer(tradeURL); // automatically extract the SteamID and token from the trade URL
  22. Like
    Dr. McKay got a reaction from PEPZ in TradeOfferManager v2   
    Here's an idea. Three options for createOffer():
    manager.createOffer(steamID); // create an offer without a token. you can set it later manager.createOffer(steamID, token); // create an offer with a token manager.createOffer(tradeURL); // automatically extract the SteamID and token from the trade URL
×
×
  • Create New...