Graph database Analysis of the Steam Network
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

294 lines
8.7 KiB

package net.jrtechs.www.SteamAPI;
import net.jrtechs.www.model.Game;
import net.jrtechs.www.model.Player;
import net.jrtechs.www.utils.ConfigLoader;
import net.jrtechs.www.utils.WebScraper;
import net.jrtechs.www.webCrawler.APIThrottler;
import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.stream.IntStream;
/**
* Class which is used to pull information from the Steam api
*
* Documentation at https://developer.valvesoftware.com/wiki/Steam_Web_API
*
* @author Jeffery Russell 5-26-18
*/
public class APIConnection
{
/** Base url to use for all queries to steam's api **/
private final String baseURL = "https://community.steam-api.com";
/** Path to use when getting info on a player from api **/
private final String playerInfoURL = "/ISteamUser/GetPlayerSummaries/v0002/";
private final String friendListURL = "/ISteamUser/GetFriendList/v0001/";
private final String gamesListURL = "/IPlayerService/GetOwnedGames/v0001/";
/** Path to conf file(from within the conf folder) **/
private final String confPath = "SteamAPIKey.json";
/** API key for steam's api - loaded from json conf file **/
private String apiKey;
/**
* Constructor for APIConnection which loads a config file
* and sets the api key to your Steam api key.
*/
public APIConnection()
{
ConfigLoader conf = new ConfigLoader(confPath);
apiKey = "?key=" + conf.getValue("api");
}
/**
* Makes a call to the steam api using the requested url and does
* some error handling where it will re-request data from the steam
* api if it simply throws an internal error.
*
* @param url address to download data with
* @return string of the data returned
*/
public String querySteamAPI(String url)
{
System.out.println(url);
boolean downloaded = false;
String apiData = "";
while(!downloaded)
{
try
{
apiData = WebScraper.getWebsite(url);
downloaded = true;
}
catch (SteamConnectionException e)
{
switch (e.getError())
{
case RESTRICTED:
{
//This is fine
System.out.println("Private profile: ");
System.out.println(url);
return "";
}
case CONNECTION:
{
//spooky 500 error :(
//I don't know why but, steam throws 1-3 of these per day
System.out.println("Spooky steam API error");
new APIThrottler().wait(30);
break;
}
case RATE_LIMITED:
{
//hasn't happened yet
System.out.println("Oof, we are being throttled");
new APIThrottler().wait(300);
break;
}
case FORBIDDEN:
{
System.out.println("Check your API key.");
System.exit(-1);
}
case BAD_REQUEST:
{
System.out.println("BAD REQUEST:");
System.out.println(url);
System.out.println("Please modify your query.");
return "";
}
}
}
}
return apiData;
}
public List<Game> getGames(String steamID)
{
List<Game> games = new ArrayList<>();
String apiData = this.querySteamAPI(this.baseURL + this.gamesListURL +
this.apiKey + "&steamid=" + steamID +
"&include_appinfo=true&include_played_free_games=true");
if(apiData.isEmpty())
return games;
JSONObject object = new JSONObject(apiData);
System.out.println(object);
if(object.has("response"))
{
JSONArray gamesJ = object.getJSONObject("response").getJSONArray("games");
IntStream.range(0, gamesJ.length()).forEach(i ->
games.add(new Game(gamesJ.getJSONObject(i))));
}
return games;
}
/**
* Returns a list of the UIDs of all the players friends
*
* @param steamid
* @return
*/
public List<String> getFriends(String steamid)
{
List<String> friendsId = new ArrayList<>();
String apiData = this.querySteamAPI(this.baseURL + this.friendListURL +
this.apiKey + "&steamid=" + steamid);
if(apiData.equals(""))
return friendsId; //private url
JSONObject object = new JSONObject(apiData);
System.out.println(object);
if(object.has("friendslist"))
{
object.getJSONObject("friendslist")
.getJSONArray("friends").toList()
.forEach(f->
friendsId.add(((HashMap<String, String>)(f)).get("steamid"))
);
}
else
{
return friendsId;
}
return friendsId;
}
/**
* returns a map from the steam id to the players name
*
* * tricky because we can only request up to 100 ids
* in one request
*
* @param ids
* @return
*/
public List<Player> getPlayers(List<String> ids)
{
System.out.println(ids);
List<Player> players = new ArrayList<>();
while(!ids.isEmpty())
{
StringBuilder queryUrl = new StringBuilder(baseURL + playerInfoURL + apiKey + "&steamids=");
int remove = Math.min(ids.size(), 100);
for(int i = 0; i < remove; i++)
{
queryUrl.append(",").append(ids.remove(0));
}
System.out.println(queryUrl);
JSONArray names;
String apiResult = this.querySteamAPI(queryUrl.toString());
if(apiResult.equals(""))
return players;
JSONObject object = new JSONObject(apiResult);
if(object.has("response"))
{
names = object.getJSONObject("response").getJSONArray("players");
}
else
{
//eh
return players;
}
for(int i = 0; i < names.length(); i++)
{
JSONObject player = names.getJSONObject(i);
if(player.has(Player.KEY_STEAM_ID) && player.has(Player.KEY_USERNAME))
{
players.add(transformToPlayer(player));
}
}
}
return players;
}
private Player transformToPlayer(JSONObject player)
{
String avatar = player.has(Player.KEY_AVATAR) ?
player.getString(Player.KEY_AVATAR) :
"";
String realName = player.has(Player.KEY_REAL_NAME) ?
player.getString(Player.KEY_REAL_NAME) :
"";
String id = player.getString(Player.KEY_STEAM_ID);
Integer timeCreated = player.has(Player.KEY_TIME_CREATED) ?
player.getInt(Player.KEY_TIME_CREATED) :
0;
String username = player.getString(Player.KEY_USERNAME);
return new Player(username, id, realName, timeCreated, avatar);
}
/**
* Returns the name of the player with a specific steam id
*
* @param steamid the steam id of player
* @return
*/
public Player getSingle(String steamid) throws SteamConnectionException
{
JSONObject response = new JSONObject(WebScraper
.getWebsite(this.baseURL + this.playerInfoURL +
this.apiKey + "&steamids=" + steamid));
if(response.has("response"))
{
response = response.getJSONObject("response");
if(response.has("players"))
{
JSONArray arr = response.getJSONArray("players");
if(arr.length() > 0)
{
return transformToPlayer(arr.getJSONObject(0));
}
}
}
return null;
}
public static void main(String[] args) throws SteamConnectionException
{
APIConnection con = new APIConnection();
//steam id of jrtechs
con.getFriends("76561198188400721").forEach(System.out::println);
//System.out.println(con.getSingle("76561198188400721"));
System.out.println(con.getGames("76561198188400721"));
}
}