@ThLoser: För att få ut listor över vilka items din karaktär har i inventory eller bank så måste du använda en addon, den datan finns såvitt jag vet inte tillgänglig via web-API:t (så det behövs ett manuellt steg när du vill uppdatera dina karaktärer). Lyckligtvis finns det redan addons som gör det, t.ex. http://www.wowhead.com/bagscanner. Om du installerar den och följer instruktionerna för att få fram data från den där sidan så kommer du få ut ett stycke text som ser ut ungefär så här:
~1~123~"Namn""Realm""",1:6948::::::::1:102::::::,1:137446::::::::1:102::::::,,,,,,,,,,,,,,!!!
Efter informationen om namn och realm följer kommaseparerade grupper med information om vilka items den har hittat i dina väskor: det första numret i varje grupp är antalet, och det andra numret är ett id som du kan använda för att hämta upp mer information från Blizzards API. 1:137446 innebär t.ex. att det finns 1x [Elementium Bomb Squirrel Generator] i väskan. Splitta upp den här datan och hämta ut de två värdena.
För att hämta namn och likande från Blizzard behöver du registrera ett konto på https://dev.battle.net/, sidan kommer be dig om namn, syfte och lite sådant, men du får en nyckel direkt. När du har fått nyckeln så behöver du bara skicka GET-requests mot den här urlen:
https://us.api.battle.net/wow/item/ITEMID?locale=en_US&apikey=APIKEY
Svaren är JSON som ser ut så här:
{
"id": 6948,
"name": "Hearthstone",
"description": "",
"icon": "inv_misc_rune_01",
...
}
(https://dev.battle.net/io-docs)
Utifrån det går det att pyssla ihop något som kan uppdatera din hemsida. Bifogar ett snabbt exempel på de olika stegen i C# (>= 7.1, .NET Core) nedan eftersom att du verkade vara inne på det tidigare, men observera att du kommer behöva skriva något som integrerats mot din hemsida och att jag har tagit många genvägar för att hålla nere på exemplets storlek. Hoppas att det kan vara till någon nytta ändå.
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using static System.Console;
namespace Demo
{
/// <remarks>
/// Tar data från http://www.wowhead.com/bagscanner på STDIN och hämtar upp
/// namn på items från https://us.api.battle.net.
///
/// Användning:
/// cat data.txt | ./program.exe APIKey=qwertyuiop
/// </remarks>
class Program
{
static async Task Main(string[] args)
{
// Populera settings med argument från kommandoraden:
var settings = new ConfigurationBuilder()
.AddCommandLine(args)
.Build()
.Get<Settings>();
// Hämta upp data från stdin och parsa ut slots med itemid / antal:
var slots = ExtractSlots(DataFromStdin());
// Fråga API:t efter information om alla hittade items:
var tasks = new List<Task>();
var sem = new SemaphoreSlim(settings.Threads);
foreach (var slot in slots)
{
await sem.WaitAsync();
lock (tasks)
{
var task = Task.Run(async () =>
{
try
{
var item = await GetItemAsync(
settings.APIKey,
slot.ItemId
);
WriteLine($"{item.Name}: {slot.Count}");
}
finally
{
sem.Release();
}
});
tasks.Add(task);
tasks.RemoveAll(_ => _.IsCompleted);
}
}
await Task.WhenAll(tasks);
}
private async static Task<Item> GetItemAsync(string apiKey, int itemId)
{
using (var client = new HttpClient())
{
var response = await client.GetAsync(
$"https://us.api.battle.net/wow/item/{itemId}?locale=en_US&apik..."
);
if (response.IsSuccessStatusCode)
{
var content = await response
.Content
.ReadAsStringAsync();
return JsonConvert.DeserializeObject<Item>(
content
);
}
else
{
throw new Exception();
}
}
}
private static string DataFromStdin()
{
using (var reader = new StreamReader(
OpenStandardInput(),
Encoding.UTF8
))
{
return reader.ReadLine();
}
}
/// <remarks>
/// Exempeldata:
/// ~1~123~"Namn""Realm""",1:6948::::::::1:102::::::,1:92738:::::::213003392:1:102::::::,,,,,,,,,,,,,,!!!
/// </remarks>
private static IReadOnlyList<Slot> ExtractSlots(string data)
{
var itemsStartAt = data.IndexOf(',');
return data
// Vi är bara intresserade av vad som finns mellan den första
// punkten och de tre utropstecknena på slutet:
.Substring(
itemsStartAt,
data.Length - itemsStartAt - 3
)
// ... splitta sedan resten på komman:
.Split(',')
// ... och för varje grupp:
.Select(slotStr =>
{
// ... hämta ut de två första värdena och samla resten
// i en catch all:
var parts = slotStr.Split(':', 3);
// Om det inte fanns tre delar så var den en tom slot.
// Ignorera och fortsätt.
if (parts.Length < 3)
{
return null;
}
// Annars är den första siffran antal,
// och den andra siffran itemid.
else
{
return new Slot(
itemId: int.Parse(parts[1]),
count: int.Parse(parts[0])
);
}
})
// Filtrera ut tomma slots:
.Where(slot => slot != null)
.ToList();
}
}
class Slot
{
public int ItemId { get; }
public int Count { get; }
public Slot(int itemId, int count)
{
ItemId = itemId;
Count = count;
}
}
class Item
{
public int ItemId { get; set; }
public string Name { get; set; }
}
class Settings
{
public string APIKey { get; set; }
public int Threads { get; set; } = 8;
}
}
Exempel
PS > cat .\data.txt | .\program.exe APIKey=qwertyuiop
Elementium Bomb Squirrel Generator: 1
Hearthstone: 1
PS >
Användning (PowerShell)