Svoboda | Graniru | BBC Russia | Golosameriki | Facebook

Виджет публикации

Для внешних приложений (например, сайтов или Android/iOS приложений) предусмотрен особый механизм публикации медиатопиков на страницу пользователя (эти записи увидят его друзья в своих лентах) и на страницу группы (только в случае наличия прав на публикацию в группу у пользователя).

Использование виджета возможно только после аппрува приложения. Для получения аппрува отправьте id вашего приложения и URL сайта, с которого будут осуществляться публикации, на адрес: [email protected].

Публикация в ленту пользователя

Для публикации необходимо открыть новое окно браузера (или iframe) со специально сформированным URL:

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

Значения всех аргументов URL должны быть закодированы.

ПараметрОбязательныйОписание
st.appДаИдентификатор приложения (application id)
st.attachmentДаJson-кодированная информация о публикуемом медиатопике (см. формат ниже)
Можно закодировать json при помощи base64, чтобы избежать избыточного кодирования русских символов.
st.signatureДаЦифровая подпись запроса (см. алгоритм подсчета ниже)
st.returnНетURL, на который будет совершён редирект с результатом выполнения. Если не указан, то результат публикации будет передан через HTML5 postMessage
st.popupНетВыполнять автоматическое центрирование и подгонку размеров окна.
Возможные значения: on/off (по умолчанию)
st.silentНетЗакрывать окно автоматически после окончания операции. Игнорируется, если указан st.return.
Возможные значения: on/off (по умолчанию)
st.utextНетДать возможность пользователю указать свой текст в публикуемом медиатопике.
Возможные значения: on/off (по умолчанию)
st.noheadНетОтображать ли вверху виджета шапку Одноклассников.
Возможные значения: on/off (по умолчанию)
st.access_tokenНетВ случае OAuth приложения - требуется указать access_token
st.groupIdНетВ случае необходимости публикации в группу надо указать её id в качестве значения этого параметра

Публикация в ленту группы

Публикация в группу работает таким же образом, как и публикация в ленту пользователя, — надо открыть новое окно в браузере или iframe со специальным URL формата:

https://connect.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}

Все параметры в URL аналогичны параметрам при публикации в ленту пользователя, но должен присутствовать параметр st.groupId.

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

Расчет подписи запроса 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.return при создании топика.

Если параметр st.return не использовался, итогом процесса публикации топика должен быть id созданного топика:

{"id":"67601133491473"}

Если в результате приходит id = 0, то необходим аппрув приложения, запросить который можно написав на почтовый адрес [email protected].

При создании топика с параметром st.return в случае успешного создания топика результатом является ответ в следующем формате:

{"type":"success","id":"67601141224721","signature":"94fef0ec7d967e1eb41d5a505d1668ca"}

Возможные параметры ответа:

  • type - флаг, успешно ли завершился процесс создания топика. Возможные значения: success, error;
  • id - идентификатор созданного топика;
  • signature - подпись для валидации ответа на стороне вашего сервиса;
  • code - код ошибки, возникшей при создании топика. Есть в ответе только если type=error;
  • message - информация об ошибке, возникшей при создании топика. Есть в ответе только если type=error.

Параметр signature подсчитывается по нижеуказанной формуле:

md5("id=" + id + secretKey);

Как указать контент топика

Описание attachment

Публикация медиатопика, который может содержать множество вложенных объектов:

  • тексты
  • ссылки
  • фотографии
  • видео
  • музыку
  • голосования
  • решары
  • места

Пример результата

Пример результата

Пример результата игрового медиатопика

Пример результата игрового медиатопика

Общий вид JSON-дерева

{
  "media": [
    {
      "type": "photo",
      "list": [
        { "id": "photoToken1" },
        { "id": "photoToken2" },
        { "photoId": "1234" }
      ]
    },
    {
      "type": "movie",
      "list": [
        { "id": "movieId1" },
        { "id": "movieId2" }
      ]
    },
    {
      "type": "music",
      "list": [
        {
          "id": "id1",
          "title": "SongName1",
          "artistName": "Artist1",
          "albumName": "Album1"
        }
      ]
    },
    {
      "type": "poll",
      "question": "Is it question?",
      "answers": [
        { "text": "Yes" },
        { "text": "No" }
      ],
      "options": "SingleChoice,AnonymousVoting"
    },
    {
      "type": "link",
      "url": "https://apiok.ru/"
    },
    {
      "type": "text",
      "text": "Text1"
    },
    {
      "type": "app",
      "text": "Text above image",
      "images": [
        {
          "url": "http://r.mradx.net/img/38/F3C336.jpg",
          "mark": "prize_1234",
          "title":"Hover Text!"
        }
      ],
      "actions": [
        {
          "text":"Hello",
          "mark":"hello"
        }
      ]
    }
  ]
}

Создание решары

Чтобы создать решару на топик или видео нужно в опциональном аттрибуте “topic” или “movie-reshare” задать ID объекта на который создается решара. Если решара устанавливается в статус, то при создании решары текстовой комментарий к объекту обязателен (“type”:”text”)

Пример валидного запроса на создание решары топика (необходимо указать наличие принадлежности к контенту групп, true/false соответственно):

{
    "media": [
        {
            "type": "text",
            "text": "my text"
        },
        {
            "type": "topic",
            "topicId": "10240918683741",
            "group": "false"
        }
    ]
}

Пример валидного запроса на создание решары видео

{
    "media": [
        {
            "type": "text",
            "text": "hello"
        },
        {
            "type": "movie-reshare",
            "movieId": "14029922"
        }
    ]
}

Пример валидного запроса на несколько решар в одном топике

{
    "media": [
        {
            "type": "text",
            "text": "my text"
        },
        {
            "type": "topic",
            "topicId": "10240965345470",
            "group": "true"
        },
        {
            "type": "topic",
            "topicId": "10240965411006",
            "group": "true"
        }
    ]
}

Элементы media

ТипОписаниеДополнительные параметрыОграничения
photoФотографииlist - список фотографий, описанных одним из двух параметров:
* id - параметр token, передаваемый в метод photosV2.commit во время загрузки фотографий на сервер
* photoId - id фотографии для которой будет сделана решара
* У приложения должен быть PHOTO_CONTENT
* Все фотографии должны принадлежать текущему пользователю
* Все фотографии должны находиться в одном и том же альбоме
* При посте в группу, фотографии не должны быть привязаны к альбому, и для них не требуется вызывать photosV2.commit
* В случае если передаётся photoId фотография должна существовать и быть в открытом доступе
movieВидеороликиlist - список видеороликов:
* id - идентификатор видеозаписи
* У приложения должен быть VIDEO_CONTENT
musicМузыкаlist - список аудиозаписей:
* id - идентификатор
* artistName - название исполнителя
* title - название аудиозаписи
* albumName - (необязательный) название альбома
 
pollГолосование* question - вопрос голосования
* answers - список ответов к голосованию
** text - текст ответа
* options - (необязательный) дополнительные параметры голосования
Возможные параметры:
* SingleChoice - Голосование, в котором можно выбрать только один ответ (если не стоит - несколько ответов)
* AnonymousVoting - Анонимное голосование (никто не сможет увидеть пользователей, кто как проголосовал)
* ResultsAfterVoting - Тип опроса, когда результаты будут видны только после голосования
linkСсылкаurl - ссылка на интересную страницу* Не более одной ссылки на медиатопик
textТекстtext - дополнительный текст 
appИгровой блок* text - текст над картинкой

* images - массив изображений
** url - ссылка на картинку размером 492x364
** title - текст при наведении на картинку
** mark - метка, которая будет передана приложению в параметре custom_args при переходе

* actions- массив ссылок
** text - текст ссылки
** mark - метка, которая будет передана приложению в параметре custom_args при переходе
* На текущий момент поддерживается 1 картинка
* На текущий момент поддерживается 1 ссылка
* Блок отображается в ленте только у подтверждённых приложений
* Нельзя постить только блок app, с ним должен быть ещё text/photo и т.д..
app-refСсылка на приложениеappId - id приложения* Не более 1 ссылки на приложение
* Указанное приложение должно пройти модерацию

Пример app-ref

{
    "media":[
        {
            "type": "app-ref",
            "appId": 512000589246,
            "text": "Тестовый текст для топика",
            "imageHD":"https://st.mycdn.me/static/game-promo-image/0-2-94/topic_image.png",
            "args": "key=value",
            "snippet": "play"
        }
    ]
}

Пример media

{
  "media": [
    {
      "type": "photo",
      "list": [
        { "id": "GbEJzZVBho7Us2ZwjGXhGnIo4rHF2U7jn8N6fbeMFCUfdSjSv+SexzjMLSFliybJfJNV2qbdaS+x8qqWqzfFN+U+34bhVwyU9ENKARywfAx/HJFAyyKZHqRA42DsEm6qXZwcnnvjF9M8r+FsNi3DiQ==" },
        { "id": "sts6ma1U8pE4jIvElzHPbtoQtIF5KTijxZdQlRNN/Gw6Wx3CY2Xr7NEZ0eOSpCneZAoIGAj/nodexVaKGnHeVtqU1LMlBYGsxj5GKmBDzv2b/tq7WpRg61Ugc46E3894" }
      ]
    },
    {
      "type": "music",
      "list": [
        {
          "id": 8058357707207,
          "title": "Fix You",
          "artistName": "Coldplay",
          "albumName": "X&Y"
        }
      ]
    },
    {
      "type": "poll",
      "question": "Правда крутой медиатопик?",
      "answers": [
        { "text": "Да" },
        { "text": "Конечно да" }
      ],
      "options": "SingleChoice"
    },
    {
      "type": "text",
      "text": "Текст в придачу"
    }
  ]
}