Только для фанатов в Facebook с asp.net C # sdk - PullRequest
6 голосов
/ 06 июля 2011

Привет, я занимаюсь разработкой приложения на Facebook с помощью c # sdk и хочу, чтобы пользователь, которому понравилась моя страница, мог использовать только мое приложение. (Как woobox )

Я нашел некоторые решения в php в этой ссылке , но нет источника о .net, как я могу получить понравившуюся информацию в ASP.NET

Я нахожу другие примеры в php в этой ссылке снова, но я не могу найти c # answer: \

Спасибо

Ответы [ 5 ]

10 голосов
/ 13 сентября 2011

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

if (Request.Params["signed_request"] != null)
{
    string payload = Request.Params["signed_request"].Split('.')[1];
    var encoding = new UTF8Encoding();
    var decodedJson = payload.Replace("=", string.Empty).Replace('-', '+').Replace('_', '/');
    var base64JsonArray = Convert.FromBase64String(decodedJson.PadRight(decodedJson.Length + (4 - decodedJson.Length % 4) % 4, '='));
    var json = encoding.GetString(base64JsonArray);
    var o = JObject.Parse(json);
    var lPid = Convert.ToString(o.SelectToken("page.id")).Replace("\"", "");
    var lLiked = Convert.ToString(o.SelectToken("page.liked")).Replace("\"", "");
    var lUserId= Convert.ToString(o.SelectToken("user_id")).Replace("\"", "");
}

Вам необходимо добавить ссылку на библиотеки json для анализа подписанного запроса в C #, загрузить с http://json.codeplex.com/

Такжеобратитесь к Как декодировать OAuth 2.0 для Canvas Sign_Request в C #? , если вы беспокоитесь о подписанном запросе.

4 голосов
/ 10 сентября 2011

Это возможно только с устаревшими API или с разрешением user_likes . Как вы хотите решение без конкретных разрешений, я покажу вам 2 метода. Используйте их в сочетании с AJAX для обновления страницы, когда пользователь нажимает like.

Вариант 1) REST API

Используя устаревший API, можно использовать Pages.IsFan

https://api.facebook.com/method/pages.isFan?
page_id=...&
uid=...&
access_token=...

Сделайте это в C # следующим образом.

var appID = "....";
var appSecret = "....";
var uid = "....";
var pageId = "....";

WebClient client = new WebClient();
var appAuthUri = string.Concat("https://graph.facebook.com/oauth/access_token?",
                            "client_id=", appID,
                            "&client_secret=", appSecret,
                            "&grant_type=", "client_credentials"
                            );
var response = client.DownloadString(appAuthUri);
var access_token = response.Split('=')[1];

var isFanUri = string.Concat("https://api.facebook.com/method/pages.isFan?",
                            "format=", "json",
                            "&page_id=", pageId,
                            "&uid=", uid,
                            "&access_token=", access_token
                            );
response = client.DownloadString(isFanUri);
bool isFan;
bool.TryParse(response, out isFan);

Вариант 2) Клиентская сторона

Метод FBXML. Это делается с помощью Javascript на клиенте путем подписки на событие, когда пользователь нажимает кнопку like. Это задокументировано здесь .

Как узнать, когда пользователь нажимает кнопку «Мне нравится»?

Если вы используете версию кнопки в формате XFBML, вы можете подписаться на событие 'edge.create' через FB.Event.subscribe.

Создать кнопку, похожую на FBXML здесь .

<div id="fb-root"></div>
<script>(function(d){
  var js, id = 'facebook-jssdk'; if (d.getElementById(id)) {return;}
  js = d.createElement('script'); js.id = id; js.async = true;
  js.src = "//connect.facebook.net/en_US/all.js#appId=132240610207590&xfbml=1";
  d.getElementsByTagName('head')[0].appendChild(js);
}(document));</script>
<div class="fb-like" data-href="http://www.thecodeking.co.uk" data-send="true" data-width="450" data-show-faces="false"></div>

Затем подпишитесь на событие edge.create, используя Javascript SDK . Поместите этот код в документ BODY предпочтительно непосредственно перед концом.

<script type="text/javascript">
<!--
    window.fbAsyncInit = function () {
        FB.init({ appId: '245693305442004', status: true, cookie: true, xfbml: true });
        FB.Event.subscribe('edge.create',
            function (href, widget) {
                // Do something here
                alert('User just liked '+href);

            });
            (function () {
                var e = document.createElement('script'); e.async = true;
                e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
                document.getElementById('fb-root').appendChild(e);
            } ());
    };
//-->
</script>
1 голос
/ 11 сентября 2011

Если ваше приложение является приложением Canvas, вы можете (должны?) Использовать параметр signature_request , чтобы проверить, нравится ли пользователю страница, на которой он находится:

# pseudocode
signed_request = decode_signed_request()
if signed_request['page']['liked']:
  # user liked page, do something cool
else:
  # user doesn't like page. redirect somewhere to tell them why they should

signed_request передается на вашу страницу как переменная POST; точно так же, как если бы существовало поле формы с именем signed_request, и форма была отправлена ​​на предыдущей странице (на самом деле это то, как Facebook «запускает» ваше приложение; форма автоматически отправляется вместо того, чтобы ждать, пока пользователь представить его). Таким образом, в ASP.net вы сможете получить его через объект Request:

Request["signed_request"]

Этот подход полезен, если вы создаете «приложение с вкладками» для страницы; вы можете определить, понравилась ли эта страница пользователю, не предоставив вам дополнительных прав доступа.

1 голос
/ 07 июля 2011
this.canvasAuthorizer = new CanvasAuthorizer {
    Permissions = new[] { "user_about_me", "publish_stream", "offline_access", "user_likes", "friends_about_me" }
};

this.canvasAuthorizer.Authorize();

if (FacebookWebContext.Current.IsAuthorized())
{
    this.facebookWebClient = new FacebookWebClient(FacebookWebContext.Current);

    string requested_Data = HttpContext.Current.Request.Form["signed_request"];
    dynamic decodedSignedRequest = FacebookSignedRequest.Parse(this.facebookApplication, requested_Data);

    if (decodedSignedRequest.Data.page != null)
    {
        // Funs Page
        this.IsLike = decodedSignedRequest.Data.page.liked;
    }
    else
    {
        // Application Page
        dynamic likes = this.facebookWebClient.Get("/me/likes");
        foreach (dynamic like in likes.data)
        {
            if (like.id == this.FacebookFanPageID)
            {
                this.IsLike = true;
            }
        }
    }
}
0 голосов
/ 13 сентября 2011

Это можно сделать в PHP с помощью SQL-запроса

`$result = $facebook->api(array(  "method"    => "fql.query",
                                  "query"     => "SELECT uid FROM page_fan WHERE uid=$uid AND page_id=$page_id"
                               ));

Здесь переменная $ result может использоваться для разделения содержимого Fan и Non-Fan

...