Pull to refresh

Работа с Facebook API из приложений UWP

Reading time 4 min
Views 12K

Люди, как правило, существа очень забывчивые. Для того чтобы не заставлять пользователей запоминать новый пароль при регистрации в вашем приложении UWP, можно использовать аккаунты сторонних платформ. При этом, можно не заставляя заполнять длиннющие анкеты получить доступ к какой-либо полезной информации и характеристикам пользователя. О том, что публикация контента в социальных сетях повышает конверсию даже и упоминать не буду, это и так понятно. Если хотите разобраться, как работать с самой пока что популярной сетью в мире из C#/XAML приложений UWP, не куря мануалы, то добро пожаловать под кат.

Создание связи приложения Facebook с приложением UWP


Для того, чтобы приложение UWP могло работать с Facevook API нужно создать приложение Facebook. Это делается через портал https://developers.facebook.com/apps/ нажатием кнопки "+ Добавьте новое приложение"



Заполняем поля названия приложения и контактного адреса, а также классифицируем приложение, выбрав категорию.



Далее нам необходима функция входа через facebook



Выстраиваем переключатели таким образом, чтобы как минимум клиентская авторизация OAuth, веб-авторизация OAuth и авторизация OAuth, встроенная в браузер были включены



и выбираем платформу, нажав на platform settings



Получаем окошко:



в котором выбираем Приложение для Windows

Теперь можно сделать какие-то настройки, но они не критичные. Зато впоследствии понадобится идентификатор приложения facebook.



То, что нам действительно нужно заполнить, находится немного ниже:



Значение идентификатора безопасности магазина Windows (SID) можно получить разными способами.
Более простой способ это из кода с помощью:

WebAuthenticationBroker.GetCurrentApplicationCallbackUri().ToString();

Эта строка вернет нам ms-app://SID (ms-app:// необходимо будет удалить)

Второй способ требует, чтобы приложение было связано с Store. В таком случае можно зайти в панель управления, далее в App management приложения и выбрать App identity. Значение PackageSID это и есть то, что нужно.



Работа с Facebook API с помощью Windows SDK for Facebook


Используем библиотеку от Microsoft с труднопроизносимым сокращенным названием winsdkfb. Полное название выговорить гораздо проще — Windows SDK for Facebook. Это самый удобный способ использовать API фейсбука из приложений UWP. Скачать и установить ее можно с NuGet

В C# код страницы XAML добавим пространство имен

using winsdkfb;

Код аутентификации такой:

     string[] requested_permissions = {"public_profile", "email", "user_friends"};

     FBSession session = FBSession.ActiveSession;
     session.WinAppId = WebAuthenticationBroker.GetCurrentApplicationCallbackUri().ToString();
     session.FBAppId = "229583744102151";

     FBPermissions permissions = new FBPermissions(requested_permissions);
     FBResult result = await session.LoginAsync(permissions);
     if (result.Succeeded)
     {
        // здесь мы можем что-то полезное сделать
     }
     else
     {
	// не получилось получить доступ к аккаунту facebook
     }

Первая строка задает разрешения, доступ к которым получит приложение. В примере упомянуто 3 разрешения, на которые facebook не запрашивает дополнительных подтверждений пользователя.
Полный список находится по ссылке Справка по разрешениям: «Вход через Facebook»
Два параметра, которые необходимо задать для подключения, это уже упомянутый SID и идентификатор созданного приложения facebook.

В результате получим следующее встроенное окно:



Зная как войти, нужно знать, как выйти. Это можно сделать с помощью подобного кода:

     FBSession sess = FBSession.ActiveSession;
     await sess.LogoutAsync();

Простые данные пользователя можно получить из объекта session.User

     string username = session.User.Name; // имя пользователя
     string locale = session.User.Locale; // локаль пользователя

Что можно сделать полезное? Например, можно добавить в свое приложение возможность размещения в ленту сообщения с результатом/рекордом игры или приглашением присоединиться

     PropertySet parameters = new PropertySet();
     parameters.Add("title", "Угадай MP3");
     parameters.Add("link", "https://www.microsoft.com/ru-ru/store/p/Угадай-mp3/9wzdncrdkwgv");
     parameters.Add("description", "Прикольная игра а-ля угадай мелодию для компании");
     parameters.Add("message", "Попробуй тоже эту прикольную игру");
 
     string path = "/" + session.User.Id + "/feed";

     var factory = new FBJsonClassFactory(s =>
     {
         return JsonConvert.DeserializeObject<FBReturnObject>(s);
     });

     var singleValue = new FBSingleValue(path, parameters, factory);
     var fbresult = await singleValue.PostAsync();
     if (fbresult.Succeeded)
     {
         var response = fbresult.Object as FBReturnObject;
     }
     else
     {
         // Попытка запостить оказалась неудачной
     }

Данный сниппет выполняется в случае, если if (result.Succeeded) возвращает true (то есть после успешной аутентификации). Он использует популярный парсер JSON под названием NewtonSoft.JSON, который нужно установить из NuGet.

Кроме того, необходимо чтобы в проекте присутствовал следующий класс, который характеризует результат совершения операции:

     public class FBReturnObject
     {
         public string Id { get; set; }
         public string Post_Id { get; set; }
     }

Есть вариант разместить сообщение в ленте, при этом отобразив диалоговое окно, в котором пользователь сможет добавить комментарий. Код немного проще:

     PropertySet parameters = new PropertySet();
     parameters.Add("title", "ТесТ");
     parameters.Add("link", "https://www.microsoft.com/ru-RU/store/p/take-a-test/9wzdncrdkwgx");
     parameters.Add("description", "Нескучная программа для проведения тестирований");
     parameters.Add("message", "Я прошел тест с отличным результатом");
         
     FBResult fbresult = await session.ShowFeedDialogAsync(parameters);
     if (fbresult.Succeeded)
     {
         var response = fbresult.Object as FBReturnObject;
     }
     else
     {
         // Попытка запостить оказалась неудачной
     }

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

     PropertySet parameters = new PropertySet();
     parameters.Add("link", "http://www.habrahabr.ru");
     FBResult fbresult = await session.ShowSendDialogAsync(parameters);

Примеры приложений, использующих winsdkfb, находятся на GitHub, но для C# пока что пример только один и то не особо понятный.

Более-менее нормальная документация находится по ссылке
В частности кроме уже рассмотренных способов взаимодействия с fb рассматриваются следующие возможности: загрузка фото/видео, отправка приглашения друзьям (только для игр), лайк какого-либо объекта или ссылки.
Tags:
Hubs:
+15
Comments 0
Comments Leave a comment

Articles