Facebook的离线访问一步一步

更新 :Facebook offline_access权限被弃用。 请参阅官方文档以获取更多信息。
您将一直持续到20125月1日 ,此时此设置将被禁用。 请参阅开发者路线图了解更多信息。


在Facebook上search1天后,谷歌search一个最新的和工作的方式来做一些看似简单的事情:

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

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

谢谢。

是的,我没有检查Facebook维基。

更新:任何人?

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

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

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

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

有了新的FacebookgraphicsAPI,事情变得简单了一些,但是文档却很less。 以下是我所做的只能从服务器端加载我的墙贴(不是浏览器会话的一部分)php脚本:

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

  2. 在您的浏览器中加载,已经login到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 : 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的查询string中的“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 : 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 : 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(其中SOURCE_ID是用户/组的facebook标识符/您正在查找的任何内容)的oath图标API或经典restapi下载:

     <?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不仅返回不同的结构,而且返回不同的信息 – 所以在这里,我更喜欢其余api(第一个)的结果,即使我喜欢能够限制新图中的字段api(第二个)。

请查看http://developers.facebook.com/docs/authentication/中的“请求扩展权限”和“在Web应用程序中对用户进行身份validation”以获取官方(稀疏)详细信息。;

如果你想这样做,例如编程,这里是步骤2 + 3的自动化版本:

把这个放在你的web服务器上作为“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 : 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 offline_access, 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 : 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

如果你想最终使用PHP,使用Facebook PHP SDK v3( 请参阅github ),它非常简单。 要logging具有offline_access权限的用户,请在生成loginURL时询问。 这是你如何做到这一点。

获取离线访问令牌

首先检查用户是否login。

 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; } } 

如果他不是,则生成“使用Facebooklogin”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 } 

使用脱机访问令牌

用户未login时要使用脱机访问令牌:

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

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

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

希望有所帮助!

不久之前,我在博客上做了一个教程。 它不需要任何插件或什么,它是在PHP中完成的,我已经testing过了。 我主要做了墙壁post,但是在你authentication之后,你可以使用任何你想要的function。

编辑:发布不再存在。 FB API无论如何都被更新…

您想通过阅读身份validation指南中的服务器端stream程部分开始。 基本上,从这个url开始:

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

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

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

以OAuth术语添加offline_access 权限或scope

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

添加一个redirect_uri ,在用户完成授权步骤(“允许”或“不允许”,查看响应格式的文档或者试用)后,Facebook将redirect到这个位置:

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

如果你按照上面的链接 ,它会带你到一个提示,然后点击允许/不允许它会带你到一个页面“回声”的请求。 如果你点击允许,你会得到一个code参数,你可以通过从你的服务器向你的服务器发送一个HTTP请求来交换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,因为这可能是由于各种原因而发生的。

我知道两个解决scheme:Java和JavaScript

Java:a。 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; 

//您将获得提示login到Facebook并允许扩展的权限

湾 不要忘了将你的ConnectUrl(在你的Facebook帐户应用程序中)定义为http:// YourUrlFromWhereDoYouTurnToTheServletAbove

C。 用下面的代码创build另一个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解决scheme(安全的大漏洞)写信给我

我想了一下,在经历了很多分手,试验和错误之后,如何“检索”离线访问无限会话密钥,并想知道我可以花费那些时间的所有其他有效的方式…同意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.nethttp://img.dovov.comfbconnect/login-buttons/connect_light_medium_long.gif" id="fb_login_image"/></a> 

2)至于如何从会话中获得离线会话密钥..诀窍是:当facebook在授予离线访问权之后将用户redirect到“下一个”url时,您应该再次获得facebook会话。将有无限的会话密钥。
这里是一个移动networking的例子…你应该能够找出一个普通的网站。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)); 

对于会话访问,我不得不使用由facebook php api提供的loginurl,因为似乎有2/3的其他variables在auth请求中发送,包括return_session和session_version。 此外新的php5-sdk将请求发送到login.facebook.com而不是https://graph.facebook.com/oauth/authorize 。 以下是我的工作方式:

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

要求authentication:

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

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

只要存储在任何你想要的(我在数据库中)。 下次您希望使用用户的帐户进行操作时,请使用以下内容:

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

在此之后,api所做的任何请求将通过此用户的访问。

关于当前的facebookgraphicsAPI的最糟糕的事情是(如果我错了,纠正我)当前的API在所有的文档中忽略会话(这似乎是从旧的api剩下的),只谈论access_token。 但是目前的api(php5-sdk)没有任何function只使用access_token来发送实际的请求。 如果有一个函数只使用access_token来启动一个会话,我不知道它。