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.

80 lines
2.6 KiB

  1. //******************************************************************************
  2. // transparent true/false
  3. // ugc - garmin active captain
  4. // layer - 0 Seachart, 1 Sonarchart
  5. // du - unit 1 for depth in meters, 2 for depth in feet, 3 for fathoms
  6. // sd - safe depth
  7. // sa ?
  8. //******************************************************************************
  9. const
  10. cReqParams = 'transparent=false&ugc=true&layer=1&du=1&sd=2&sa=false';
  11. //******************************************************************************
  12. const
  13. cTTL = 10*60; // 10 Minutes
  14. function CheckTTL(const ATimeStamp: Integer): Boolean;
  15. begin
  16. Result := (cTTL div 2) > GetUnixTime - ATimeStamp;
  17. end;
  18. function GetNavToken: AnsiString;
  19. var
  20. VNavTokensJson: AnsiString;
  21. VTimeStamp: Integer;
  22. VResponseCode: Cardinal;
  23. VResponseHeader, VResponseData: AnsiString;
  24. VRequestUrl, VRequestHeader: AnsiString;
  25. begin
  26. Result := '';
  27. Global.Lock;
  28. try
  29. if Global.Exists(0) and Global.Exists(1) then begin
  30. VNavTokensJson := Global.GetVar(0);
  31. VTimeStamp := Global.GetVar(1);
  32. if (VNavTokensJson <> '') and (VTimeStamp <> 0) and CheckTTL(VTimeStamp) then begin
  33. Result := VNavTokensJson;
  34. end;
  35. end;
  36. if (Result = '') and Assigned(Downloader) then begin
  37. VRequestUrl := 'https://maps.garmin.com/marine/api/getNavionicsTokens';
  38. VRequestHeader := 'Origin: https://maps.garmin.com' + #13#10 + 'Referer: https://maps.garmin.com/';
  39. VResponseHeader := '';
  40. VResponseData := '';
  41. VResponseCode := Downloader.DoHttpRequest(VRequestUrl, VRequestHeader, '', VResponseHeader, VResponseData);
  42. if VResponseCode = 200 then begin
  43. Result := VResponseData;
  44. Global.SetVar(0, Result);
  45. Global.SetVar(1, GetUnixTime);
  46. end;
  47. end;
  48. finally
  49. Global.Unlock;
  50. end;
  51. end;
  52. //******************************************************************************
  53. var
  54. VBuf : AnsiString;
  55. VNavToken: AnsiString;
  56. VNavBearer: AnsiString;
  57. begin
  58. VBuf := GetNavToken;
  59. VNavToken := RegExprGetMatchSubStr(VBuf, '"configuration_token":"(.*)"', 1);
  60. VNavBearer := RegExprGetMatchSubStr(VBuf, '"access_token":"(.*)",', 1);
  61. if VNavToken <> '' then begin
  62. ResultURL := TemplateToUrl(GetURLBase) + '?' + 'config=' + VNavToken + '&' + cReqParams;
  63. RequestHead:= 'Referer: https://maps.garmin.com/' + #13#10 +
  64. 'Origin: https://maps.garmin.com' + #13#10 +
  65. 'Authorization: Bearer '+ VNavBearer;
  66. end else begin
  67. ResultURL := '';
  68. end;
  69. end.