Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






Работа с facebook






Всё это понятно и скучно, так что метнемся работать с facebook API. Развлечений всем! Для начала заведем проект LessonProject.FacebookAPI. Добавим туда Json.NET и свяжем с основным проектом.

На facebook надо завести ApplicationID по адресу:

https://developers.facebook.com/apps


 

 

Создаем, получаем:

Нам интересно будет AppID и AppSecret (я его потом сброшу, так что оно будет другим).

Добавляем эти данные в Config/FacebookSetting.cs (уже знаем, как это делается):

public class FacebookSetting: ConfigurationSection

{

[ConfigurationProperty(" AppID", IsRequired = true)]

public string AppID

{

get

{

return this[" AppID" ] as string;

}

set

{

this[" AppID" ] = value;

}

}

 

[ConfigurationProperty(" AppSecret", IsRequired = true)]

public string AppSecret

{

get

{

return this[" AppSecret" ] as string;

}

set

{

this[" AppSecret" ] = value;

} } }

Общение с фейсбуком происходит так:

· Попросим пользователя авторизоваться, так мы узнаем, какие права у нас есть

· Ответом этого будет токен доступа, по нему мы будем получать информацию

· Получаем информацию про самого пользователя

Создадим интерфейс, который будет реализовывать наш FacebookSetting (чтобы была обратная совместимость) (LessonProject.FacebookAPI/IFbAppConfig.cs):

public interface IFbAppConfig

{

string AppID { get; }

 

string AppSecret { get; }

}

Добавляем в FacebookSetting (/Global/Config/FacebookSetting.cs):

public class FacebookSetting: ConfigurationSection, IFbAppConfig

Используя наш AppID, мы идем по строке типа:

https://www.facebook.com/dialog/oauth? client_id=136398216534301& redirect_uri=http%3A%2F%2Flocalhost%3A54484%2FFacebook%2FToken& scope=email

И это выглядит так:

Если мы нажимаем «Перейти к приложению» - то нас переправляют на страницу
https://localhost: 54484/Facebook/Token с параметром code, по которому мы можем получить токен (который действует некоторое время). Выполняем такой запрос:

https://graph.facebook.com/oauth/access_token? client_id=136398216534301& redirect_uri=https://localhost: 54484/Facebook/Token& client_secret=e6de78fd40596f00e225dce861b34a1a& code=AQAScKUYKGpzwijzT3Y3SHjNOd4Q5nsyrYPdJaPhX-88r-wBOuMrdimL8h82bGv3HAh7TL6oJyZ0gNgiB8BcCeH8G_Zj7h6hlft_BFbOfIJIZJB9nKW6Q4iR3a0VVImxM0QYJas3eVg4qtYNkqUcWbgXDSK2JENcuomUX38haxFUFdKXrVjL1acNZSocESsx6nfx_FyF_QlbwnUO5cwogrLp

На что получаем ответ:

access_token=AAAB8Da8ZBmR0BAMCOx5293ZArYvFu5oRkmZCrwZAbvpWZB3ZCLBeiooslyYPZBVwHjxSpe3KzJ4VLFPIxwwf0D6TIEiM5ApzU8EMoDpOxE4uAZDZD& expires=5183977

Нам нужен этот access_token, сохраняем его, и с помощью него мы запрашиваем данные по ссылке:

https://graph.facebook.com/me? access_token=AAAB8Da8ZBmR0BAImiTO9QwuUXbgHPLZBQWmAyZBUkjR2A37aVNs4vaqaFmt6h1ZBvurUpvN95EXddy5d6J1ldZA2jWTxSd3eZBHlYMzKwdxgZDZD

На что он нам отвечает:

{" id": " 708770020", " name": " Andrey Chernikov", " first_name": " Andrey", " last_name": " Chernikov", " link": " http: \/\/www.facebook.com\/chernikov1", " username": " chernikov1", " gender": " male", " email": " chernikov\u0040gmail.com", " timezone": 2, " locale": " ru_RU", " verified": true, " updated_time": " 2013-03-06T15: 01: 28+0000" }

И вот это мы приведем к классу FbUserInfo (LessonProject.FacebookAPI/FbUserInfo.cs):

[JsonObject]

public class FbUserInfo

{

[JsonProperty(" id")]

public string Id { get; set; }

 

[JsonProperty(" name")]

public string Name { get; set; }

 

[JsonProperty(" first_name")]

public string FirstName { get; set; }

 

[JsonProperty(" last_name")]

public string LastName { get; set; }

 

[JsonProperty(" link")]

public string Link { get; set; }

 

[JsonProperty(" username")]

public string UserName { get; set; }

 

[JsonProperty(" gender")]

public string Gender { get; set; }

 

[JsonProperty(" email")]

public string Email { get; set; }

 

[JsonProperty(" locale")]

public string Locale { get; set; }

 

[JsonProperty(" timezone")]

public double? Timezone { get; set; }

 

[JsonProperty(" verified")]

public bool? Verified { get; set; }

 

[JsonProperty(" updated_time")]

public DateTime? updatedTime { get; set; }

 

}

Всю описанную выше работу заключаем в FbProvider.cs (LessonProject.FacebookAPI/Provider.cs):

public class FbProvider

{

private static string AuthorizeUri = " https://graph.facebook.com/oauth/authorize? client_id={0}& redirect_uri={1}& scope=email";

private static string GetAccessTokenUri = " https://graph.facebook.com/oauth/access_token? client_id={0}& redirect_uri={1}& client_secret={2}& code={3}";

private static string GetUserInfoUri = " https://graph.facebook.com/me? access_token={0}";

 

private static string GraphUri = " https://graph.facebook.com/{0}";

 

public IFbAppConfig Config { get; set; }

 

public string AccessToken { get; set; }

 

public string Authorize(string redirectTo)

{

return string.Format(AuthorizeUri, Config.AppID, redirectTo);

}

 

public bool GetAccessToken(string code, string redirectTo)

{

var request = string.Format(GetAccessTokenUri, Config.AppID, redirectTo, Config.AppSecret, code);

WebClient webClient = new WebClient();

string response = webClient.DownloadString(request);

try

{

var pairResponse = response.Split('& ');

AccessToken = pairResponse[0].Split('=')[1];

return true;

}

catch (Exception ex)

{

return false;

}

}

 

public JObject GetUserInfo()

{

var request = string.Format(GetUserInfoUri, AccessToken);

WebClient webClient = new WebClient();

 

string response = webClient.DownloadString(request);

return JObject.Parse(response);

}

}

Где

· Authorize – это формирование ссылки для запроса прав.

· GetAccessToken – это запрос по получению временного токена.

· GetUserInfo – это запрос по получению данных пользователя.

Обратите внимание, как мы используем WebClient.DownloadString – и оп-па, мы получили нужные данные из недр интернета.

 

Едем дальше. Создадим контроллер FacebookController (/Areas/Default/Controllers/FacebookController.cs):

public class FacebookController: DefaultController

{

private FbProvider fbProvider;

 

protected override void Initialize(System.Web.Routing.RequestContext requestContext)

{

fbProvider = new FbProvider();

fbProvider.Config = Config.FacebookSetting;

base.Initialize(requestContext);

}

 

public ActionResult Index()

{

return Redirect(fbProvider.Authorize(" https://" + HostName + " /Facebook/Token"));

}

 

public ActionResult Token()

{

if (Request.Params.AllKeys.Contains(" code"))

{

var code = Request.Params[" code" ];

if (fbProvider.GetAccessToken(code, " https://" + HostName + " /Facebook/Token"))

{

var jObj = fbProvider.GetUserInfo();

var fbUserInfo = JsonConvert.DeserializeObject< FbUserInfo> (jObj.ToString());

return View(fbUserInfo);

}

 

}

return View(" CantInitialize");

}

 

}

В Initialize передаем в FbProvider AppID и AppSecret. После захода – делаем редирект на facebook с запросом прав у пользователя (окошко разрешения). Если пользователь уже нам это когда-то разрешил, чтобы не спрашивать по 100 раз, facebook нас переправит на страницу /Facebook/Token. Если код для получения токена не удалось получить – возвращаем View CantInitialize (/Areas/Default/Views/Facebook/CantInitialize.cshtml):

@{

ViewBag.Title = " CantInitialize";

Layout = " ~/Areas/Default/Views/Shared/_Layout.cshtml";

}

 

< h2> CantInitialize< /h2>

 

< h3> Ну нет - так нет< /h3>

Иначе, когда всё хорошо, то получаем наш токен (он сохраняется в fbProvider) и запрашиваем данные о пользователе. Получив – преобразовываем в объект класса FbUserInfo и выводим во View (/Areas/Default/Views/Facebook/Token.cshtml):

@model LessonProject.FacebookAPI.FbUserInfo

 

@{

ViewBag.Title = " Token";

Layout = " ~/Areas/Default/Views/Shared/_Layout.cshtml";

}

 

< h2> Данные< /h2>

< p> Вот что я про тебя знаю: < /p>

 

< dl class=" dl-horizontal" >

< dt> ID< /dt>

< dd> @Model.Id< /dd>

 

< dt> FirstName< /dt>

< dd> @Model.FirstName< /dd>

< dt> LastName< /dt>

< dd> @Model.LastName< /dd>

< dt> Link< /dt>

< dd> @Model.Link< /dd>

< /dl>

Клиентский код/Серверный код (Access-Control-Allow-Origin)

Рассмотрим еще ситуацию, когда всё это взаимодействие заключено в js-файлах, мы выполняем только ajax-запросы. Изменим код метода Token. Получаем данные пользователя не серверным кодом от facebook, а передаем во View токен (/Areas/Default/Controllers/FacebookController.cs: Token):

public ActionResult Token()

{

if (Request.Params.AllKeys.Contains(" code"))

{

var code = Request.Params[" code" ];

if (fbProvider.GetAccessToken(code, " https://" + HostName + " /Facebook/Token"))

{

 

/* var jObj = fbProvider.GetUserInfo();

var fbUserInfo = JsonConvert.DeserializeObject< FbUserInfo> (jObj.ToString());

*/

ViewBag.Token = fbProvider.AccessToken;

return View();

}

 

}

return View(" CantInitialize");

}

Изменим Token.cshtml (/Areas/Default/Views/Facebook/Token.cshtml):

@{

ViewBag.Title = " Token";

Layout = " ~/Areas/Default/Views/Shared/_Layout.cshtml";

}

@section scripts {

@Scripts.Render(" ~/Scripts/default/facebook-token.js")

}

 

@Html.Hidden(" Token", ViewBag.Token as string)

< h2> Данные< /h2>

< p> Вот что я про тебя знаю: < /p>

 

< dl class=" dl-horizontal" >

< dt> ID< /dt>

< dd id=" ID" > < /dd>

 

< dt> FirstName< /dt>

< dd id=" FirstName" > < /dd>

< dt> LastName< /dt>

< dd id=" LastName" > < /dd>

< dt> Link< /dt>

< dd id=" Link" > < /dd>

< /dl>

 

Добавляем facebook-token.js (/Scripts/default/facebook-token.js):

function FacebookToken() {

_this = this;

 

this.ajaxGetUserInfo = " https://graph.facebook.com/me? access_token=";

 

this.init = function () {

var token = $(" #Token").val();

$.ajax({

type: " GET",

dataType: 'json',

url: _this.ajaxGetUserInfo + token,

success: function (data)

{

$(" #ID").text(data.id);

$(" #FirstName").text(data.first_name);

$(" #LastName").text(data.last_name);

$(" #Link").text(data.link);

}

})

}

}

 

var facebookToken = null;

 

$().ready(function () {

facebookToken = new FacebookToken();

facebookToken.init();

});


 

Запускаем, проверяем. Всё отлично. Но обратим внимание на такой параметр в http-ответе:

Access-control-allow-origin – это параметр, который, будучи установлен, позволяет делать ajax-запросы из браузера к сайту, размещенному на другом домене.

Т.е. если мы обращаемся по $.ajax() из браузера и в ответе этого заголовка нет, то выдается ошибка:

Origin https://localhost: 8080 is not allowed by Access-Control-Allow-Origin

Для этого создадим атрибут, который будет добавлять этот заголовок, если мы захотим организовать обращение к нашему сайту с других сайтов (/Attribute/AllowCrossSiteJson.cs):

public class AllowCrossSiteJsonAttribute: ActionFilterAttribute

{

public override void OnActionExecuting(ActionExecutingContext filterContext)

{

filterContext.RequestContext.HttpContext.Response.AddHeader(" Access-Control-Allow-Origin", " *");

base.OnActionExecuting(filterContext);

}

}

Добавим использование. Напимер, метод-action OK, который всегда будет возвращать { “result”: “OK”} (/Areas/Default/Controllers/HomeController.cs):

[AllowCrossSiteJson]

public ActionResult OK()

{

return Json(new { result = " OK" }, JsonRequestBehavior.AllowGet);

}

 

На этом всё по Json и работе с facebook. Можете потренироваться и поработать с авторизацией и взаимодействием с vk api. Документация тут: https://vk.com/developers.php.


 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.