Facebook:获取用户管理的页面列表
Posted
技术标签:
【中文标题】Facebook:获取用户管理的页面列表【英文标题】:Facebook: get list of pages that a user is admin of 【发布时间】:2011-02-27 07:18:04 【问题描述】:我正在使用图形 api。
我有一个已登录的用户,并且想要获取该用户作为管理员的所有页面的页面 ID 列表。
有没有办法做到这一点?文档非常糟糕 - 并且是循环的。
【问题讨论】:
10 年后,文档仍然很糟糕。 bad 是一种严重的轻描淡写。盖克。 【参考方案1】:你也可以使用“pages_show_list”权限,如果你只想要用户是管理员的 facebook 页面列表。
“manage_pages”权限将询问用户管理他的页面的权限,这可能会太侵入性,具体取决于您的需要。
【讨论】:
【参考方案2】:使用带有 javascript 的新 GRAPH API v3 使用“tasks”字段而不是“perms”字段。
//Example JS Call
FB.api('/me/accounts?fields=name,picture.type(square),access_token,tasks', function(response) console.log(response));
//Example Response
"name": "Engage",
"picture":
"data":
"height": 50,
"is_silhouette": false,
"url": "https://scontent.xx.fbcdn.net/v/t1.0-1/c1.0.50.50a/p50x50/430597_259746387431503_2144341304_n.jpg?_nc_cat=103&_nc_eui2=AeGVrU8Wxe7k5BMvRXOEAcUo9dMIxyeMP9POPkYDwfgdRl8QquAtz1GcwXpJaK4z_0o&_nc_ht=scontent.xx&oh=e5b952a4adbbcd1b1af6b71b688f7284&oe=5CF9A64C",
"width": 50
,
"access_token": "XXXXXXXXXX",
"id": "253263371413138",
"tasks": [
"ANALYZE",
"ADVERTISE",
"MODERATE",
"CREATE_CONTENT",
"MANAGE"
]
不要在数组中查找“ADMINISTER”,而是查找“MANAGE”。
完整信息在这里:https://developers.facebook.com/docs/pages/access-tokens
【讨论】:
【参考方案3】:<head>
<link rel="stylesheet" href="@Url.Content("~/Content/jquery.remodal.css")">
</head>
<body>
<script type="text/javascript" src="@Url.Content("~/Scripts/Home/jquery.remodal.js")"></script>
<div class="remodal" id="page-selector-remodal" data-remodal-id="pageselector">
<p>Please select a facebook page Share </p>
<div id="page-name-container">
<select id="page-name" class="form-control">
</select>
</div>
<a class="remodal-confirm" id="facebookPageSelectSubmit" href="#">OK</a>
<a class="remodal-cancel" id="remodal-cancel" href="#">CANCEL</a>
</div>
<div data-remodal-id="modal-status">
<p id="modal-status-content">
The Account you have selected does not have Email.
</p>
<br>
<a class="remodal-confirm" href="#">OK</a>
</div>
<script type="text/javascript>
(function (d, s, id)
var js, fjs = d.getElementsByTagName(s)[0];
if (d.getElementById(id)) return;
js = d.createElement(s);
js.id = id;
js.src = "//connect.facebook.net/en_US/sdk.js";
fjs.parentNode.insertBefore(js, fjs);
(document, 'script', 'facebook-jssdk'));
window.fbAsyncInit = function ()
FB.init(
appId: 'YOUR APP ID',
cookie: true, // enable cookies to allow the server to access
// the session
xfbml: true, // parse social plugins on this page
version: 'v2.2' // use version 2.1
);
;
var pageSelector = $('[data-remodal-id=pageselector]').remodal();
var modalstatus = $('[data-remodal-id=modal-status]').remodal();
function statusChangeCallback(response)
if (response.status === 'connected')
// Logged into your app and Facebook.
//testAPI();
else if (response.status === 'not_authorized')
// The person is logged into Facebook, but not your app.
$("#modal-status-content").empty().html(response.status);
modalstatus.open();
else
$("#modal-status-content").empty().html(response.status);
modalstatus.open();
// The person is not logged into Facebook, so we're not sure if
// they are logged into this app or not.
document.getElementById('status').innerHTML = 'Please log ' +
'into Facebook.';
function FacebookHandler()
FB.login(function (result)
if (result != null && result.authResponse != null && result.authResponse != undefined)
facebookPageData = result;
FB.api('/me/accounts', function (accountsResult)
if (accountsResult != null && accountsResult.data.length != 0)
//open the remodal here
pageSelector.open();
facebookAccountsData = accountsResult;
var data = accountsResult['data'];
if (data != null)
for (var i = 0; i < data.length; i++)
$("#page-name").append('<option value="' + data[i].id + '">' + data[i].name + '</option>');
unblockUI('body');
$("#flip-container, #feature-container, #branding-container, #intro-arrow-container, #share-container, #copyright-text-container").hide();
$("body").css("padding-right", "0");
else
$("#modal-status-content").empty().html("The Account you have selected does not have any facebook page,<br />Post to Wall.");
modalstatus.open();
pageSelector.open();
unblockUI('body');
);
else
$("#modal-status-content").empty().html("Unable to retrieve your details from facebook, try again after sometime.");
modalstatus.open();
unblockUI('body');
, scope: 'manage_pages, publish_stream' );
$("#facebookPageSelectSubmit").on("click", function ()
var facebookpageId = $("#page-name option:selected").val();
if (facebookpageId != null)
FB.api('/' + facebookpageId, function (identity)
if (identity != null)
FB.api('/' + facebookpageId, fields: 'access_token' , function (resp)
if (resp.access_token != null)
//Get the "resp"(Data) here
else
);
else
);
else
);
</script>
//Finally call the "FacebookHandler()" function on click
</body>
【讨论】:
您的代码中似乎使用了一些框架,您介意解释一下吗? 在我看来,仅仅发布代码并不是一个好的答案。【参考方案4】:使用 Graph API 很简单。步骤:
-
从用户那里获得
manage_pages
权限(扩展权限)。
调用图形 API - https://graph.facebook.com/me/accounts
你可以测试这个过程in the graph explorer -> 只需点击'Get Access Token'按钮->在'Extended permission'下勾选'manage_pages'并提交.它将为您提供 admin-page-details JSON。
【讨论】:
切换答案,因为这听起来像是更标准/更稳定的方式。虽然我会警告不要使用“简单”这个词:一旦你知道怎么做,一切都很简单:) 是的。你是对的。但是一个问题可以有多种解决方案。我们需要从中选择最简单的。 如果您使用的是 FB php SDK,那就更简单了:只需 $user_admin_pages = $facebok->api('/me/accounts'); 使用 FQL 查询与使用图形请求相比的优势在于,图形总是强制返回的数据被“分页”(它只返回前几个结果,以及指向后面几个结果的链接) - 在 FQL 中,它总是一次性返回整个结果集。 谢谢。仅当当前用户管理应用程序时,它才会列出页面。有没有办法列出另一个人的页面?【参考方案5】:权限
$facebook->getLoginUrl( array( "scope" => "manage_pages" ) );
动作
$accounts = $facebook->api('/me/accounts');
return $accounts;
【讨论】:
【参考方案6】:我用一些 FQL 解决了它:
FB.api(method: 'fql.multiquery',
access_token: <access_token>,
queries:
query1: 'select page_id from page_admin where uid = ' + <uid>,
query2: 'select page_id, name, page_url from page where page_id in (select page_id from #query1)'
, function(queries)
var pages = queries[1].fql_result_set;
【讨论】:
截至 2014 年 8 月:“FQL 和 REST API 在 v2.1 中不再可用:之前在 v2.0 中宣布,应用程序必须从 v2.1 开始迁移到版本化的 Graph API 调用。” .换句话说,FQL 不能再使用了。【参考方案7】:您在登录时请求 JavaScript SDK 的许可
FB.login(function(), perms:'manage_pages');
然后,一旦他们登录,您就可以按如下方式检索页面(和应用程序):
FB.api('/me/accounts', function(response)
console.log(response);
)
【讨论】:
perms: 'manage_pages'
和scope: 'manage_pages'
有什么区别?【参考方案8】:
去这个地址
https://developers.facebook.com/tools/explorer/431294226918345/?method=GET&path=me%2Faccounts%3Ftype%3Dpage`
只需点击获取访问令牌并转到扩展权限
选中 manage_pages 复选框
并点击获取访问令牌
然后在FQL下写这个
me/accounts?type=page
点击提交。你会得到所有登录用户 admin 的页面列表
【讨论】:
你在哪里发现me/accounts
支持type
查询参数?【参考方案9】:
请注意,您的解决方案返回页面以及应用程序。如果您严格需要 Pages,您可以使用带有“类型不等于”子句的 FQL Multiquery,如下所示:
"query1":"select page_id from page_admin where uid = me()",
"query2":"select page_id, name, page_url, type from page where type!='APPLICATION' AND page_id in (select page_id from #query1)"
【讨论】:
【参考方案10】:如果您不想使用 FQL,可以致电 FB.api(/me/accounts)
。
'accounts' 是用户对象的一个连接。请参阅此@http://developers.facebook.com/docs/reference/api/user的文档
当然,对于 Facebook,总有一个问题。现在这个方法不仅会返回用户是管理员的页面,还会返回他们安装的应用程序。我几乎可以肯定这不是预期的行为 - 我似乎记得几个月前使用过它并且只得到一个页面列表。该文档也没有提及此列表中的应用程序。
这是一个很容易解决的问题 - Facebook 返回列表中每个项目的名称、类别和 ID,并且每个应用程序都有一个“应用程序”类别。我只是确保我只列出类别不是“应用程序”的项目。
【讨论】:
截至 2012 年 12 月,“帐户”文档声明它将返回用户拥有的页面和应用程序。 有没有办法列出另一个人的页面 @SoorajlalKG 不,您没有权限这样做。以上是关于Facebook:获取用户管理的页面列表的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Facebook 移动应用程序在 Flutter 应用程序中将链接(或图像)与用户管理的 Facebook 页面共享
如何获得对特定 Facebook 页面或应用程序的管理页面权限?