POST запрос в calendar.google.com

IntBIZ

Новичок
Регистрация
13.10.2016
Сообщения
4
Благодарностей
0
Баллы
1
Здравствуйте, уважаемые форумчане.
Делаю шаблон на post запросах в гугл-календаре.

В запросе используется заголовок "Authorization:"
http://prntscr.com/kxronn

Этот параметр изменяется при каждой новой авторизации в гугл-аккаунте.
Никак не могу найти, где его получить после авторизации, чтобы сохранить в переменную.

Помогите, пожалуйста, если это возможно...
 

IntBIZ

Новичок
Регистрация
13.10.2016
Сообщения
4
Благодарностей
0
Баллы
1

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113
возможно он берется до авторизации или генерится из определенных элементов, типа куки, дата входа...
попробуй следующее, я обычно так делаю и в 90% прокатывает
делаешь весь процесс руками, записывая код страницы в отдельный текстовый файл, потом когда видишь что передалась переменная, копируешь ее и поиском ищешь, если она есть в коде, найдешь 100%, если нет, значит генерится, надо уже курить java скрипты...
примерно так ....

ps \ пытался как-то писать гугл на реквестах, забил, слишком сложно для меня оказалось )
 

IntBIZ

Новичок
Регистрация
13.10.2016
Сообщения
4
Благодарностей
0
Баллы
1
Да, я все запросы вручную просмотрел, нигде в ответах этого параметра не приходит, но она потом внезапно появляется в запросах. Следовательно да, она генерируется как-то.

Нашел в сети вот этот кусок кода, который вроде как генерирует нужный мне параметр "SAPISIDHASH", но не знаю, как его в зеннопостер запихнуть, и откуда вообще брать переменные, которые используются для генерации SAPISIDHASH.


===========
"""Return authorization headers for API request."""
# It doesn't seem to matter what the url and time are as long as they are
# consistent.
time_msec = int(time.time() * 1000)
auth_string = '{} {} {}'.format(time_msec, sapisid_cookie, ORIGIN_URL)
auth_hash = hashlib.sha1(auth_string.encode()).hexdigest()
sapisidhash = 'SAPISIDHASH {}_{}'.format(time_msec, auth_hash)
return {
'authorization': sapisidhash,
'x-origin': ORIGIN_URL,
'x-goog-authuser': '0',
}
def _get_authorization_headers(sapisid_cookie):
===========
 

IntBIZ

Новичок
Регистрация
13.10.2016
Сообщения
4
Благодарностей
0
Баллы
1
Из входных параметров мне известно, что такое "sapisid_cookie", эта штука из куков берется)
 

backoff

Client
Регистрация
20.04.2015
Сообщения
6 052
Благодарностей
6 481
Баллы
113

ceobeez

Client
Регистрация
11.05.2017
Сообщения
27
Благодарностей
4
Баллы
3
Код:
def _get_authorization_headers(sapisid_cookie):
    """Return authorization headers for API request."""
    # It doesn't seem to matter what the url and time are as long as they are
    # consistent.
    time_msec = int(time.time() * 1000)
    auth_string = '{} {} {}'.format(time_msec, sapisid_cookie, ORIGIN_URL)
    auth_hash = hashlib.sha1(auth_string.encode()).hexdigest()
    sapisidhash = 'SAPISIDHASH {}_{}'.format(time_msec, auth_hash)
    return {
        'authorization': sapisidhash,
        'x-origin': ORIGIN_URL,
        'x-goog-authuser': '0',
    }

это функция на питоне, её надо переписать на c# или на js, следует учесть что используется hashlib.
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
C#:
string SAPISID = project.Variables["SAPISID"].Value.Replace("SAPISID=", "");
string origin = "%ORIGIN_URL%";

int unixTime = (int) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;

string strToHash = unixTime + " " + SAPISID + " " + origin;

var data = Encoding.ASCII.GetBytes(strToHash);
var hashData = new SHA1Managed().ComputeHash(data);
var hash = string.Empty;

foreach (var b in hashData)
{
    hash += b.ToString("X2");
}

hash = hash.ToLower();

return unixTime + "_" + hash;
C#:
using System.Security.Cryptography;
 

VerBin

Client
Регистрация
28.05.2016
Сообщения
555
Благодарностей
457
Баллы
63
Для чего писать браузерные костыли для google calendar если можно использовать api либо apps script, где выполнять нужные функции гораздо удобнее.
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
Для чего писать браузерные костыли для google calendar если можно использовать api либо apps script, где выполнять нужные функции гораздо удобнее.
Sapisidhash параметр используется не только в календарях. Он общий для всего Google.

Он также используется в YouTube.
Квоты в Апи YouTube понижены с 1 000 000 до 10 000. Что не позволяет при массовой работе использовать один и тот же ключ для множества аккаунтов. Либо ждать сутки, либо использовать другой ключ.

Также использование апи требует в шаблон дописывать:
1. Функционал по работе с методами апи.
2. Регистрировать приложение и получать ключи.
3. Добавлять их во входные настройки.

Куда эффективнее использовать запросы браузера подхватив нужную куку и сгенерировав новый параметр выполнить один запрос, чем городить код по авторизации в апи и получению всех токенов и их перегенерации, чтобы выполнить ту же функцию.
 
Последнее редактирование:

phirelli

Client
Регистрация
11.09.2016
Сообщения
34
Благодарностей
6
Баллы
8
Здравствуйте! Спасибо огромное за код, всё как бы работает но оказывается Sapisidhash не только такой бывает а есть ещё другого типа как на картинке http://prntscr.com/pda875, с каким то индексом "_e" и там совершенно другой hash получается, я уже несколько дней бьюсь и ничего не могу найти никакой зацепки из каких параметров он генерируется, если кто знает подскажите пожалуйста!
Hash2.jpg
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
Здравствуйте! Спасибо огромное за код, всё как бы работает но оказывается Sapisidhash не только такой бывает а есть ещё другого типа как на картинке http://prntscr.com/pda875, с каким то индексом "_e" и там совершенно другой hash получается, я уже несколько дней бьюсь и ничего не могу найти никакой зацепки из каких параметров он генерируется, если кто знает подскажите пожалуйста!
Hash2.jpg
С каким индексом _e?
В коде генерируется так, как у вас на скрине.
 

phirelli

Client
Регистрация
11.09.2016
Сообщения
34
Благодарностей
6
Баллы
8
С каким индексом _e?
В коде генерируется так, как у вас на скрине.
Там есть несколько видов как я понял этих hash, вот такой же hash http://prntscr.com/pdb4ic как в вашем коде и да там всё правильно работает, есть ещё такой http://prntscr.com/pdb5hv в нём нету префикса unixtime отдельного, а есть и такой как я показал выше http://prntscr.com/pdb6zb Тут ещё можно заметить такую штуку 2 запроса были с одинаковым unixtime но hash абсолютно разные, а значит значения которые там генерируются другие, вот hash для примера из запросов:
1. SAPISIDHASH 1569920003_cf5254929d2e79976b2796281a002be5ca9e768e
2. SAPISIDHASH 1569920003_c6db90cbf9260c904e7489f8c338d473f087cde5_e
В них unixtime идентичный и это всё один аккаунт в одной сессии, в один промежуток времени. Если бы у меня этот запрос работал с тем hash что у вас в коде я бы естественно тут ничего не писал, я же это не придумал)
Попробуйте если не верите создать post запросом папку в гуглдиске, и увидите что к сожалению этот код с hash не универсальный и видимо всё зависит от адреса запроса. Но в любом случаи спасибо вам уже за тот код что есть, но я реально уже куча разных параметров переставил и 2-го хеша так и не вышло, а первый чётко получился.
 

Meteorburn

Client
Регистрация
23.05.2016
Сообщения
1 472
Благодарностей
575
Баллы
113
Там есть несколько видов как я понял этих hash, вот такой же hash http://prntscr.com/pdb4ic как в вашем коде и да там всё правильно работает, есть ещё такой http://prntscr.com/pdb5hv в нём нету префикса unixtime отдельного, а есть и такой как я показал выше http://prntscr.com/pdb6zb Тут ещё можно заметить такую штуку 2 запроса были с одинаковым unixtime но hash абсолютно разные, а значит значения которые там генерируются другие, вот hash для примера из запросов:
1. SAPISIDHASH 1569920003_cf5254929d2e79976b2796281a002be5ca9e768e
2. SAPISIDHASH 1569920003_c6db90cbf9260c904e7489f8c338d473f087cde5_e
В них unixtime идентичный и это всё один аккаунт в одной сессии, в один промежуток времени. Если бы у меня этот запрос работал с тем hash что у вас в коде я бы естественно тут ничего не писал, я же это не придумал)
Попробуйте если не верите создать post запросом папку в гуглдиске, и увидите что к сожалению этот код с hash не универсальный и видимо всё зависит от адреса запроса. Но в любом случаи спасибо вам уже за тот код что есть, но я реально уже куча разных параметров переставил и 2-го хеша так и не вышло, а первый чётко получился.
Я не то чтобы не верю. Просто каждый из нас по разному понимает что-то. По-этому я сделал ставку на то, что возможно вы ошиблись или не так поняли.

Сейчас я вижу по вашим скринам, что значение действительно разное. Мне подобные значения не встречались, по-этому сходу решения нет.

Тем не менее обратите внимание на код, в нём для вычисления хеша принимается ещё параметр origin, (url на котором отправляется SAPISIDHASH), который мог не приниматься при хешировании: https://prnt.sc/pdb6zb или origin мог быть другим.

Это как раз о том, что все мы понимаем что-то по разному, что-то не учитываем и думаем, что нужно что-то ещё.

upd: я думаю что SAPISIDHASH это 100% unixtime + хеширование трёх параметров (unixtime + sapisid + origin ). Просто на каком-это этапе меняется один из параметров и требуется новое значение SAPISIDHASH .
 
Последнее редактирование:
  • Спасибо
Реакции: phirelli

phirelli

Client
Регистрация
11.09.2016
Сообщения
34
Благодарностей
6
Баллы
8
Я не то чтобы не верю. Просто каждый из нас по разному понимает что-то. По-этому я сделал ставку на то, что возможно вы ошиблись или не так поняли.

Сейчас я вижу по вашим скринам, что значение действительно разное. Мне подобные значения не встречались, по-этому сходу решения нет.

Тем не менее обратите внимание на код, в нём для вычисления хеша принимается ещё параметр origin, (url на котором отправляется SAPISIDHASH), который мог не приниматься при хешировании: https://prnt.sc/pdb6zb или origin мог быть другим.

Это как раз о том, что все мы понимаем что-то по разному, что-то не учитываем и думаем, что нужно что-то ещё.

upd: я думаю что SAPISIDHASH это 100% unixtime + хеширование трёх параметров (unixtime + sapisid + origin ). Просто на каком-это этапе меняется один из параметров и требуется новое значение SAPISIDHASH .
Я понял, тоже к этому склоняюсь, очень вряд ли что они там будут что то сверх мудрить, буду пробовать по разному, если выйдет отпишусь. Спасибо за ответ!
 
  • Спасибо
Реакции: Meteorburn

marushin

Client
Регистрация
12.01.2015
Сообщения
193
Благодарностей
60
Баллы
28
Тоже столкнулся с этим SAPISIDHASH, при попытках загрузить в google drive файлы post запросом.
Код который выше, работает, но только на GET запросах и SAPISIDHASH генерируется верный, но в POST запросе, который собственно и грузит файл на drive, уже не получается сгенерить этим кодом.
Проверял подстановкой готовых параметров из запросов.

Коллеги, кто разобрался, подскажите если не сложно.
 

Вложения

  • 146,9 КБ Просмотры: 247
  • 133,8 КБ Просмотры: 212
  • Спасибо
Реакции: phirelli

megaditis

Новичок
Регистрация
30.08.2020
Сообщения
23
Благодарностей
2
Баллы
3
так получилось у вас все таки написать шаб для гугл календарей?
 

WalkODoff

Client
Регистрация
09.04.2016
Сообщения
155
Благодарностей
33
Баллы
28
C#:
string SAPISID = project.Variables["SAPISID"].Value.Replace("SAPISID=", "");
string origin = "%ORIGIN_URL%";

int unixTime = (int) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;

string strToHash = unixTime + " " + SAPISID + " " + origin;

var data = Encoding.ASCII.GetBytes(strToHash);
var hashData = new SHA1Managed().ComputeHash(data);
var hash = string.Empty;

foreach (var b in hashData)
{
    hash += b.ToString("X2");
}

hash = hash.ToLower();

return unixTime + "_" + hash;
C#:
using System.Security.Cryptography;

Спасибо за код, в C# не особо силен, закинул его в кубик для выполнения, прописал
C#:
using System.Security.Cryptography;
В итоге получаю вот такие ошибки, подскажите, что сделал не так?

Компиляция кода Ошибка в действии "CS0246" "The type or namespace name 'SHA1Managed' could not be found (are you missing a using directive or an assembly reference?)". [Строка: 10; Cтолбец: 20]

Компиляция кода Ошибка в действии "CS1579" "foreach statement cannot operate on variables of type '?' because '?' does not contain a public instance definition for 'GetEnumerator'". [Строка: 13; Cтолбец: 19]

Давно с зенкой не работал, может упустил какую то мелочь. Попытался погуглить эти ошибки, ничего не понял.



UPD. Сам не понял что сделал, но оно заработало, может быть некорректно скопировал.
 
Последнее редактирование:
  • Спасибо
Реакции: Meteorburn

Кто просматривает тему: (Всего: 2, Пользователи: 0, Гости: 2)