none
Publicar en muro de facebook RRS feed

  • Pregunta

  • Buenas tardes,

    No se este sera el mejor foro para preguntar esto, pero ya que llevo un tiempo perdido me decido a preguntar.

    Cuento mi problema, estoy haciendo un pagina web que utiliza C# como lenguaje de servidor. Esta pagina web contiene productos de una tienda, y el dueño de esta tienda quiere que cada vez que un usuario entre en la pagina de un producto, este se comparta en la pagina de facebook de la tienda (no del usuario que esta viendo la pagina). Mi problema no reside en que datos pasar a facebook, si no como puedo publicar el producto en facebook. Estoy trabajando con la api de facebook para C# y lo que me está dando problemas es el access_token, que cada cierto tiempo caduca, es decir, que es variable en el tiempo. Este proceso necesito lanzarlo en el servidor web, ya que esta funcionalidad tiene logica de negocio (para no enviar el mismo producto a facebook cada 5 minutos).

    Un saludo, y gracias de antemano.

    lunes, 29 de julio de 2013 18:09

Respuestas

  • Buenas a todos!

    Al final he conseguido hacer publicaciones en facebook.

    Consideraciones que he tenido en cuenta para solucionar el problema.

    • Desactivar el modo sandbox en la app de facebook

    Pongo el código para resolver el problema

    FacebookClient fb = null;
    dynamic result = null;
    
    WebClient lObjClienteWeb = new WebClient();
    
    //se crea el cliente web, para hacer la peticion del access_token
    string lStrAccessToken = lObjClienteWeb.DownloadString("https://graph.facebook.com/oauth/access_token?%20client_id="+this.ApplicationId+"&client_secret="+this.AppSecret+"&grant_type=client_credentials&redirect_uri=https://www.facebook.com/connect/login_success.html");
    
    //se trata el resultado, para obtener unicamente el access_token (se puede meter la url en un navegado para ver el resultado devuelto)
    lStrAccessToken = lStrAccessToken.Substring(lStrAccessToken.IndexOf('=') + 1);
    
    //se instancia el cliente de facebook
    fb = new FacebookClient(lStrAccessToken);
    
    //se obtiene la informacion de la cuenta usuario en el cual queremos publicar en su muro (debe haber concecido permisos a la app de facebook)
    dynamic lObjUser = fb.Get("tecnologs.tecnologs");
    
    //creamos la publicacion y rellenamos sus datos.
    dynamic parameters = new ExpandoObject();
    parameters.message = "Mensaje de la publicacion";
    parameters.privacy = "{\"value\": \"EVERYONE\"}"; //Hay que consultar la referencia de facebook. EVERYONE = Publico
    parameters.source = "Imagen del enlace";
    parameters.link = "Direccion web del enlace";
    parameters.description = "Descripcion";
    parameters.name = "Titulo del enlace";
    parameters.caption = "Descripcion del enlace";
    
    //escribimos en el muro del usuario
    result = fb.Post(lObjUser.id+"/feed", parameters);

    Un saludo, y muchas gracias por toda la atención y la ayuda prestada!!

    • Marcado como respuesta Daniel Simal miércoles, 31 de julio de 2013 21:18
    miércoles, 31 de julio de 2013 21:15

Todas las respuestas

  • que cada cierto tiempo caduca, es decir, que es variable en el tiempo

    como es esto que caduca ? donde es que conservas el token ,es en un objeto Session

    el token es algo que obtienes de forma dinamica? porque si es algo fijo podrias configuralro en el web.config

    si es algo dinamico podrias validar si el token esta vigente o puedes usarlo y sino invocar la funcionalidad que pida otro

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 29 de julio de 2013 18:25
  • Buenas tardes Leandro,

    Justamente es eso lo que quiero hacer, como el access_token tiene una fecha de caducidad lo que quiero es volver a pedirlo de forma dinámica. Es decir, cada vez que quiera conectarme a facebook pedir el access_token y no se como hacerlo.

    En un código de ejemplo que me he bajado utiliza un control del tipo WebBrowser en una aplicación de escritorio, yo había pensado simular una este comportamiento con un WebClient, pero no he obtenido los resultados esperados.

    Gracias!!

    lunes, 29 de julio de 2013 18:38
  • cada vez que quiera conectarme a facebook pedir el access_token y no se como hacerlo.

    como obtienes la primera vez el token ? porque por lo que comentas actualmente ya tienes uno, ese como lo obtienes

    porque deberia ser de la misma forma como lo obtendrias nuevamente cuando detectas que este caduca

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    lunes, 29 de julio de 2013 19:01
  • Buenas

    La primera vez lo obtuve con la aplicación de escritorio de prueba pensando que no cambiaba e iba a ser estático.

    El problema es que no puedo seguir el mismo proceso ya que la aplicación de escritorio utiliza un WebBrowser para obtener el access_token, y no puedo instanciar este control desde el servidor web. Esta fue mi primera opción, tuve que agregar la librería de controles de escritorio (no recuerdo el nombre) pero al ejecutar las siguiente instrucción me devolvía un error de activex: WebBrowser xxxxxx = new WebBrowser()

    Aparte de parecerme una aberración el incluir un control de escritorio dentro del código que ejecuta el servidor web, decidí no seguir avanzando por este camino.

    Por si sirve de ayuda, he creado una aplicación en facebook para poder comunicarme con facebook y hacer publicaciones.

    Para hacer publicaciones en facebook se necesita: ApplicationId, ApplicationSecret, ExtendedPermissions y AccessToken

    Gracias por todo el interes Leandro.

    lunes, 29 de julio de 2013 19:38
  • La primera vez lo obtuve con la aplicación de escritorio de prueba pensando que no cambiaba e iba a ser estático.

    tienes el codigo de esta aplicacion de prueba, digo para poder analizar como es que implemento la obtencion del token

    El problema es que no puedo seguir el mismo proceso ya que la aplicación de escritorio utiliza un WebBrowser para obtener el access_token, y no puedo instanciar este control desde el servidor web.

    pero podrias suar quizas la clase WebClient o HttpWebRequest para invocar alguna url y obtener en el response el token

    no validaste la doc del framework quizas usar

    http://facebooksdk.net/

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina


    lunes, 29 de julio de 2013 19:51
  • no evaluaste usar el HttpWebRequest

    http://forums.asp.net/t/1511119.aspx/1

    en el response podrias ver de tomar la url que se genera como en el link tomar la url y estraer el token

    es al menos una idea

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    martes, 30 de julio de 2013 17:44
  • Buenas a todos!

    Al final he conseguido hacer publicaciones en facebook.

    Consideraciones que he tenido en cuenta para solucionar el problema.

    • Desactivar el modo sandbox en la app de facebook

    Pongo el código para resolver el problema

    FacebookClient fb = null;
    dynamic result = null;
    
    WebClient lObjClienteWeb = new WebClient();
    
    //se crea el cliente web, para hacer la peticion del access_token
    string lStrAccessToken = lObjClienteWeb.DownloadString("https://graph.facebook.com/oauth/access_token?%20client_id="+this.ApplicationId+"&client_secret="+this.AppSecret+"&grant_type=client_credentials&redirect_uri=https://www.facebook.com/connect/login_success.html");
    
    //se trata el resultado, para obtener unicamente el access_token (se puede meter la url en un navegado para ver el resultado devuelto)
    lStrAccessToken = lStrAccessToken.Substring(lStrAccessToken.IndexOf('=') + 1);
    
    //se instancia el cliente de facebook
    fb = new FacebookClient(lStrAccessToken);
    
    //se obtiene la informacion de la cuenta usuario en el cual queremos publicar en su muro (debe haber concecido permisos a la app de facebook)
    dynamic lObjUser = fb.Get("tecnologs.tecnologs");
    
    //creamos la publicacion y rellenamos sus datos.
    dynamic parameters = new ExpandoObject();
    parameters.message = "Mensaje de la publicacion";
    parameters.privacy = "{\"value\": \"EVERYONE\"}"; //Hay que consultar la referencia de facebook. EVERYONE = Publico
    parameters.source = "Imagen del enlace";
    parameters.link = "Direccion web del enlace";
    parameters.description = "Descripcion";
    parameters.name = "Titulo del enlace";
    parameters.caption = "Descripcion del enlace";
    
    //escribimos en el muro del usuario
    result = fb.Post(lObjUser.id+"/feed", parameters);

    Un saludo, y muchas gracias por toda la atención y la ayuda prestada!!

    • Marcado como respuesta Daniel Simal miércoles, 31 de julio de 2013 21:18
    miércoles, 31 de julio de 2013 21:15