Reputation: 449
I am trying to query data from the steam marketplace in JSON form.
{"success":true,"start":0,"pagesize":10,"total_count":7058,"searchdata":{"query":"strange","search_descriptions":true,"total_count":7058,"pagesize":10,"prefix":"searchResults","class_prefix":"market"},"results":[{"name":"Strange Sandman","hash_name":"Strange Sandman","sell_listings":142,"sell_price":16,"sell_price_text":"$0.16","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336074288","instanceid":"11043061","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUxAeUh_ntgdBidzZAfOeD-VOz9s0vMAM3WRtwwcsNuGwZzJjc1SVUKQJDq1u91zvW3Uw7sQ7ANPm8fUWJ1sZuDp64A","tradable":1,"name":"Strange Sandman","name_color":"CF6A32","type":"Strange Bat - Kills: 13","market_name":"Strange Sandman","market_hash_name":"Strange Sandman"},"sale_price_text":"$0.15"},{"name":"Strange Bonesaw","hash_name":"Strange Bonesaw","sell_listings":166,"sell_price":18,"sell_price_text":"$0.18","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336077034","instanceid":"3500303792","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwUeUx7xuS98hMn0CvfCCeUGmt5jtMcAjmY8xwctZrXtMjIzdlWXAPRfD6Fj8A7pXnYw6ZM7VZmm-by4sbbgvA","tradable":1,"name":"Strange Bonesaw","name_color":"CF6A32","type":"Strange Bonesaw - Kills: 5","market_name":"Strange Bonesaw","market_hash_name":"Strange Bonesaw"},"sale_price_text":"$0.17"},{"name":"Strange Equalizer","hash_name":"Strange Equalizer","sell_listings":192,"sell_price":14,"sell_price_text":"$0.14","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336076973","instanceid":"11041085","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUxcYXhDjoD18m5rZAfOeD-VOwow245UHiGRtlVd4Y-K3Mm4yKwGXB_YNC_dpoAzuWSNn7p4wA9K3oPUWJ1sEtEon8w","tradable":1,"name":"Strange Equalizer","name_color":"CF6A32","type":"Strange Pickaxe - Kills: 2","market_name":"Strange Equalizer","market_hash_name":"Strange Equalizer"},"sale_price_text":"$0.13"},{"name":"Strange Shortstop","hash_name":"Strange Shortstop","sell_listings":137,"sell_price":24,"sell_price_text":"$0.24","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336074068","instanceid":"11044703","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUxQZUgn2qyxMmPfqDOCLDa4CyY1jtsMC2mIyyVgjZOW0ZTQzJACSV6VdWq1qpAy_WnNmuJIyUY_muasILkyCzE-6","tradable":1,"name":"Strange Shortstop","name_color":"CF6A32","type":"Strange Peppergun - Kills: 61","market_name":"Strange Shortstop","market_hash_name":"Strange Shortstop"},"sale_price_text":"$0.23"},{"name":"Strange Bushwacka","hash_name":"Strange Bushwacka","sell_listings":122,"sell_price":43,"sell_price_text":"$0.43","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336074187","instanceid":"11041089","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwQDUhjdszZKjs3ZAfOeD-VOmII0ssVW2jQ4k1h-Nra3aGVmdlbHA6VfDKFj8V_tX3RmsJY7BoXgp_UWJ1t8YRvBDw","tradable":1,"name":"Strange Bushwacka","name_color":"CF6A32","type":"Strange Kukri - Kills: 65","market_name":"Strange Bushwacka","market_hash_name":"Strange Bushwacka"},"sale_price_text":"$0.42"},{"name":"Strange Degreaser","hash_name":"Strange Degreaser","sell_listings":181,"sell_price":47,"sell_price_text":"$0.47","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336078768","instanceid":"3507092741","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwMUWgnnuStGmvfqDOCLDa5SzI9ms8RWgDU4wgUsN7HgMjUzdgGRU_FdDvFs8ly_CHc0vcM7DI_juasILvdwG6rd","tradable":1,"name":"Strange Degreaser","name_color":"CF6A32","type":"Strange Flame Thrower - Kills: 0","market_name":"Strange Degreaser","market_hash_name":"Strange Degreaser"},"sale_price_text":"$0.45"},{"name":"Strange Knife","hash_name":"Strange Knife","sell_listings":186,"sell_price":50,"sell_price_text":"$0.50","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1337324707","instanceid":"3508461538","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEcUwwfVB3nhzRCms_jQ6DeCuFZmtwwsJQHi2A9lVJ_beKzYDEwdgfEWPlaCqI-oVC0CiVqsZItRNmxr5xPBI8","tradable":1,"name":"Strange Knife","name_color":"CF6A32","type":"Strange Knife - Kills: 0","market_name":"Strange Knife","market_hash_name":"Strange Knife"},"sale_price_text":"$0.48"},{"name":"Strange Scarecrow","hash_name":"Strange Scarecrow","sell_listings":9,"sell_price":199,"sell_price_text":"$1.99","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1849008471","instanceid":"510479732","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEYfB4uThjjqj1AmsfxC_OPDd8Mmsgy4N4H2GM_kFh4ZOG3aDIycAeSWPcKD6c78Q3tXSJhupM6B4_j9uIFfAvuqsKYZPpZeK5I","tradable":1,"name":"Strange Scarecrow","name_color":"CF6A32","type":"Strange Hat - Points Scored: 0","market_name":"Strange Scarecrow","market_hash_name":"Strange Scarecrow"},"sale_price_text":"$1.91"},{"name":"Strange Amputator","hash_name":"Strange Amputator","sell_listings":111,"sell_price":37,"sell_price_text":"$0.37","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336074107","instanceid":"11040852","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwYcTQ72uSxMmvfqDOCLDa4CzIwzsMYAj2cykgJ6MLq2YDM2IALDU_MGWPFop1u0WnJrsJIxDIPhuasILuZAMKd1","tradable":1,"name":"Strange Amputator","name_color":"CF6A32","type":"Strange Bonesaw - Kills: 0","market_name":"Strange Amputator","market_hash_name":"Strange Amputator"},"sale_price_text":"$0.36"},{"name":"Strange Vaccinator","hash_name":"Strange Vaccinator","sell_listings":80,"sell_price":84,"sell_price_text":"$0.84","app_icon":"https:\/\/steamcdn-a.akamaihd.net\/steamcommunity\/public\/images\/apps\/440\/e3f595a92552da3d664ad00277fad2107345f743.jpg","app_name":"Team Fortress 2","asset_description":{"appid":440,"classid":"1336074202","instanceid":"4306533","background_color":"3C352E","icon_url":"fWFc82js0fmoRAP-qOIPu5THSWqfSmTELLqcUywGkijVjZULUrsm1j-9xgEIUwoUWRLlrTZ8jM3gCPyfDd8Mmsgy4N4HizAyxFQuMeDmaTEwc1SUWPkNBKI_8lG_C38zvp83AIDloesDcFjuqsKYZD2aO7gJ","tradable":1,"name":"Strange Vaccinator","name_color":"CF6A32","type":"Strange Vaccinator - Ubers: 35","market_name":"Strange Vaccinator","market_hash_name":"Strange Vaccinator"},"sale_price_text":"$0.81"}]}
This is what I got so far for the query: JSON-Data
However this query can only return 100 items per query and if not sorted they are always randomly unordered. I want to get all data by stiching together 100 batches of data at a time. But in order for that to work I need to be able to sort the data.
Basically I am missing a GET argument to pass through with the URL to get the data sorted.
Thanks for any help in advance!
Upvotes: 2
Views: 1686
Reputation: 557
You're looking for two GET variables:
sort_column
can be set to default
, name
, price
, and quantity
(and maybe others, I don't know).
sort_dir
can be set to asc
or desc
.
I'm not sure what field you're trying to sort your search results by but hopefully this helps.
Upvotes: 3
Reputation: 503
Well to get the full data from the API you can use a generator function to make requests until you reach the end:
const axios = require('axios');
async function* items(url, start = 0) {
const res = await axios(url + '&start=' + start);
yield* res.data.results;
if (start < res.data.total_count) {
start += res.data.pagesize;
yield* items(url, start);
}
}
This calls the API with &start=0 the first time, and increments it by pagesize until start is bigger than the total number of results.
For sorting them, here's a way of sorting the results by key (for example by name):
const compareValues = (key, order = 'asc') => function (a, b) {
if (!a.hasOwnProperty(key) || !b.hasOwnProperty(key))
return 0;
const varA = typeof a[key] === 'string' ?
a[key].toUpperCase() : a[key];
const varB = typeof b[key] === 'string' ?
b[key].toUpperCase() : b[key];
let comparison = 0;
if (varA > varB)
comparison = 1;
else if (varA < varB)
comparison = -1;
return (order === 'desc' ? comparison * -1 : comparison);
};
This returns a function that you can pass into Array.sort() as a parameter. Note that you can change 'asc' to 'desc' for ascending or descending respectively.
Now to piece this together, you call the generator function and push the results to an array until all data has come in. Then you .sort(compareValues('property e.g. name')) it to see your sorted results:
(async () => {
const results = [];
for await (const item of items('https://steamcommunity.com/market/search/render/?query=strange&search_descriptions=1&norender=1&appid=440¤cy=3&language=english&format=json'))
results.push(item);
console.log(results.sort(compareValues('name')));
})();
Let me know if it worked :)
Upvotes: 0
Reputation: 147216
This function will sort by sell_price
ascending (for the snippet I cut most of the fields out of the JSON). If you want to sort by sell_price
descending, change a.sell_price - b.sell_price
to b.sell_price - a.sell_price
:
const json = '{"success": true,"start": 0,"pagesize": 10,"total_count": 7046,"searchdata": {"query": "strange","search_descriptions": true,"total_count": 7046,"pagesize": 10,"prefix": "searchResults","class_prefix": "market"},"results": [{"name": "Strange Enforcer","hash_name": "Strange Enforcer","sell_listings": 176,"sell_price": 18,"sell_price_text": "$0.18"},{"name": "Strange Ambassador","hash_name": "Strange Ambassador","sell_listings": 221,"sell_price": 32,"sell_price_text": "$0.32"},{"name": "Strange Equalizer","hash_name": "Strange Equalizer","sell_listings": 191,"sell_price": 15,"sell_price_text": "$0.15"},{"name": "Strange Balloonicorn","hash_name": "Strange Balloonicorn","sell_listings": 35,"sell_price": 250,"sell_price_text": "$2.50"},{"name": "Strange Powerjack","hash_name": "Strange Powerjack","sell_listings": 149,"sell_price": 17,"sell_price_text": "$0.17"},{"name": "Strange Warhood","hash_name": "Strange Warhood","sell_listings": 56,"sell_price": 55,"sell_price_text": "$0.55"},{"name": "Strange Classic","hash_name": "Strange Classic","sell_listings": 119,"sell_price": 65,"sell_price_text": "$0.65"},{"name": "Strange Rainblower","hash_name": "Strange Rainblower","sell_listings": 187,"sell_price": 42,"sell_price_text": "$0.42"},{"name": "Strange Shotgun","hash_name": "Strange Shotgun","sell_listings": 124,"sell_price": 111,"sell_price_text": "$1.11"},{"name": "Strange Phlogistinator","hash_name": "Strange Phlogistinator","sell_listings": 153,"sell_price": 63,"sell_price_text": "$0.63"}]}';
let data = JSON.parse(json);
data.results.sort((a, b) => a.sell_price - b.sell_price);
console.log(data)
Upvotes: 1
Reputation: 31
Follow a example to sort your JSON-Data by price (descending):
var sorted = jsonData.results.sort(function(productA, productB) {
if (productA.sell_price > productB.sell_price) {
return -1;
}
if (productB.sell_price > productA.sell_price) {
return 1;
}
return 0;
});
Upvotes: 1