using Microsoft.AspNetCore.WebUtilities; using Microsoft.Extensions.Logging; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Net.Http.Json; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; internal class CapitalbusMile { const string urlFormat = "http://ecar.capitalbusgroup.com.tw:8081/GetLastKM/{0}/{1}"; const string key = "35505603"; public static async Task GetMile(string carNumber, ILogger? logger = null) { try { HttpClient client = new HttpClient(); string token = GetToken(); string url = string.Format(urlFormat, carNumber, token); var result = await client.GetAsync(url); if (result.IsSuccessStatusCode) { Stream contentStream = await result.Content.ReadAsStreamAsync(); var body = await new StreamReader(contentStream).ReadToEndAsync(); //result.Headers.Add("Content-Type"); //var body = await result.Content.ReadAsStringAsync(); JObject jo = JObject.Parse(body); string resultString = jo.Value("Result");// jo["State"].Value(); if (resultString == "Success" && jo.ContainsKey("DR_MILE")) { decimal mileage = jo.Value("DR_MILE"); return mileage; } return 1; } } catch(Exception e) { } return -1; } private static string GetToken() { return GetToken(DateTime.UtcNow, key); } private static string GetToken(DateTime DateTimeNow, string key) { DateTime baseTime = DateTime.Parse("1970/01/01 00:00:00Z").ToUniversalTime(); TimeSpan time = DateTimeNow - baseTime; return GetToken((decimal)time.TotalSeconds, key); } private static string GetToken(decimal seconds, string key) { var ts_str = (seconds + 3600).ToString("0.0000000"); var ts_byte = Encoding.UTF8.GetBytes(ts_str); var hasher = new HMACSHA1(Encoding.UTF8.GetBytes(key)); var hashResult = hasher.ComputeHash(ts_byte); var sha1_tshexstr = BitConverter.ToString(hashResult).Replace("-", "").ToLower(); var token = string.Format("{0}:{1}", ts_str, sha1_tshexstr); var b64_token = Base64UrlTextEncoder.Encode(Encoding.UTF8.GetBytes(token)); return b64_token + '='; } }