【问题标题】:How can I post to a company Facebook page from an offline app (using the C# SDK)?如何从离线应用程序(使用 C# SDK)发布到公司 Facebook 页面?
【发布时间】:2011-08-10 03:42:04
【问题描述】:

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

我正在使用此应用程序的应用程序 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 下发布的,所以现在我需要采取额外的步骤来弄清楚如何让帖子看起来来自页面本身。

【问题讨论】:

  • 很可能你必须先征得自己的 manage_pages 权限,然后你才能在页面上做一些事情。

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


【解决方案1】:

我现在已经想通了,所以我要回答我自己的问题。这种方法允许我在粉丝页面的“名称”下发布到粉丝页面,无需用户干预,仅使用 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);

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

【讨论】:

  • 按照您的示例,我没有从 acct.access_token 获得任何价值。如果我手动创建一个令牌字符串,那么我可以让 client.Post 正确执行,但我在页面上找不到该帖子。当我尝试发布完全相同的消息时,我收到一个异常,说该帖子是重复的并且不允许。我错过了这里没有提到的任何步骤吗?你遇到过这些问题吗?
  • 您是否使用了一个好的令牌开始? (在我的示例中是“fbAppOaToken”。)我建议稍微使用一下 Graph API Explorer (developers.facebook.com/tools/explorer),看看您是否拥有应有的所有权利。使用该令牌,然后发出 /xxx/accounts 调用,看看您是否真的有权管理您要发布到的页面。
猜你喜欢
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-23
  • 2019-12-26
  • 1970-01-01
相关资源
最近更新 更多