как опубликовать в фейсбуке страницу стены из .NET - PullRequest
6 голосов
/ 05 сентября 2011

Я создал страницу в Facebook.У меня нет ни секрета приложения, ни токена доступа.

Я хочу опубликовать эту страницу из своего настольного приложения .NET.Как мне это сделать?Может кто-нибудь помочь, пожалуйста, где я могу получить токен доступа для этого?

Должен ли я создать новое приложение Facebook?Если да, как я могу предоставить разрешения для этого приложения для публикации на стене страницы?

UPD1: у меня нет веб-сайта.Мне нужно опубликовать новости компании из настольного приложения .NET на странице компании в Facebook.Все, что у меня есть, это логин / пароль для учетной записи страницы Facebook.

UPD2: я создал приложение Facebook.С AppID / SecretKey.Я могу получить токен доступа.Но ... Как я могу предоставить разрешения для публикации на стене страницы?

(OAuthException) (#200) The user hasn't authorized the application to perform this action

Ответы [ 7 ]

5 голосов
/ 15 октября 2012

Я создал видеоурок, показывающий, как это сделать в этом месте:

http://www.markhagan.me/Samples/Grant-Access-And-Post-As-Facebook-User-ASPNet

Вы заметите, что в моем примере я запрашиваю "publish_stream" и "manage_pages". Это позволяет вам также публиковать на страницах, пользователями которых является администратор. Вот полный код:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

using Facebook;

namespace FBO
{
    public partial class facebooksync : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            CheckAuthorization();
        }

        private void CheckAuthorization()
        {
            string app_id = "374961455917802";
            string app_secret = "9153b340ee604f7917fd57c7ab08b3fa";
            string scope = "publish_stream,manage_pages";

            if (Request["code"] == null)
            {
                Response.Redirect(string.Format(
                    "https://graph.facebook.com/oauth/authorize?client_id={0}&redirect_uri={1}&scope={2}",
                    app_id, Request.Url.AbsoluteUri, scope));
            }
            else
            {
                Dictionary<string, string> tokens = new Dictionary<string, string>();

                string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&scope={2}&code={3}&client_secret={4}",
                    app_id, Request.Url.AbsoluteUri, scope, Request["code"].ToString(), app_secret);

                HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;

                using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
                {
                    StreamReader reader = new StreamReader(response.GetResponseStream());

                    string vals = reader.ReadToEnd();

                    foreach (string token in vals.Split('&'))
                    {
                        //meh.aspx?token1=steve&token2=jake&...
                        tokens.Add(token.Substring(0, token.IndexOf("=")),
                            token.Substring(token.IndexOf("=") + 1, token.Length - token.IndexOf("=") - 1));
                    }
                }

                string access_token = tokens["access_token"];

                var client = new FacebookClient(access_token);

                client.Post("/me/feed", new { message = "markhagan.me video tutorial" });
            }
        }
    }
}
2 голосов
/ 04 декабря 2011

Вам необходимо запросить у пользователя разрешение publish_stream. Для этого вам необходимо добавить publish_stream в область действия запроса oAuth, который вы отправляете в Facebook. Самый простой способ сделать все это - использовать facebooksdk для .net, который вы можете получить из codeplex. Есть несколько примеров того, как это сделать с помощью настольного приложения.

Как только вы запросите это разрешение и пользователь предоставит его, вы получите токен доступа, который вы можете использовать для публикации на стене своей страницы. Если вам нужно сохранить это разрешение, вы можете сохранить токен доступа, хотя вам может потребоваться запросить разрешение offline_access в вашей области действия, чтобы получить маркер доступа, срок действия которого не истекает.

1 голос
/ 08 декабря 2016

Вы можете использовать https://www.nuget.org/packages/Microsoft.Owin.Security.Facebook/ для получения логина и разрешения пользователей и https://www.nuget.org/packages/Facebook.Client/ размещать в фидах.

Ниже приведен пример для ASP.NET MVC 5:

public void ConfigureAuth(IAppBuilder app)
        {
            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

            // Facebook 
            var facebookOptions = new FacebookAuthenticationOptions
            {
                AppId = "{get_it_from_dev_console}",
                AppSecret = "{get_it_from_dev_console}",
                BackchannelHttpHandler = new FacebookBackChannelHandler(),
                UserInformationEndpoint = "https://graph.facebook.com/v2.4/me?fields=id,name,email,first_name,last_name,location",
                Provider = new FacebookAuthenticationProvider
                {
                    OnAuthenticated = context =>
                    {
                        context.Identity.AddClaim(new Claim("FacebookAccessToken", context.AccessToken)); // user acces token needed for posting on the wall 
                        return Task.FromResult(true);
                    }
                }
            };
            facebookOptions.Scope.Add("email");
            facebookOptions.Scope.Add("publish_actions"); // permission needed for posting on the wall 
            facebookOptions.Scope.Add("publish_pages"); // permission needed for posting on the page
            app.UseFacebookAuthentication(facebookOptions);

            AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
        }
    }

На обратный вызов вы получаете токен доступа пользователя:

public ActionResult callback()
{
    // Here we skip all the error handling and null checking
    var auth = HttpContext.GetOwinContext().Authentication;
    var loginInfo = auth.GetExternalLoginInfo();
    var identityInfo = auth.GetExternalIdentity(DefaultAuthenticationTypes.ExternalCookie);

    var email = loginInfo.Email // klaatuveratanecto@gmail.com
    var name = loginInfo.ExternalIdentity.Name  // Klaatu Verata Necto
    var provider = loginInfo.Login.LoginProvider // Facebook | Google

    var fb_access_token = loginInfo.identityInfo.FindFirstValue("FacebookAccessToken");
    // Save this token to database, for the purpose of this example we will save it to Session.
    Session['fb_access_token'] = fb_access_token;
    // ...                   
}

Который затем вы можете использовать для публикации в фиде пользователя или на странице

public class postcontroller : basecontroller
{                      
        public ActionResult wall()
        {
            var client = new FacebookClient( Session['fb_access_token'] as string);
            var args = new Dictionary<string, object>();
            args["message"] = "Klaatu Verata N......(caugh, caugh)";

            try
            {
                client.Post("/me/feed", args); // post to users wall (feed)
                client.Post("/{page-id}/feed", args); // post to page feed
            }
            catch (Exception ex)
            {
                // Log if anything goes wrong 
            }

        }
}

Я разместил полный пример здесь: https://klaatuveratanecto.com/facebook-wall-feed-posting-asp-net-mvc/

1 голос
/ 09 сентября 2011

Вам необходимо предоставить разрешение "publish_stream".

0 голосов
/ 28 сентября 2016
public void PostImageOnPage()
{
string filename=string.Empty;
if(ModelState.IsValid)
{
//-------- save image in image/
if (System.Web.HttpContext.Current.Request.Files.Count > 0)
{
var file = System.Web.HttpContext.Current.Request.Files[0];
// fetching image                    
filename = Path.GetFileName(file.FileName);
filename = DateTime.Now.ToString("yyyyMMdd") + "_" + filename;
file.SaveAs(Server.MapPath("~/images/Advertisement/") + filename);
}
}
string Picture_Path = Server.MapPath("~/Images/" + "image3.jpg");
string message = "my message";
try
{
string PageAccessToken = "EAACEdEose0cBAAoWM3X";

// ————————create the FacebookClient object
FacebookClient facebookClient = new FacebookClient(PageAccessToken);

// ————————set the parameters
dynamic parameters = new ExpandoObject();
parameters.message = message;
parameters.Subject = "";
parameters.source = new FacebookMediaObject
{
ContentType = "image/jpeg",
FileName = Path.GetFileName(Picture_Path)
}.SetValue(System.IO.File.ReadAllBytes(Picture_Path));
// facebookClient.Post("/" + PageID + "/photos", parameters);// working for notification on user page
facebookClient.Post("me/photos", parameters);// woring using bingoapp access token not page in(image album) Post the image/picture to User wall   
}
catch (Exception ex)
{

}
}
0 голосов
/ 06 сентября 2011

Возможно, самый простой способ сделать это - через Facebook PowerShell Module, http://facebookpsmodule.codeplex.com. Это позволяет выполнять те же операции, что и FacebookSDK, но через интерфейс сценариев IT-Admin, а не ориентированный на разработчиков интерфейс.

AFAIK Все еще существует ограничение API Graph Facebook, из-за которого вы не сможете публиковать ссылки на другие страницы (например, @Microsoft) с помощью API Graph Facebook.Это будет применяться к FacebookSDK, FacebookPSModule и всем остальным, построенным на Facebook Graph API.

0 голосов
/ 05 сентября 2011

Вы получите информацию о том, как создать приложение для Facebook или связать свой сайт с Facebook на https://developers.facebook.com/?ref=pf.

Вы сможете скачать Facebook SDK по адресу http://facebooksdk.codeplex.com/. В разделе документов сайта приведен хороший пример.

...