Как задать timestamp в запросе к api литреса

105
22 марта 2021, 04:10

Отправляю запрос к api Литреса для получения списка новых книг с определенной даты. Но проблема в том, что если в качестве чекпоинта указать время на час и более от текущего, то выдает ошибку

Query signature is invalid: timestamp expired

А если меньше, то все хорошо, запрос возвращает xml с данными.

 string checkpoint = "2019-07-06 16:00:41";
            string timestamp = ConvertToUnixTimestamp(checkpoint).ToString();
            string sha = ComputeSha256Hash(timestamp + ":secret_key:" + checkpoint);
            string place = "place";
        var values = new Dictionary<string, string>
        {
           { "checkpoint", checkpoint },
           { "place", place },
           { "timestamp", timestamp },
           { "sha", sha }
        };
        var content = new FormUrlEncodedContent(values);
        var response = await client.PostAsync("https://partnersdnld.litres.ru/get_fresh_book/", content);
        var responseString = await response.Content.ReadAsStringAsync();
static string ComputeSha256Hash(string rawData)
    {   
        using (SHA256 sha256Hash = SHA256.Create())
        {
            byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(rawData));
            StringBuilder builder = new StringBuilder();
            for (int i = 0; i < bytes.Length; i++)
            {
                builder.Append(bytes[i].ToString("x2"));
            }
            return builder.ToString();
        }
    }
    static double ConvertToUnixTimestamp(string date_str)
    {
        DateTime date = DateTime.Parse(date_str, new CultureInfo("ru-RU"));
        DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0);
        TimeSpan diff = date - origin;
        return Math.Floor(diff.TotalSeconds);
    }

Вот что по поводу чекпоинта написано в их инструкции:

• checkpoint – время в формате ISO (например, 2017-12-06 19:35:39), с которого следует забирать новинки. Вы получите список новинок со временем большим или равным checkpoint и меньшим /fb-updates/@timestamp (см. описание XML ниже). Если вы хотите получать непрерывную ленту новинок, сохраняйте отданный вам сервером /fb-updates/@timestamp и в следующий раз используйте его в качестве checkpoint. Для получения полной базы (при первоначальной загрузке) используйте чекпойнт «2013-01-01 00:00:00»;

и

Программисты Windows! Проверьте свои таймстампы на http://www.timestampgenerator.com/. Обратите внимание, что вычислять таймстамп из местного времени нельзя! Таймстамп считается по UTC и без сдвига летнего/зимнего времени. В Википедии есть множество подробностей по теории таймстампа, а также есть огромное количество исходников для любого языка, от Perl до PL/SQL.

Я проверял, мой код генерирует timestamp такой же, как и там, если указать нужное время. Подскажите, что не так?

READ ALSO
Не появляется notifyicon при вызове

Не появляется notifyicon при вызове

Есть пустая форма Form1 и присоедененная к ней notifyicon1В скрипте Form1

83
Resource не найден

Resource не найден

У меня есть ресурс:

95
Синтаксическая ошибка не понятно в чем

Синтаксическая ошибка не понятно в чем

Вот пример процедуры , написанной в MYSQL WORKBENCH версии 80

117
Как записать JSON в MySQL

Как записать JSON в MySQL

Пробую записать JSON в MySql, но не получается из-за слэшей и кавычек которые находятся в JSON'неКак можно сделать?

122