2011-07-06 22 views
6

Hola, estoy desarrollando una aplicación en Facebook con C# sdk y quiero que el usuario que le gustara mi página solo pueda usar mi aplicación. (Al igual que woobox)Contenido solo para fans en facebook con asp.net C# sdk

he encontrado algunas soluciones en php en this link pero no hay ninguna fuente sobre .NET ¿Cómo puedo obtener la información gustado en ASP.NET

encuentro otro ejemplos en PHP en this enlace de nuevo, pero no puedo encontrar C# respuesta: \

Gracias

+0

¿Podría explicar por qué la respuesta existente no es lo que está buscando? –

+0

Porque necesita permisos, necesito un código sin obtener permiso como woobox. – Xenon

Respuesta

10

Usted consigue solicitud cuando firmó su la página web se carga dentro de la aplicación Facebook Canvas; usted debe ser capaz de analizar la solicitud algo firmado similar al siguiente:

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("\"", ""); 
} 

es necesario agregar referencia a las bibliotecas JSON con el fin de analizar firmado requestin C#, descarga de http://json.codeplex.com/

también refere a How to decode OAuth 2.0 for Canvas signed_request in C#? si está desgastando sobre la solicitud firmada.

+0

Gracias @Imran me salvó el tiempo :) – Xenon

1
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; 
      } 
     } 
    } 
} 
4

esto sólo es posible con las APIs heredadas, o con la user_likes permission. Como quiera una solución sin permisos específicos, le mostraré 2 métodos. Úselos en combinación con AJAX para actualizar la página cuando el usuario presione like.

Opción 1) API REST

Utilizando el API anterior, es posible utilizar Pages.IsFan

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

hacer esto en C# como sigue.

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); 

Opción 2) del lado del cliente

El método FBXML. Esto se hace con Javascript en el cliente, al suscribirse a un evento cuando el usuario hace clic en el botón like. Está documentado here.

¿Cómo puedo saber cuándo un usuario hace clic en el botón Me gusta?

Si está utilizando la versión XFBML del botón, puede suscribirse a el evento 'edge.create' a través de FB.Event.subscribe.

Generar un botón como FBXML here.

<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> 

luego suscribirse al evento edge.create utilizando el Javascript SDK. Coloque este código en el documento BODY preferiblemente justo antes del final.

<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> 
+0

¡buena respuesta, realmente útil! –

+0

Hola @TheCodeKing voy a probar la opción 2 pero ¿puedes decirme cómo puedes obtener uid en la opción 1? ¿Porque en este caso el usuario no dio permiso para darnos información y sin uid no puedo obtener Page.IsFan? – Xenon

+0

Hola otra vez probé la opción 2 pero funciona cuando al usuario le gusta o no le gusta una página, pero no pude obtenerla si al usuario le gustaba la página antes: \ ¿tiene alguna opinión? Gracias. – Xenon

1

Si su aplicación es una aplicación lienzo, se puede (? Debe) utilizar el parámetro signed_request para comprobar si el usuario le gusta la página está en:

# 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 

El signed_request se pasa a la página como una variable POST; como si hubiera un campo de formulario llamado signed_request y el formulario se envió en la página anterior a la suya (de hecho, esto es básicamente cómo Facebook "ejecuta" su aplicación; el formulario se envía automáticamente en lugar de esperar que un usuario lo envíe)) Entonces en ASP.neta que debe ser capaz de conseguirlo a través de la Request objeto:

Request["signed_request"] 

Este enfoque es útil si va a crear una "ficha de aplicación" de una página; puede detectar si al usuario le gustó la página sin que le otorguen permisos adicionales.

+0

Hola @chesles ¿me puedes dar alguna información acerca de decode_signed_request()? – Xenon

+0

Consulte el encabezado "verificar y decodificar" en [firm_request docs] (http://developers.facebook.com/docs/authentication/signed_request/) para obtener un resumen sobre cómo implementar esto. Hay 2 partes, una firma y una carga útil. La carga útil es solo [codificada en base64] (http://base64decode.org/), por lo que deberá descubrir cómo decodificarla en C#; No soy un chico de .Net, pero estoy seguro de que hay una biblioteca de decodificadores en algún lugar. – chesles

0

Esto se puede hacer en PHP con la ayuda de una consulta SQL

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

Aquí $ result variable se puede utilizar para separar el ventilador y el contenido no-Fan

+0

Mismo problema que no pude obtener sin obtener permiso, por lo que no funciona: \ – Xenon

+0

Ver sin crear una sesión de FB no puede acceder a ningún detalle dentro de una aplicación ... Por lo tanto, el primer paso siempre será solicitar 4 conjuntos básicos de permisos (según lo requiera su aplicación). a continuación, en los siguientes pasos puede decidir en función del uid si a esa persona le gusta su página o no ... – mjs

Cuestiones relacionadas