如何从离线应用程序(使用C#SDK)发布到公司Facebook页面?

时间:2011-07-01 18:18:59

标签: facebook-graph-api facebook-c#-sdk

我正在尝试使用Facebook C#SDK将帖子发布到公司页面的墙上。 我需要从批处理作业执行此操作,因此这不是任何特定用户正在与之交互的Web应用程序。 我在自己的Facebook ID下设置了一个Facebook应用程序,我已经在我的帐户下授予了publish_stream,share_item,offline_access和manage_pages权限。 (我可以验证这些权限是否已在我的Facebook设置页面下授予应用程序。)我试图发布的公司页面是我自己创建的页面,因此我应该可以完全访问它。 / p>

我使用此应用程序的应用程序ID和密码对Facebook进行身份验证,获取访问令牌,将邮件放在一起发布,然后尝试发布。我得到以下异常:

Facebook.FacebookOAuthException was unhandled by user code
Message=(OAuthException) (#200) The user hasn't authorized the application to perform this action

我在主题上尝试了一些变化,但我似乎无法弄清楚我做错了什么。 这是我的一些代码:

        var client = new FacebookClient("APP ID", "SECRET");
        _log.DebugFormat("access token={0}", client.AccessToken);
        dynamic parameters = new ExpandoObject();
        parameters.message = "testing 123";
        /* fill in other parameters */
        dynamic result = client.Post(FanPageId+"/feed", parameters);
        /* here's where I get the exception */

我见过从/ me / accounts返回的数据中提取特定于页面的访问令牌的引用,但我无法弄清楚如何通过Facebook身份验证的离线应用程序来实现这一点,而不是作为Facebook用户。

更新:我已经通过使用这段代码连接到Facebook获得了部分路径:

        var client = new FacebookClient("NON-EXPIRING OAUTH TOKEN");

...“非过期的oauth令牌”是Facebook上针对相关应用的开发者应用中显示的那个。

这仍然是在我自己的ID下发布的,所以现在我需要额外的步骤来弄清楚如何让帖子看起来来自页面本身。

1 个答案:

答案 0 :(得分:0)

我现在已经想到了,所以我要回答我自己的问题。这种方法允许我在粉丝页面的“名称”下发布粉丝页面,无需用户干预,仅使用Facebook.dll(不需要Facebook.Web.dll)。

// init with a non-expiring access token for an app that can manage the fan page
var client = new FacebookClient(fbAppOaToken);

// get accounts, using a Facebook ID for a user who has admin rights to the fan pge
dynamic accts = client.Get(string.Format("/{0}/accounts", fbAppAdminUser));

// find the access token for the fan page
string page_access_token = null;
foreach (var acct in accts.data)
{
    if (acct.id == fbFanPageId)
    {
        page_access_token = acct.access_token;
        break;
    }
}

// fill in parameters for the message to post
dynamic parameters = new ExpandoObject();
parameters.message = "testing 123";

// and include the access token as retrieved above
parameters.access_token = page_access_token;

dynamic result = client.Post(fbFanPageId + "/feed", parameters);

如果有人有更快或更简单的方法,请告诉我。我真的只是偶然发现了这一点,直到我把足够的拼图拼凑起来才能让它发挥作用。感谢。