google api

VladimirVVP
Дата: 01.11.2019 18:18:36
вопрос наверное не в эту ветку форума..
в общем весь день пытаюсь авторизоваться в google колендаре..
не могу понять коким парраметрам передовать client ID и client secret..
по ходу, что бы пользоватся их справкой нужно сломать голову))

 url:='https://www.googleapis.com/auth/calendar';
 http:=createoleobject('WinHttp.WinHttpRequest.5.1');
 http.open('GET', url, true); 
 http.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 http.send(' ');


http.send(' ??? =client ID&???=client secret' );
может кто уже с этим сталкивался?
V.Borzov
Дата: 01.11.2019 18:40:21
VladimirVVP,

Сделано в FastScript:
var  url:string ='https://www.googleapis.com/auth/calendar';
var HTTP :variant;
begin
 http:=createoleobject('WinHttp.WinHttpRequest.5.1');
 http.open('GET', url, 0); 
 http.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 http.send('');
 showmessage(vartostr(http.status)+',text: '+vartostr(http.statustext));
end.

Получим статус 200 Ok.

Если http.open('GET', url, true); то это асинхронный вызов, ответ не получим сразу после send. (документация)

Получим исключение:
OLE error 80020009: status: Ошибка
Source :: WinHttp.WinHttpRequest
Description :: Данные, необходимые для завершения этой операции еще не доступны.

Если Send(' ') (пробел то есть), то получаем 400 Bad request
Я вообще Send() пишу. Посылать что-то в параметре вообще имеет смысл в методе POST, наверное.

Собственно, полученный результат: showmessage(http.responsetext);

Ну а дальше надо читать доку к calendar, видимо.
VladimirVVP
Дата: 01.11.2019 18:50:09
V.Borzov,
с этим проблем нет

 procedure Form1_Button1_OnClick (Sender: TObject; var Cancel: boolean);
 begin
 url:='https://www.googleapis.com/auth/calendar';
 http:=createoleobject('WinHttp.WinHttpRequest.5.1');
 http.open('GET', url, true); 
 http.SetRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 http.send(' ');
 Timer:=TTimer.Create(Form1);   
 Timer.Interval:=1000;          
 Timer.Enabled:=True;           
 Timer.OnTimer:=@cGoogle;       
 end;

procedure cGoogle;
begin
  try
    if http.Status() = 200 then
      begin
       Form1.Memo1.Text:=http.responsetext;
       end;
       except
       Form1.Memo1.Text:='pusto';
    end;
end;
V.Borzov
Дата: 01.11.2019 19:07:27
VladimirVVP,
В Честном Знаке в Маркировке лекарств делаю так:

во-первых, надо использовть метод POST
    WinHttp.Open('POST','http://api.sb.mdlp.crpt.ru/api/v1/auth',0);

а во-вторых, послать строку
    strvalue := '{"client_id":"'+client_id+'","client_secret":"'+CLIENT_SECRET+'","user_id":"'+USER_ID+'","auth_type":"SIGNED_CODE"}';
    WinHttp.Send(strvalue);

В ответ через WinHttp.ResponseText(); получаем код доступа, который подписываем, посылаем обратно через post, завернув в соответствующий JSON, и получаем токен, при указании которого в заголовке уже работаем спокойно с ихним api в течение получаса, пока он действует. У них есть подробное описание этого процесса.

Первая же ссылка подсказывает, что здесь тоже очень всё похоже: регистрируем "проект" и при логине указываем его данные. Остается найти спецификации на формирование этого посылаемого JSON.
V.Borzov
Дата: 01.11.2019 19:19:05
И почему вот здесь http.send(' ??? =client ID&???=client secret' ); параметры с их значениями местами перепутаны? И пробелы в названиях параметров. Или это было где-то в документации так описано?
VladimirVVP
Дата: 01.11.2019 19:44:43
V.Borzov,

а что за "user_id":"'+USER_ID+'" - в описании google такого нет

и для авторизции используется https://www.googleapis.com/auth/calendar так у них в описании сказано https://developers.google.com/calendar/auth..

а по вашей ссылке - это описание подключение вебсервера
V.Borzov
Дата: 01.11.2019 19:46:27
Нет-нет, USER_ID - это не про гугл. Я привел пример подключения к ЧЗ. Может, поможет. Там я тоже довольно долго возился совсем недавно, пока пошло. Ошибки оказались буквально в мелочах.
V.Borzov
Дата: 02.11.2019 21:02:10
VladimirVVP
с этим проблем нет
...

таймер тут тоже не спасет: если запросить status, не дождавшись ответа от сервера, то будет ошибка:

OLE error 80020009: Нельзя вызвать этот метод до вызова метода Send

Надо дождаться ответа, либо прекратить ожидание, если висит жестко.

Как-то так примерно с асинхронным вызовом:

+
      WinHttp.Open('GET','адрес',1);
      WinHttp.setRequestHeader(...);
      WinHttp.Send(); 
      while not winhttp.waitforresponse(1) do 
      begin
        application.processmessages;
        if ХВАТИТ_ЖДАТЬ then 
        begin
          winhttp.abort;
          raise exception.create('Запрос остановлен');
        end; 
      end;
      showmessage('preferences status: '+vartostr(winhttp.status)+',text: '+vartostr(winhttp.statustext)+', response: '+winhttp.responsetext);