脸书离线访问逐步获取脱机访问令牌使用脱机访问令牌

2022-08-31 17:16:30

更新:Facebook权限正在被弃用。有关详细信息,请参阅官方文档
2012 年 5 月 1 日之前,此设置将被禁用。有关详细信息,请参阅开发人员路线图offline_access


在Facebook和Google上搜索了1天之后,可以找到一种最新的工作方式来做一些看似简单的事情:

我正在寻找一个分步的解释,以便为Facebook应用程序的用户获取offline_access,然后使用此(会话密钥)来检索离线,而不是在浏览器朋友和个人资料数据中。

最好在 Fb Java API 中执行此操作。

谢谢。

是的,我确实检查了Facebook维基。

更新:有人吗?

这个:给了我offline_Access,但是如何检索session_key?http://www.facebook.com/authorize.php?api_key=<api-key>&v=1.0&ext_perm=offline_access

为什么Facebook不能只做简单的文档,我的意思是有600人在那里工作?

看似相同的问题:让offline_access与Facebook合作并不能回答如何检索会话密钥

编辑:我仍然坚持这一点。我想还没有人真正尝试过这样的批量访问......


答案 1

有了新的Facebook Graph API,事情变得简单了一些,但记录得却不那么好。以下是我所做的,以便能够仅从服务器端(不是浏览器会话的一部分)php脚本加载我的墙帖子:

  1. 创建一个Facebook应用程序,如果你还没有一个可用于这个项目的应用程序 - 并设置沙盒/开发人员模式!@ 高级设置 > 沙盒模式 >启用(仅允许应用程序的开发人员查看。你将需要该应用程序的开发人员帐户摘要中列出的应用程序 ID(APP_ID)和密钥 (SECRET_KEY),但不是旧的 API 密钥。http://www.facebook.com/developers/apps.php#!/developers/createapp.php

  2. 在浏览器中加载,已登录到 fb 作为您希望服务器端应用程序连接为的帐户,然后单击“允许”以获取请求的权限:https://graph.facebook.com/oauth/authorize?client_id=APP_ID&scope=offline_access,read_stream&redirect_uri=http://www.facebook.com/connect/login_success.html

  3. 从生成的 url 的查询字符串中复制“code”参数,将其用于:并在生成的页面的文本中复制 access_token= 的右侧,该文本的结构为:APP_ID|HEXNUM-USER_ID|WEIRD_KEYhttps://graph.facebook.com/oauth/access_token?client_id=APP_ID&redirect_uri=http://www.facebook.com/connect/login_success.html&client_secret=APP_SECRET&code=CODE_FROM_2

  4. 现在,使用您刚刚获得的宣誓访问令牌从图形API或经典的休息API下载(其中SOURCE_ID是您正在查找的用户/组/任何内容的facebook ID):

    <?php
    $stream = json_decode(file_get_contents("https://api.facebook.com/method/stream.get?source_ids=SOURCE_ID&access_token=ACCESS_TOKEN&format=json"));
    var_dump($stream);
    // this one gives a 500 internal server error from the http get if any of the fields are invalid, but only in php, not when loaded in a browser... weird.
    $feed = json_decode(file_get_contents("https://graph.facebook.com/SOURCE_ID/feed?fields=id,from,created_time,link,type&access_token=ACCESS_TOKEN"));
    var_dump($feed);
    ?>
    

请注意,图形 api 和 rest api 不仅返回不同的结构,还返回不同的信息 -- 所以在这里,我更喜欢来自 rest api(第一个)的结果,即使我喜欢能够限制新图形 api(第二个)中的字段。

有关官方(稀疏)详细信息,请查看“请求扩展权限”和“在 Web 应用程序中对用户进行身份验证”部分中的 http://developers.facebook.com/docs/authentication/

如果您想定期执行此操作,即以编程方式执行此操作,以下是步骤2 + 3的自动版本:

将其作为“facebook_access_token.php”放在您的Web服务器上:

<?php $token = explode('=', file_get_contents("https://graph.facebook.com/oauth/access_token?client_id=APP_ID&redirect_uri=http://$_SERVER[SERVER_NAME]$_SERVER[PHP_SELF]&client_secret=APP_SECRET&code=" . 
(get_magic_quotes_gpc() ? stripslashes($_GET['code']) : $_GET['code']))); 
echo $token[1]; 
// store this, the access token, in the db for the user as logged in on your site -- and don't abuse their trust! ?>

并在浏览器中引导用户:https://graph.facebook.com/oauth/authorize?client_id=APP_ID&scope=offline_access,read_stream&redirect_uri=http://www.example.com/facebook_access_token.php


答案 2

如果你想最终想使用PHP,用Facebook PHP SDK v3(见github),它非常简单。要记录具有该权限的人员,请在生成登录 URL 时询问该权限。这是你如何做到这一点。offline_access

获取脱机访问令牌

首先,检查用户是否已登录:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$user = $facebook->getUser();

if ($user) {
  try {
    $user_profile = $facebook->api('/me');
  } catch (FacebookApiException $e) {
    $user = null;
  }
}

如果他不是,你生成“使用Facebook登录”URL,要求许可:offline_access

if (!$user) {
    $args['scope'] = 'offline_access';
    $loginUrl = $facebook->getLoginUrl($args);
}

然后在模板中显示链接:

<?php if (!$user): ?>
    <a href="<?php echo $loginUrl ?>">Login with Facebook</a>
<?php endif ?>

然后,可以检索脱机访问令牌并将其存储。要获取它,请致电:

if ($user) {
    $token = $facebook->getAccessToken();
    // store token
}

使用脱机访问令牌

要在用户未登录时使用脱机访问令牌,请执行以下操作:

require "facebook.php";
$facebook = new Facebook(array(
    'appId'  => YOUR_APP_ID,
    'secret' => YOUR_APP_SECRET,
));

$facebook->setAccessToken("...");

现在,您可以为此用户进行 API 调用:

$user_profile = $facebook->api('/me');

希望有所帮助!