Last active
August 2, 2024 23:32
-
-
Save Js41637/137b2b947e64c0e80d6dacd6b42e1754 to your computer and use it in GitHub Desktop.
Processes a list of game names and searches the Steam API and saves them to a CSV. In order to use, create a file called games.txt and inside put the name of each game you want to find on a new line. Then run this script via `node steam_title_searcher.js`. Dun.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
const fs = require('fs') | |
const https = require('https') | |
const searchApi = 'https://steamcommunity.com/actions/SearchApps' | |
const detailsApi = 'https://store.steampowered.com/api/appdetails?filters=categories&appids=' | |
let titlesFile | |
try { | |
titlesFile = fs.readFileSync('./games.txt', 'utf8') | |
} catch (e) { | |
console.error("Couldn't find games.txt file??") | |
process.exit() | |
} | |
const titles = titlesFile.split('\n').filter(Boolean) | |
if (titles.length === 0) { | |
console.error('File is empty??') | |
process.exit() | |
} | |
function processTitles(array, fn) { | |
const results = [] | |
let i = 1 | |
return array.reduce((p, item) => { | |
return p.then(() => { | |
return fn(item).then((data) => { | |
console.log(` -- [${i}/${array.length}]: Fetched ${item}`) | |
i++ | |
results.push(data) | |
return results | |
}) | |
}) | |
}, Promise.resolve()) | |
} | |
const searchForTitle = title => _http(`${searchApi}/${title.trim()}`).then(data => { | |
if (!data[0]) return [title, undefined] | |
const id = data[0].appid | |
return _http(`${detailsApi}${id}`).then(categories => { | |
if (!categories) return [title, data[0]] | |
const categoryIds = (categories[id] && categories[id].data && categories[id].data.categories ? categories[id].data.categories : []).map(c => c.id) | |
if (categoryIds.includes(29)) data[0].cards = true | |
return [title, data[0]] | |
}) | |
}) | |
const _http = url => new Promise(resolve => https.get(url, res => { | |
res.setEncoding("utf8") | |
let rawData = '' | |
res.on('data', (chunk) => { rawData += chunk }) | |
res.on("end", () => resolve(JSON.parse(rawData))) | |
})) | |
console.log('Processing', titles.length, 'titles') | |
processTitles(titles, searchForTitle).then(matches => { | |
const out = ['original_title,name,store_url,has_cards'] | |
console.log('Matches:') | |
matches.forEach(match => { | |
const [ title, data ] = match | |
console.log(data ? ` -- ${title}\n\tFound "${data.name}" (${data.appid}) | Cards: ${!!data.cards}` : ` -- ${title}\n\tFound no matches`) | |
const url = data ? `http://store.steampowered.com/app/${data.appid}` : '' | |
out.push(`"${title.trim()}","${data ? data.name : ''}",${url},${data ? !!data.cards : false}`) | |
}) | |
fs.writeFileSync('./games.csv', out.join('\n')) | |
}) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment