简体   繁体   English

如何从.NET发布到Facebook页面墙

[英]how to post to facebook page wall from .NET

I've created Facebook page. 我创建了Facebook页面。 I have no application secret and no access token. 我没有应用程序密钥,也没有访问令牌。

I want to post to this page from my .NET desktop application. 我想从我的.NET桌面应用程序发布到此页面。 How can I do it? 我该怎么做? Can anyone help please, where can I get access token for this? 任何人都可以帮忙,我在哪里可以获得访问令牌?

Should I create a new Facebook Application? 我应该创建一个新的Facebook应用程序吗? If yes, how can I grant permissions to this application to post on page's wall? 如果是,我如何授予此应用程序的权限以在页面墙上发布?

UPD1: I have no website. UPD1:我没有网站。 I need to post company's news from .NET desktop application to company's Facebook page. 我需要将公司的新闻从.NET桌面应用程序发布到公司的Facebook页面。 All I have is Login/Password for Facebook Page Account. 我所拥有的只是Facebook页面帐户的登录/密码。

UPD2: I've created Facebook Application. UPD2:我创建了Facebook应用程序。 With AppID/SecretKey. 使用AppID / SecretKey。 I can get access token. 我可以获得访问令牌。 But... How can I grant permissions to post to page's wall? 但是......我如何授予发布到页面墙的权限?

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

I have created a video tutorial showing how to do this at this location: 我已经创建了一个视频教程,展示了如何在这个位置执行此操作:

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

You will notice that, in my example, I am asking for both "publish_stream" and "manage_pages". 你会注意到,在我的例子中,我要求“publish_stream”和“manage_pages”。 This let's you also post on pages of which that users is an admin. 这个让你也发布用户是管理员的页面。 Here is the full code: 这是完整的代码:

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

You need to ask the user for the publish_stream permission. 您需要向用户询问publish_stream权限。 In order to do this you need to add publish_stream to the scope in the oAuth request you send to Facebook. 为此,您需要将publish_stream添加到您发送给Facebook的oAuth请求中的范围。 The easiest way to do all of this is to use the facebooksdk for .net which you can grab from codeplex. 最简单的方法是使用facebooksdk for .net,你可以从codeplex中获取。 There are some examples there of how to do this with a desktop app. 有一些如何使用桌面应用程序执行此操作的示例。

Once you ask for that permission and the user grants it you will receive an access token which you can use to post to your page's wall. 一旦您要求获得该许可并且用户授予该许可,您将收到一个访问令牌,您可以使用该令牌发布到您的页面墙上。 If you need to store this permission you can store the access token although you might need to ask for offline_access permission in your scope in order to have an access token that doesn't expire. 如果您需要存储此权限,则可以存储访问令牌,尽管您可能需要在范围中请求offline_access权限才能拥有不会过期的访问令牌。

You can use https://www.nuget.org/packages/Microsoft.Owin.Security.Facebook/ to obtain users login and permission and https://www.nuget.org/packages/Facebook.Client/ to post to feeds. 您可以使用https://www.nuget.org/packages/Microsoft.Owin.Security.Facebook/获取用户登录和权限,并使用https://www.nuget.org/packages/Facebook.Client/发布到供稿。

Below example is for ASP.NET MVC 5: 下面的示例适用于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;
        }
    }

On the callback you get user access token: 在回调中,您将获得用户访问令牌:

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;
    // ...                   
}

Which then you can use to post to user's feed or page 然后您可以使用它发布到用户的Feed或页面

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 
            }

        }
}

I posted full example over here: https://klaatuveratanecto.com/facebook-wall-feed-posting-asp-net-mvc/ 我在这里发布了完整的示例: https//klaatuveratanecto.com/facebook-wall-feed-posting-asp-net-mvc/

您需要授予权限“publish_stream”。

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

}
}

You will get information on how to create a facebook app or link your website to facebook on https://developers.facebook.com/?ref=pf . 您将获得有关如何创建Facebook应用程序或将您的网站链接到Facebook的信息, 网址为https://developers.facebook.com/?ref=pf

You will be able to download facebook sdk at http://facebooksdk.codeplex.com/ . 您可以在http://facebooksdk.codeplex.com/下载facebook sdk。 There are some good example given in the document section of the site. 网站的文档部分给出了一些很好的例子。

Possibly the easiest way to do this is via Facebook PowerShell Module, http://facebookpsmodule.codeplex.com . 可能最简单的方法是通过Facebook PowerShell Module, http://facebookpsmodule.codeplex.com This allows the same sort of operations as FacebookSDK, but via an IT-Admin scripting interface rather than a developer-oriented interface. 这允许与FacebookSDK相同的操作,但是通过IT-Admin脚本界面而不是面向开发人员的界面。

AFAIK there is still a limitation of Facebook Graph API that you will not be able to post references to other pages (eg @Microsoft) using the Facebook Graph API. AFAIK仍然存在Facebook Graph API的限制,您将无法使用Facebook Graph API发布对其他页面(例如@Microsoft)的引用。 This will apply to FacebookSDK, FacebookPSModule, and anything else built over Facebook Graph API. 这将适用于FacebookSDK,FacebookPSModule以及通过Facebook Graph API构建的任何其他内容。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM