Skip to content

Commit

Permalink
feat: update version & make version configurable
Browse files Browse the repository at this point in the history
  • Loading branch information
fga401 committed Aug 6, 2022
1 parent cca06db commit 2da5c6e
Show file tree
Hide file tree
Showing 5 changed files with 75 additions and 54 deletions.
13 changes: 13 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,19 @@
# StreamingWidget
fork from https://github.com/boomxch/StreamingWidget

## Update version manually
When the Nintendo Online App updated, add the `version` field in `data/config.xml` correspondingly.
```xml
<?xml version="1.0" encoding="utf-8"?>
<UserData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<user_name>AAAAAAAA</user_name>
<session_token>BBBBBBBB</session_token>
<iksm_session>CCCCCCCC</iksm_session>
<principal_id>DDDDDDDD</principal_id>
<verision>2.2.0</verision>
</UserData>
```

**TODO**
- ~~Fix layout of `Splatoon2StreamingWidget\StreamingWindow.xaml`~~
- ~~Auto update~~
1 change: 1 addition & 0 deletions Splatoon2StreamingWidget/DataManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ public class UserData
public string session_token { get; set; }
public string iksm_session { get; set; }
public string principal_id { get; set; }
public string version { get; set; }
}

static class DataManager
Expand Down
3 changes: 2 additions & 1 deletion Splatoon2StreamingWidget/HttpManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ public static async Task<TJson> GetAutoDeserializedJsonAsync<TJson>(HttpRequestM
{
json = await response.Content.ReadAsStringAsync();
}

await LogManager.WriteLogAsync(String.Format("request: {0}", request));
await LogManager.WriteLogAsync(String.Format("response: {0}", response));
return JsonConvert.DeserializeObject<TJson>(json);
}

Expand Down
24 changes: 12 additions & 12 deletions Splatoon2StreamingWidget/SplatNet2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,14 +115,14 @@ public async Task<bool> TryInitializePlayerData()
var result = await HttpManager.GetDeserializedJsonAsyncWithCookieContainer<SplatNet2DataStructure.Records>(ApiUriPrefix + "records", Cookie);
udemaeData = result.records.player;
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"records\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"records\". {0}", e));
return false;
}
catch (JsonException)
catch (JsonException e)
{
await LogManager.WriteLogAsync("Failed to convert \"records\"");
await LogManager.WriteLogAsync(String.Format("Failed to convert \"records\". {0}", e));
return false;
}

Expand All @@ -142,14 +142,14 @@ public async Task<bool> TryInitializePlayerData()
{
powerData = await HttpManager.GetDeserializedJsonAsyncWithCookieContainer<SplatNet2DataStructure.XPowerRanking>(ApiUriPrefix + "x_power_ranking/" + GetSeason() + "/summary", Cookie);
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"XPowerRanking\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"XPowerRanking\". {0}", e));
return false;
}
catch (JsonException)
catch (JsonException e)
{
await LogManager.WriteLogAsync("Failed to convert \"XPowerRanking\"");
await LogManager.WriteLogAsync(String.Format("Failed to convert \"XPowerRanking\". {0}", e));
return false;
}

Expand All @@ -169,14 +169,14 @@ public async Task<bool> TryInitializePlayerData()
var result2 = await HttpManager.GetDeserializedJsonAsyncWithCookieContainer<SplatNet2DataStructure.Results>(ApiUriPrefix + "results", Cookie);
battleData = result2.results;
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"results\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"results\". {0}", e));
return false;
}
catch (JsonException)
catch (JsonException e)
{
await LogManager.WriteLogAsync("Failed to convert \"results\"");
await LogManager.WriteLogAsync(String.Format("Failed to convert \"results\". {0}", e));
return false;
}

Expand Down
88 changes: 47 additions & 41 deletions Splatoon2StreamingWidget/SplatNet2SessionToken.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ namespace Splatoon2StreamingWidget
{
// https://github.com/frozenpandaman/splatnet2statink/blob/master/iksm.py
// https://salmonia.mydns.jp/
public static class SplatNet2SessionToken
public class SplatNet2SessionToken
{
private static long GetUnixTime() => (long)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
private const string appVersion = "2.1.1";
private const string appVersion = "2.2.0";

/// <summary>
/// Generate login URL
Expand Down Expand Up @@ -68,11 +68,15 @@ public static async Task<string> GetSessionToken(string sessionTokenCode, string
const string url = "https://accounts.nintendo.com/connect/1.0.0/api/session_token";
using var request = new HttpRequestMessage(HttpMethod.Post, url);

string version = DataManager.LoadConfig().version;
if (version == null || version == "") version = appVersion;

request.Headers.Add("Accept-Language", "en-US");
request.Headers.Add("Accept", "application/json");
request.Headers.Add("Connection", "Keep-Alive");
request.Headers.Add("Connection-Type", "application/x-www-form-urlencoded");
request.Headers.Add("Accept-Encoding", "gzip");
request.Headers.Add("User-Agent", "OnlineLounge/" + appVersion + " NASDKAPI Android");
request.Headers.Add("User-Agent", "OnlineLounge/" + version + " NASDKAPI Android");
request.Headers.Add("Host", "accounts.nintendo.com");

var body = new Dictionary<string, string>
Expand All @@ -88,23 +92,21 @@ public static async Task<string> GetSessionToken(string sessionTokenCode, string
return "";
}

var json = JsonConvert.SerializeObject(body);

request.Content = new StringContent(json, Encoding.UTF8, "application/json");
request.Content = new FormUrlEncodedContent(body);

try
{
var res = await HttpManager.GetAutoDeserializedJsonAsync<SplatNet2DataStructure.SessionToken>(request);
return res.session_token;
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"session token\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"session token\". {0}", e));
return "";
}
catch (InvalidDataException)
catch (InvalidDataException e)
{
await LogManager.WriteLogAsync("Failed to decompress \"session token\"");
await LogManager.WriteLogAsync(String.Format("Failed to decompress \"session token\". {0}", e));
return "";
}
}
Expand All @@ -118,6 +120,9 @@ public static async Task<string> GetCookie(string sessionToken)
var timeStamp = GetUnixTime();
var guid = Guid.NewGuid().ToString();

string version = DataManager.LoadConfig().version;
if (version == null || version == "") version = appVersion;

// access token 取得
const string url = "https://accounts.nintendo.com/connect/1.0.0/api/token";

Expand All @@ -127,7 +132,7 @@ public static async Task<string> GetCookie(string sessionToken)
request.Headers.Add("Accept", "application/json");
request.Headers.Add("Connection", "Keep-Alive");
request.Headers.Add("Accept-Encoding", "gzip");
request.Headers.Add("User-Agent", "OnlineLounge/" + appVersion + " NASDKAPI Android");
request.Headers.Add("User-Agent", "OnlineLounge/" + version + " NASDKAPI Android");
request.Headers.Add("Host", "accounts.nintendo.com");

var body = new Dictionary<string, string>
Expand All @@ -153,14 +158,14 @@ public static async Task<string> GetCookie(string sessionToken)
var res = await HttpManager.GetAutoDeserializedJsonAsync<SplatNet2DataStructure.AccessToken>(request);
accessToken = res.access_token;
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"access token\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"access token\". {0}", e));
return "";
}
catch (InvalidDataException)
catch (InvalidDataException e)
{
await LogManager.WriteLogAsync("Failed to decompress \"access token\"");
await LogManager.WriteLogAsync(String.Format("Failed to decompress \"access token\". {0}", e));
return "";
}
finally
Expand All @@ -177,7 +182,7 @@ public static async Task<string> GetCookie(string sessionToken)
request.Headers.Add("Authorization", "Bearer " + accessToken);
request.Headers.Add("Connection", "Keep-Alive");
request.Headers.Add("Accept-Encoding", "gzip");
request.Headers.Add("User-Agent", "OnlineLounge/" + appVersion + " NASDKAPI Android");
request.Headers.Add("User-Agent", "OnlineLounge/" + version + " NASDKAPI Android");
request.Headers.Add("Host", "api.accounts.nintendo.com");

if (IsBodyEmpty(accessToken))
Expand All @@ -191,14 +196,14 @@ public static async Task<string> GetCookie(string sessionToken)
{
userInfo = await HttpManager.GetAutoDeserializedJsonAsync<SplatNet2DataStructure.UserInfo>(request);
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"user data\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"user data\". {0}", e));
return "";
}
catch (InvalidDataException)
catch (InvalidDataException e)
{
await LogManager.WriteLogAsync("Failed to decompress \"user data\"");
await LogManager.WriteLogAsync(String.Format("Failed to decompress \"user data\". {0}", e));
return "";
}
finally
Expand All @@ -217,9 +222,9 @@ public static async Task<string> GetCookie(string sessionToken)
request.Headers.Add("Accept-Encoding", "gzip");
request.Headers.Add("Authorization", "Bearer");
request.Headers.Add("X-Platform", "Android");
request.Headers.Add("User-Agent", "OnlineLounge/" + appVersion + " NASDKAPI Android");
request.Headers.Add("User-Agent", "OnlineLounge/" + version + " NASDKAPI Android");
request.Headers.Add("Host", "api-lp1.znc.srv.nintendo.net");
request.Headers.Add("X-ProductVersion", "2.1.1");
request.Headers.Add("X-ProductVersion", version);

var flapgNSO = await CallFlapgAPI(accessToken, guid, timeStamp, "nso");

Expand Down Expand Up @@ -256,14 +261,14 @@ public static async Task<string> GetCookie(string sessionToken)
var res = await HttpManager.GetAutoDeserializedJsonAsync<SplatNet2DataStructure.SplatoonToken>(request);
idToken = res.result.webApiServerCredential.accessToken;
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"id token\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"id token\". {0}", e));
return "";
}
catch (InvalidDataException)
catch (InvalidDataException e)
{
await LogManager.WriteLogAsync("Failed to decompress \"id token\"");
await LogManager.WriteLogAsync(String.Format("Failed to decompress \"id token\". {0}", e));
return "";
}
finally
Expand All @@ -283,7 +288,7 @@ public static async Task<string> GetCookie(string sessionToken)
request.Headers.Add("Accept-Encoding", "gzip");
request.Headers.Add("Authorization", "Bearer " + idToken);
request.Headers.Add("X-Platform", "Android");
request.Headers.Add("User-Agent", "OnlineLounge/" + appVersion + " NASDKAPI Android");
request.Headers.Add("User-Agent", "OnlineLounge/" + version + " NASDKAPI Android");
request.Headers.Add("Host", "api-lp1.znc.srv.nintendo.net");
request.Headers.Add("X-ProductVersion", "2.1.1");

Expand Down Expand Up @@ -324,14 +329,14 @@ public static async Task<string> GetCookie(string sessionToken)
var res = await HttpManager.GetAutoDeserializedJsonAsync<SplatNet2DataStructure.WebServiceToken>(request);
splatoonAccessToken = res.result.accessToken;
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"splatoon access token\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"splatoon access token\". {0}", e));
return "";
}
catch (InvalidDataException)
catch (InvalidDataException e)
{
await LogManager.WriteLogAsync("Failed to decompress \"session token\"");
await LogManager.WriteLogAsync(String.Format("Failed to decompress \"session token\". {0}", e));
return "";
}
finally
Expand All @@ -352,7 +357,7 @@ public static async Task<string> GetCookie(string sessionToken)
request.Headers.Add("X-IsAnalyticsOptedIn", "false");
request.Headers.Add("Connection", "keep-alive");
request.Headers.Add("DNT", "0");
request.Headers.Add("User-Agent", "OnlineLounge/" + appVersion + " NASDKAPI Android");
request.Headers.Add("User-Agent", "OnlineLounge/" + version + " NASDKAPI Android");
request.Headers.Add("Host", "app.splatoon2.nintendo.net");

if (IsBodyEmpty(splatoonAccessToken))
Expand All @@ -367,14 +372,14 @@ public static async Task<string> GetCookie(string sessionToken)
var responseCookies = cookies.GetCookies(new Uri("https://app.splatoon2.nintendo.net/")).Cast<Cookie>();
return responseCookies.First().Value;
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"iksm session\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"iksm session\". {0}", e));
return "";
}
catch (IndexOutOfRangeException)
catch (IndexOutOfRangeException e)
{
await LogManager.WriteLogAsync("Failed to get \"cookie\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"cookie\". {0}", e));
return "";
}
finally
Expand Down Expand Up @@ -407,9 +412,9 @@ public static async Task<string> GetCookie(string sessionToken)
var res = await HttpManager.GetAutoDeserializedJsonAsync<SplatNet2DataStructure.FlapgResult>(request);
return res.result;
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"f\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"f\". {0}", e));
return new SplatNet2DataStructure.FlapgResult.FlapgInnerResult();
}
}
Expand All @@ -434,16 +439,17 @@ public static async Task<string> GetHashFromS2SAPI(string idToken, long timeStam
return "";
}

request.Content = new StringContent(await new FormUrlEncodedContent(body).ReadAsStringAsync(), Encoding.UTF8, "application/x-www-form-urlencoded");
// request.Content = new StringContent(await new FormUrlEncodedContent(body).ReadAsStringAsync(), Encoding.UTF8, "application/x-www-form-urlencoded");
request.Content = new FormUrlEncodedContent(body);

try
{
var res = await HttpManager.GetAutoDeserializedJsonAsync<SplatNet2DataStructure.S2SResult>(request);
return res.hash;
}
catch (HttpRequestException)
catch (HttpRequestException e)
{
await LogManager.WriteLogAsync("Failed to get \"hash\"");
await LogManager.WriteLogAsync(String.Format("Failed to get \"hash\". {0}", e));
return "";
}
}
Expand Down

0 comments on commit 2da5c6e

Please sign in to comment.