CapitalbusMile.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. using Microsoft.AspNetCore.WebUtilities;
  2. using Microsoft.Extensions.Logging;
  3. using Newtonsoft.Json.Linq;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.Linq;
  7. using System.Net.Http.Json;
  8. using System.Security.Cryptography;
  9. using System.Text;
  10. using System.Threading.Tasks;
  11. internal class CapitalbusMile
  12. {
  13. const string urlFormat = "http://ecar.capitalbusgroup.com.tw:8081/GetLastKM/{0}/{1}";
  14. const string key = "35505603";
  15. public static async Task<decimal?> GetMile(string carNumber, ILogger? logger = null)
  16. {
  17. try
  18. {
  19. HttpClient client = new HttpClient();
  20. string token = GetToken();
  21. string url = string.Format(urlFormat, carNumber, token);
  22. var result = await client.GetAsync(url);
  23. if (result.IsSuccessStatusCode)
  24. {
  25. Stream contentStream = await result.Content.ReadAsStreamAsync();
  26. var body = await new StreamReader(contentStream).ReadToEndAsync();
  27. //result.Headers.Add("Content-Type");
  28. //var body = await result.Content.ReadAsStringAsync();
  29. JObject jo = JObject.Parse(body);
  30. string resultString = jo.Value<string>("Result");// jo["State"].Value<int>();
  31. if (resultString == "Success" &&
  32. jo.ContainsKey("DR_MILE"))
  33. {
  34. decimal mileage = jo.Value<decimal>("DR_MILE");
  35. return mileage;
  36. }
  37. return 1;
  38. }
  39. }
  40. catch(Exception e)
  41. {
  42. }
  43. return -1;
  44. }
  45. private static string GetToken()
  46. {
  47. return GetToken(DateTime.UtcNow, key);
  48. }
  49. private static string GetToken(DateTime DateTimeNow, string key)
  50. {
  51. DateTime baseTime = DateTime.Parse("1970/01/01 00:00:00Z").ToUniversalTime();
  52. TimeSpan time = DateTimeNow - baseTime;
  53. return GetToken((decimal)time.TotalSeconds, key);
  54. }
  55. private static string GetToken(decimal seconds, string key)
  56. {
  57. var ts_str = (seconds + 3600).ToString("0.0000000");
  58. var ts_byte = Encoding.UTF8.GetBytes(ts_str);
  59. var hasher = new HMACSHA1(Encoding.UTF8.GetBytes(key));
  60. var hashResult = hasher.ComputeHash(ts_byte);
  61. var sha1_tshexstr = BitConverter.ToString(hashResult).Replace("-", "").ToLower();
  62. var token = string.Format("{0}:{1}", ts_str, sha1_tshexstr);
  63. var b64_token = Base64UrlTextEncoder.Encode(Encoding.UTF8.GetBytes(token));
  64. return b64_token + '=';
  65. }
  66. }