3

几天来,我一直在努力让 Facebook C# SDK 作为页面发布到我的页面。

从我的谷歌搜索中,我发现该过程应如下所示:

  1. manage_pages为我的用户帐户授权申请publish_stream(通过此 URL 完成:https ://graph.facebook.com/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URI&scope=publish_stream,manage_pages )
  2. 获取用户访问令牌
  3. 将用户访问令牌交换为长期访问令牌
  4. me/accounts使用长寿命用户访问令牌获取
  5. 从结果中获取页面访问令牌
  6. page_id/feeds使用长寿命令牌发布到端点

我可以通过图形资源管理器遵循这个过程,它可以工作。使用生成的令牌在页面上创建一个帖子。

如何使用 C# SDK 执行此操作?

我试过了:

dynamic userTokenResult = client.Get("oauth/access_token", new
{
    client_id = appid,
    client_secret = appsecret,
    grant_type = "client_credentials"
});

dynamic longLivedResult = client.Get("oauth/access_token", new
{
    client_id = appid,
    client_secret = appsecret,
    grant_type = "fb_exchange_token",
    fb_exchange_token = userTokenResult.access_token;
});

client.AccessToken = longLivedResult.access_token;

// Post the message
dynamic messagePost = new
{
    link = message.LinkUrl,
    name = message.LinkName,
    caption = message.LinkCaption,
    description = message.LinkDescription,
    message = message.Message
};

// Set the status
var postId = client.Post("pagename/feed", messagePost);

但是,我怀疑这是返回应用程序 access_token,而不是用户 access_token(它在 GET:me/accounts 处失败)。

4

2 回答 2

3

您无法从服务器端代码获取用户令牌(即使您知道登录名/密码)。您应该:

  1. 从 Graph API Explorer 复制/粘贴
  2. 从 JS SDK 客户端获取
  3. 使用 FacebookClient 中的 GetLoginUrl 函数获取登录 URL 并将用户重定向到该页面。登录完成后,facebook 将回调您的函数 - 在该函数中,您将能够获取令牌。下面是我的 MVC 项目中的 2 个函数(授权和回调)——但我想你会明白的。

     public ActionResult Authorize(Guid eventId)
     {
    
    var redirectUri = ConfigurationProvider.HostingEndpoint + this.Url.Action("AuthorizeCallback", new { eventCode = eventId });
    
    var service = new FacebookClient();
    var loginUrl = service.GetLoginUrl(new {
        client_id = ConfigurationProvider.FacebookAppId,
        client_secret = ConfigurationProvider.FacebookAppSecret,
        redirect_uri = redirectUri,
        response_type = "code",
        scope = "manage_pages, publish_actions, user_photos, publish_stream" // Add other permissions as needed
    });
    
    return new RedirectResult(loginUrl.AbsoluteUri, permanent: false);
    }
    

这会将用户重定向到 Facebook 登录页面。当用户输入凭据并按下登录时,将调用此函数(注意code参数 - 它将用于获取令牌):

public ActionResult AuthorizeCallback(string code, string eventCode)
{

    var redirectUri = ConfigurationProvider.HostingEndpoint + this.Url.Action("AuthorizeCallback", new { eventCode = eventId });

    var fb = new FacebookClient();
    dynamic result = fb.Post("oauth/access_token", new
    {
        client_id = ConfigurationProvider.FacebookAppId,
        client_secret = ConfigurationProvider.FacebookAppSecret,
        redirect_uri = redirectUri,
        code = code
    });

    var accessToken = result.access_token;

    // update the facebook client with the access token so 
    // we can make requests on behalf of the user
    fb.AccessToken = accessToken;

    // now get externded app Token
    dynamic extendedToken = fb.Get("oauth/access_token", new
    {
        client_id = ConfigurationProvider.FacebookAppId,
        client_secret = ConfigurationProvider.FacebookAppSecret,
        grant_type = "fb_exchange_token",
        fb_exchange_token = fb.AccessToken
    });


    // Get the user's information
    dynamic me = fb.Get("me");
}

之后你应该调用“ /me/accounts ”,找到你的页面并从那里获取它的令牌。

于 2013-09-17T06:40:24.877 回答
0

如果您只是想发布到您自己的页面,另一种方法是使用 Windows PowerShell 和http://facebookpsmodule.codeplex.com。这将操作减少到几行 PowerShell 脚本。

于 2013-09-17T18:22:33.230 回答