获取访问令牌到Facebook页面 - WPF

时间:2014-04-10 00:18:24

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

我正在开发一个需要在Facebook页面墙上发帖的WPF应用程序,这个没有登录窗口。 好吧,我想获取我的Facebook页面的访问令牌,这是我的代码。

        var fb = new FacebookClient();
        string token = "";
        dynamic accounts = fb.Get("/"<USER_ID>"/accounts");
        foreach (dynamic account in accounts)
        {
            if (account.id == <PAGE_ID>)
            {
                token = account.access_token;
                break;
            }
        }

但我收到错误#104。这是一个简单的错误,我需要一个访问令牌来执行此操作。 然后我使用其他代码来获取用户访问令牌

        var fb = new FacebookClient();
        dynamic result = fb.Get("oauth/access_token", new
        {
            client_id = <PAGE_ID>,
            client_secret = <APP_SECRET>,
            grant_type = "fb_exchange_token",
            fb_exchange_token = <USER_TOKEN>
        });

但我收到错误#101:

  

&#34;验证应用程序时出错。由于系统错误,无法获取应用程序信息。&#34;

有人知道我该做什么吗?

感谢!!!

2 个答案:

答案 0 :(得分:3)

我不确定您是否能够获得该页面永不过期的令牌,因此我会向您解释步骤:

  1. 打开Graph API Explorer

  2. 从下拉列表中选择您的应用

    enter image description here

  3. 点击&#34;获取访问令牌&#34;按钮,然后选择manage_pages权限。

  4. 复制令牌并在浏览器中运行:

    https://graph.facebook.com/oauth/access_token?grant_type=fb_exchange_token&client_id={app-id}&client_secret={app-secret}&fb_exchange_token={step-3-token}
    
  5. 从步骤4复制令牌并粘贴到access_token字段并致电:

    /{page-id}?fields=access_token
    
  6. 您现在获得的令牌是一个永不过期的令牌,您可以在Debugger中对其进行验证。在您的应用中使用此功能。

  7. 但请注意,如果您的应用是公开的,建议不要在客户端使用此令牌。

答案 1 :(得分:0)

如果您使用fb_exchange_token调用,它将为您提供一个在60天后过期的令牌。为了使其正常工作,我必须通过登录Web流程来保证我获得了最新的页面访问令牌。

  1. 转到Facebook App dashboard
  2. 如果您尚未添加Facebook登录产品,请点击&#34; +添加产品&#34;并选择Facebook登录
  3. 启用&#34;嵌入式浏览器控件&#34;选项并输入https://www.facebook.com/connect/login_success.html作为允许的重定向网址。
  4. 创建一个带有WebBrowser控件的窗口。
  5. 添加代码以导航到Facebook登录网址:

    string returnUrl = WebUtility.UrlEncode("https://www.facebook.com/connect/login_success.html");
    this.WebBrowser.Navigate(new Uri($"https://www.facebook.com/dialog/oauth?client_id={appId}&redirect_uri={returnUrl}&response_type=token%2Cgranted_scopes&scope=manage_pages&display=popup"));
    
  6. 添加代码以收听成功网址的导航:

    this.WebBrowser.Navigated += (sender, args) =>
    {
        if (args.Uri.AbsolutePath == "/connect/login_success.html")
        {
            if (args.Uri.Query.Contains("error"))
            {
                MessageBox.Show("Error logging in.");
            }
            else
            {
                string fragment = args.Uri.Fragment;
                var collection = HttpUtility.ParseQueryString(fragment.Substring(1));
                string token = collection["access_token"];
    
                // Save the token somewhere to give back to your code
            }
    
            this.Close();
        }
    };
    
  7. 调用window.ShowDialog()弹出登录窗口,然后获取用户访问令牌。

  8. 创建一些模型来帮助您:

    public class AccountsResult
    {
        public List<Account> data { get; set; }
    }
    
    public class Account
    {
        public string access_token { get; set; }
    
        public string id { get; set; }
    }
    
  9. 使用用户访问令牌获取页面访问令牌:

    FacebookClient userFacebookClient = new FacebookClient(userAccessToken);
    var accountsResult = await userFacebookClient.GetTaskAsync<AccountsResult>("/me/accounts");
    string pageAccessToken = accountsResult.data.FirstOrDefault(account => account.id == PageId)?.access_token;
    
    if (pageAccessToken == null)
    {
        MessageBox.Show("Could not find page under user accounts.");
    }
    else
    {
        FacebookClient pageFacebookClient = new FacebookClient(pageAccessToken);
    
        // Use pageFacebookClient here
    }