![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Работа с 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://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.
|