К основному контенту

Пример взаимодействия с Odnoklassniki Rest API на C#.

Итак, как и обещал, продолжаю тему взаимодействия с различными API. В прошлый раз писал про API ВКонтакте, сегодня напишу про API Одноклассников.

Первое, что нам нужно сделать - это зарегистрироваться как разработчик на Одноклассниках.

Сделать это можно по следующей ссылке Форма регистрации разработчика приложений

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

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

Application ID: xxxxxx.
Публичный ключ приложения: xxxxxxxxxxxxxxxxxxxxxxxxx.
Секретный ключ приложения:  xxxxxxxxxxxxxxxxxxxxxxxxx.
Ссылка на приложение: http://www.odnoklassniki.ru/games/xxxxx

Используя эти данные можно начать работу с API.

Для выполнения запросов к API пользователь должен авторизоваться в Одноклассниках.

Добавляем на нашем сайте ссылку для авторизации пользователя:

http://www.odnoklassniki.ru/oauth/authorize?client_id={0}&scope={1}&response_type=code&redirect_uri={2} , где

client_id - Application ID;
scope - это уровень доступа к действиям пользователя, отделенный ';' (VALUABLE ACCESS;SET STATUS;PHOTO CONTENT);
redirect_uri - адрес нашего сайта, куда вернется пользователь после авторизации.

После авторизации пользователь возвращается на наш сайт. Следующее действие - это получение access_token, с помощью которого мы сможем выполнять запросы к API.

Для получения access_token нам потребуется параметр code, который передается как параметр в момент переадресации пользователя на наш сайт.

Итак, выполняем наш C# POST метод. В качестве адреса указываем http://api.odnoklassniki.ru/oauth/token.do, а в качестве параметров: client_id={0}&client_secret={1}&code={2}&redirect_uri={3},
где

client_id - Application ID;
client_secret - Секретный ключ приложения;
code - параметр, получаемый из запроса  Request.QueryString["code"];
redirect_uri - адрес нашего сайта

Метод возвращает json, содержащий access_token. Json я десериализую в объект. Об этом писал здесь.

Теперь, зная access_token, можно делать запросы к API.

Допустим мы хотим обновить статус пользователя (не забываем для этого запросить уровень доступа SET STATUS).

Для выполнения запроса нам нужно сформировать цифровую подпись, являющуюся  MD5Hash-ем от конкатенации двух строк: access_token и секретного ключа приложения.

var sigSecret = GetMD5Hash(string.Format("{0}{1}", access_token,  client_secret ));

GetMD5Hash - метод получения Hash-a строки, о котором я писал ранее

Теперь выполняем полюбившийся уже нам  C# POST метод. В качестве адреса указываем http://api.odnoklassniki.ru/fb.do, а в качестве параметров: access_token={0}&method=users.setStatus&status=Новый статус&sig={1}, где

sig - MD5Hash от следующей строки: method=users.setStatusstatus=Новый статусsigSecret (sigSecret - значение, полученное ранее)

Параметры выполнения других методов API можете посмотреть в документации.

Комментарии

  1. Денис, спасибо за познавательный пост. В доках Одноклассников без поллитра не разобраться...

    Не подскажете что вообще дает добавление приложения в Одноклассники? Добавлю я его туда, сделаю oAuth через них, что дальше? Покажут ли они мое приложение где-то в каталогах? Есть ли у них партнерки из разряда регистрируется пользователь в приложении, покупает что-то через него (допустим игра), они получают за это процент и продвигают приложение в топах? Я что-то такое слышал, но по их документации разобраться невозможно. Может быть подскажете где почитать или может вы уже об этом писали?

    Александр,
    intel_nu@mail.ru

    ОтветитьУдалить
  2. Александр, в моем случае я добавлял приложение в Одноклассниках только для того, чтобы получить Application ID, Публичный ключ приложения и Секретный ключ приложения. С помощью этих данных я могу на своем сайте (а не на сайте Одноклассников) работать с данными пользователя и выполнять действия от лица пользователя. Как отображается мое приложение в каталогах Одноклассников я не смотрел, но подозреваю что они его не выводят. Так как оно пустое само по себе.

    ОтветитьУдалить
  3. Добрый день Денис! Я сейчас занимаюсь разработкой WPF клиента для Одноглазников, используя REST API. Реализовав архитектуру ядра я столкнулся с проблемой аутентификации.

    Проблема в генерации sig. Я так и не понял, какие поля нужно конкатенировать и для первой аутентификации для получения полного доступа приложения ко всем данным пользователя.

    В чём разница между OAuth и auth.login

    ОтветитьУдалить
  4. Arnezami, у меня авторизация пользователя идет через веб, возможно для настольных приложений принцип авторизации другой.

    ОтветитьУдалить
  5. Здравствуйте, делаю все как написано, но в результате получаю ошибку
    PARAM_SIGNATURE : Invalid signature f4b047153b5fb46fd07ff3f4d0f62159, calculated by string application_key=CBAPHDGGABABABABAmethod=users.getCurrentUser********SECRET KEY*******

    в чем может быть проблема?
    кодировка, регистр бук нужно определенный указывать?
    Спасибо.

    ОтветитьУдалить
  6. Кодировка UTF8 используется в методе GetMD5Hash Регистр не менял.

    Проверьте последовательность действий. Сначала получаем
    var sigSecret = GetMD5Hash(string.Format("{0}{1}", access_token, client_secret ));

    Затем полученный sigSecret используем для получения контрольной подписи. Для моего примера контрольная подпись:

    sig - MD5Hash от следующей строки: method=users.setStatusstatus=Новый статусsigSecret (sigSecret - значение, полученное ранее)

    ОтветитьУдалить
  7. Денис, спасибо за быстрый ответ, всему виной моя невнимательность.

    ОтветитьУдалить
  8. Доброго времени суток
    Тут ошибка, url от facebook
    " В качестве адреса указываем https://graph.facebook.com/oauth/access_token, а в качестве параметров: client_id={0}&client_secret={1}&code={2}&redirect_uri={3},
    где...."

    ОтветитьУдалить
  9. Добрый вечер
    В вызове функции
    var response = PostMethod("client_id=AppID&client_secret=SECRET&code=CODE&redirect_uri=http://localhost:8990/odno.aspx", "http://api.odnoklassniki.ru/oauth/token.do");

    на строке

    return (HttpWebResponse)request.GetResponse();

    я получаю ошибку

    System.Net.WebException: The remote server returned an error: (417) Expectation failed.

    Что не так? покапался в гугле, нужно отключить

    request.ProtocolVersion = HttpVersion.Version10;

    но после этого получаю ошибку 400 bad request

    подскажите, что я делаю не так?
    Спасибо заранее

    ОтветитьУдалить
  10. Gugren, попробуйте выполнить рекомендации, которые описаны здесь.

    ОтветитьУдалить
    Ответы
    1. Спасибо, на сервере все работает, ошибка вероятно выдавалась из-за прокси сервера локального компа...

      Удалить
  11. При получении токена надо еще указывать grant_type=authorization_code. Иначе 400 Bad Request

    ОтветитьУдалить
  12. Как все же отправить:

    После авторизации пользователь возвращается на наш сайт. Следующее действие - это получение access_token, с помощью которого мы сможем выполнять запросы к API.

    Для получения access_token нам потребуется параметр code, который передается как параметр в момент переадресации пользователя на наш сайт.

    Итак, выполняем наш C# POST метод. В качестве адреса указываем http://api.odnoklassniki.ru/oauth/token.do, а в качестве параметров: client_id={0}&client_secret={1}&code={2}&redirect_uri={3},
    где

    client_id - Application ID;
    client_secret - Секретный ключ приложения;
    code - параметр, получаемый из запроса Request.QueryString["code"];
    redirect_uri - адрес нашего сайта

    можно по подробнее, ничего не могу понять как?

    ОтветитьУдалить
  13. И всетаки хотелось бы увидеть полный пример вызова (любого) - то что написано тут в комментариях меня только запутало ((( + совсем непонятно, как делать разбор полученного от сервера ответа (((

    ОтветитьУдалить

Отправить комментарий

Популярные сообщения из этого блога

C# и API ВКонтакте. Обращение к адресу API-сервиса путем создания HTTP-запроса (POST)

В статье  C# POST. Отправляем запросы на адрес стороннего сервера  я рассказал про метод, с помощью которого можно работать с различным API, принимающими POST запрос и возвращающими ответ в виде json или xml. Сегодня я хочу написать, как я применял этот метод при работе с API  ВКонтакте. Для примера возьму задачу получения через API списка групп, в которых состоит пользователь. В первую очередь необходимо зарегистристрировать наш сайт как приложение ВКонтакте. Заходим по ссылке  http://vk.com/editapp?act=create&site=1  и подключаем наш сайт. Дальше задача  делится на две подзадачи, а именно: авторизация пользователя и обращение к API для получения списка групп. Для авторизации мы пользователю предлагаем перейти по следующей ссылке: http://api.vkontakte.ru/oauth/authorize? response_type=code&redirect_uri={0} &client_id={1} &scope={2} &display=page , redirect_uri - адрес страницы нашего сайта, куда будет возвращен пользователь после авторизации Вконтак

IIS (Internet Information Services) и applicationHost.config. Изменение доменных привязок.

Сегодня затронем тему настроек IIS (Internet Information Services). Речь пойдет о версии IIS 7.0 (7.5). Допустим у вас есть  большое количество поддоменов, которые нужно привязать к сайту или быстро исправить на уже существующих привязках IP адрес. Стандартный интерфейс IIS позволяет редактировать привязки по одной, что в нашем случае не очень-то удобно. См. картинку Чтобы ускорить процесс, нужно вспомнить, что все доменные привязки (и не только, а и другие настройки) хранятся в конфигурационном файле applicationHost.config. Данный файл находится по адресу C:\Windows\System32\inetsrv\config\ В файле отредактировать привязки можно очень быстро.