我正在开发一个需要在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;
有人知道我该做什么吗?
感谢!!!
答案 0 :(得分:3)
我不确定您是否能够获得该页面永不过期的令牌,因此我会向您解释步骤:
从下拉列表中选择您的应用
点击&#34;获取访问令牌&#34;按钮,然后选择manage_pages
权限。
复制令牌并在浏览器中运行:
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}
从步骤4复制令牌并粘贴到access_token字段并致电:
/{page-id}?fields=access_token
您现在获得的令牌是一个永不过期的令牌,您可以在Debugger中对其进行验证。在您的应用中使用此功能。
但请注意,如果您的应用是公开的,建议不要在客户端使用此令牌。
答案 1 :(得分:0)
如果您使用fb_exchange_token调用,它将为您提供一个在60天后过期的令牌。为了使其正常工作,我必须通过登录Web流程来保证我获得了最新的页面访问令牌。
https://www.facebook.com/connect/login_success.html
作为允许的重定向网址。添加代码以导航到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"));
添加代码以收听成功网址的导航:
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();
}
};
调用window.ShowDialog()弹出登录窗口,然后获取用户访问令牌。
创建一些模型来帮助您:
public class AccountsResult
{
public List<Account> data { get; set; }
}
public class Account
{
public string access_token { get; set; }
public string id { get; set; }
}
使用用户访问令牌获取页面访问令牌:
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
}