57

更新:Facebookoffline_access权限已被弃用。更多信息请参考官方文档
您将拥有到2012 年5 月 1 日,届时此设置将被禁用。有关更多信息,请参阅开发者路线图。


在 facebook 和 google 上搜索 1 天后,寻找一种最新且可行的方法来做一些看似简单的事情:

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

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

谢谢。

是的,我确实检查了 facebook wiki。

更新:有人吗?

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

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

看似相同的问题: Getting offline_access to work with Facebook 不回答如何检索会话密钥

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

4

7 回答 7

63

使用新的 Facebook Graph API,事情变得更简单了,但文档却少了很多。这是我所做的,以便能够仅从服务器端(不是浏览器会话的一部分)加载我的墙贴(不是浏览器会话的一部分)php 脚本:

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

  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”参数,将其用于: https://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 并在结果页面的文本中复制 access_token= 的右侧,其结构为:APP_ID|HEXNUM-USER_ID|WEIRD_KEY

  4. 现在使用您刚刚获得的 ala 的 oath 访问令牌从图形 api 或经典的 rest 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(第二个)。

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

如果您想以常规方式(即以编程方式)执行此操作,这里是步骤 2+3 的自动化版本:

把它作为“facebook_access_token.php”放在你的网络服务器上:

<?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

于 2010-07-14T19:31:30.937 回答
11

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

获取离线访问令牌

首先检查用户是否登录:

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');

希望有帮助!

于 2011-05-28T16:58:20.340 回答
6

我不久前在我的博客上做了一个教程。它不需要任何插件或其他东西,它是用 PHP 完成的,我已经测试过了。我主要是为墙贴做的,但是在您进行身份验证后,您可以使用您想要的任何功能。

编辑:帖子不再存在。FB API 无论如何都会更新...

于 2009-10-03T17:56:21.340 回答
5

您想从阅读身份验证指南中的服务器端流程部分开始。基本上,从这个 URL 开始:

https://www.facebook.com/dialog/oauth

将您的应用程序 ID在此处可用)添加到 URL,在 OAuth 用语中是client_id

https://www.facebook.com/dialog/oauth?client_id=184484190795

添加offline_access 权限scope用 OAuth 的说法:

https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access

添加一个redirect_uri用户完成授权步骤后 Facebook 将重定向到的位置(“允许”或“不允许”,查看文档以了解响应格式或尝试一下):

https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access&redirect_uri=https%3A%2F%2Ffbrell.com%2Fecho

如果你点击上面的链接,它会带你到一个提示,然后点击允许/不允许它会带你到一个“回显”请求的页面。如果您单击“允许”,您将返回一个参数,您可以通过从您的服务器向 Facebook 发出 HTTP 请求来code交换一个参数,该请求类似于以下内容:access_token

https://graph.facebook.com/oauth/access_token?client_id=184484190795&client_secret=XXX&code=YYY&redirect_uri=ZZZ

您需要传入您的client_id,您的应用程序密码必须作为 传入,与您之前使用client_secret的相同redirect_uri,并且code您收到的作为响应。这将返回该用户的offline_access启用access_token

但要记住的一件事是,即使您请求offline_access您的应用程序也必须优雅地处理无效或过期的 access_tokens,因为这可能由于各种原因而发生。

于 2011-07-19T03:35:40.627 回答
3

我知道两种解决方案:Java 和 JavaScript

爪哇:一个。servlet 代码(不要忘记导入相关的 jar):

String url="http://www.facebook.com/login.php?api_key=YOUR_API_KEY&v=1.0";
url+="&fbconnect=true&return_session=true&req_perms=offline_access,status_update";
url+="&next=http://YOUR_FaceBookCallback_SERVLET"; 
response.sendRedirect(url);
return;

//您将收到提示登录 facebook 并允许扩展权限

湾。不要忘记将您的 ConnectUrl(在您的 facebook 帐户应用程序中)定义为http://YourUrlFromWhereDoYouTurnToTheServletAbove

C。使用以下代码制作另一个 servlet:YOUR_FaceBookCallback_SERVLET(见上文):

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String session = request.getParameter("session");
//from this string you can obtain your infinite session_key.In order to do this, parse this string as JSON.
//Save it in the database or in the other data storage  
response.sendRedirect(ThePlaceThatYouWant);}

d。像这样使用这个秘密 session_key:

FacebookXmlRestClient  client = new FacebookXmlRestClient(YOUR_API_KEY, FACEBOOK_APPLICATION_SECRET,SECRET_SESSION_KEY);
client.setIsDesktop(false); 
client.users_setStatus("YourMessage");

如果有人想要 JavaScript 解决方案(安全性的大漏洞),请写信给我

于 2009-09-01T17:17:45.123 回答
2

我想出了如何“检索”离线访问无限会话密钥经过大量的头发分裂,一些试验和错误以及想知道我可以花时间的所有其他生产方式......同意facebook文档可能很多更好的

1) 如果您使用的是 facebook-java-api.. 那么请查看“移动网络”的 facebook 演示站点,了解如何格式化请求离线访问的 URL
http://itsti.me/index.php

<a href="http://www.facebook.com/connect/prompt_permissions.php?api_key=YOUR_API_KEY&ext_perm=publish_stream%2Coffline_access&next=http%3A%2F%2Fmysite%2Ffacebookconnect&cancel=http%3A%2F%2Fmysite%2Fhome&display=wap"><img alt="Connect" src="http://static.ak.fbcdn.net/images/fbconnect/login-buttons/connect_light_medium_long.gif" id="fb_login_image"/></a>

2)关于如何从会话中获取离线会话密钥..诀窍是:当 facebook 在授予离线访问权限后立即将用户重定向到“下一个”网址时,您应该“再次”获得 facebook 会话..这个新会话将具有无限会话密钥。
这是移动网站的示例...您应该能够为普通网站弄清楚。auth_token 仅用于移动网站..您可能不需要它用于普通网站

FacebookJsonRestClient fbc = new FacebookJsonRestClient(MY_API_KEY, SECRET, sessionKey);
String auth_token = request.getParameter("auth_token");
System.out.println("infinite session kEY = " +   fbc.auth_getSession(auth_token));
于 2009-11-05T17:18:42.970 回答
0

对于会话访问,我必须使用 facebook php api 提供的 loginurl,因为它似乎在 auth 请求中发送了 2/3 的附加变量,包括 return_session 和 session_version。此外,新的 php5-sdk 将请求发送到 login.facebook.com 而不是https://graph.facebook.com/oauth/authorize。这是我的解决方法:

$b=new facebook(array('appId'=>APP_ID,'secret'=>SECRET))

要求认证:

$facebook->getLoginUrl(array('next'=>$redirect_uri,'req_perms'=>$scope))

记住要在 $scope 中包含 offline_access。一旦你被重定向到这个页面(在登录到 fb 并授予权限之后),你将有一个 json 格式的 $_GET['session']。

只需将其存储在您想要的任何位置(我在数据库中进行)。下次您希望对用户帐户进行操作时,只需使用以下命令:

$session = json_decode($db->query("SELECT ..."));//get session from db $this->facebook->setSession($session);

在此之后,api 发出的任何请求都将通过该用户的访问。

当前 facebook graph api 最糟糕的事情是(如果我错了,请纠正我)当前 api 在其所有文档中都忽略了会话(这似乎是旧 api 的遗留物)并且只讨论了 access_token。但是当前的 api (php5-sdk) 没有仅使用 access_token 发送实际请求的功能。如果有一个仅使用 access_token 来启动会话的功能,我不知道。

于 2011-01-29T15:23:15.393 回答