@luserz

Как составить st.signature для API Одноклассники?

Здравствуйте!

Задача: постинг в ленту группы Одноклассников. Проблема возникла с формированием st.signature.

Запрос на публикацию в ленту группы выглядит следующим образом:

----------------
https://conn ect.ok.ru/dk
   ?st.cmd=WidgetMediatopicPost
   &st.app={application_id}
   &st.groupId={group_id}
   &st.attachment={attachment_json}
   &st.signature={signature}
   &st.return={return_url}
   &st.popup={popup}
   &st.silent={silent}
   &st.utext={text}
   &st.nohead={nohead}
--------------

Сформировал запрос:

https://conn ect.ok.ru/dk?st.cmd=WidgetMediatopicPost&st.app=#Идентификатор приложения#&st.groupId=#Идентификатор группы#&st.attachment={"media":[{"type":"text","text":"привет"}],"publishAt":"2022-08-27 12:05:00","onBehalfOfGroup":"true","disableComments":"false"}&st.signature=????

С закодированным атачмент:

https://conn ect.ok.ru/dk?st.cmd=WidgetMediatopicPost&st.app=#Идентификатор приложения#&st.groupId=#Идентификатор группы#&st.attachment=%7b%22media%22%3a%5b%7b%22type%22%3a%22text%22%2c%22text%22%3a%22%d0%bf%d1%80%d0%b8%d0%b2%d0%b5%d1%82%22%7d%5d%2c%22publishAt%22%3a%222022-08-27+12%3a05%3a00%22%2c%22onBehalfOfGroup%22%3a%22true%22%2c%22disableComments%22%3a%22false%22%7d&st.signature=????

Далее в справке API https://apiok.ru/ext/publish написано:

Расчет подписи запроса st.signature

-------------------------------
В качестве секретного ключа при передаче параметра st.access_token используется session_secret_key сессии, иначе, используется секретный ключ приложения.
Все значения не должны быть закодированы (кроме случая, когда вы используете base64 для st.attachment).

Если указан параметр st.return, вычисляется следующим образом:

md5("st.attachment=" + attachment + "st.return=" + return_url + secretKey);
В остальных случаях:

md5("st.attachment=" + attachment + secretKey);
-------------------------------

Не понимаю, каким образом получить st.signature. Как записать данную конструкцию ("st.attachment=" + attachment + secretKey) при помощи C# или JavaScript чтобы получит хеш?
  • Вопрос задан
  • 118 просмотров
Решения вопроса 1
vabka
@vabka
Токсичный шарпист
UPD: Понял, что md5 - это функция из php
При помощи C# например так:
using System;
using System.Text;
using System.Security.Cryptography;

var attachmentBytes = File.ReadAllBytes("image.png");
var attachment = Convert.ToBase64String(attachmentBytes);
var secretKey = "...";
var str = $"st.attachment={attachment}{secretKey}";
var signature = Md5(str);
Console.WriteLine(signature);
// Функция, полностью повторяющая поведение md5 из php
static string Md5(string data) {
  var bytes = Encoding.UTF8.GetBytes(data);
  var hash = MD5.HashData(bytes);
  return string.Create<byte[]>(hash.Length*2, hash, static (span, hash) => {
    for(var i=0; i < hash.Length; i++) {
      var slice = span.Slice(i*2, 2);
      var octet = hash[i];
      octet.TryFormat(slice, out _, "x2");
    }
  }); 
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы