Facebook离线访问一步一步

时间:2009-06-29 18:06:28

标签: java facebook offline

  

更新:Facebook offline_access权限已被弃用。有关详细信息,请参阅official documentation   您将拥有 2012年5月1日,此日期为此设置   禁用。有关详细信息,请参阅Developer Roadmap


在facebook上搜索了一天后,谷歌搜索了最新的工作方式来做一些看似简单的事情:

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

最好在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 不回答如何检索会话密钥

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

7 个答案:

答案 0 :(得分:63)

使用新的Facebook Graph API,事情变得更简单但文档记录更少。以下是我只能从服务器端(不是浏览器会话的一部分)php脚本加载我的墙贴的方法:

  1. 创建一个Facebook应用程序,如果您还没有可用于此项目的应用程序 http://www.facebook.com/developers/apps.php#!/developers/createapp.php - 并设置沙盒/开发人员模式! @高级设置&gt;沙箱模式&gt;启用(仅允许应用程序的开发人员查看。) 您需要在该应用程序的开发者帐户摘要中列出的应用程序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的誓言访问令牌从图形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);
    ?>
    
  5. 注意图形api和rest api不仅返回不同的结构,还返回不同的信息 - 所以在这里,我更喜欢其余api(第一个)的结果,即使我喜欢能够限制字段新的图形api(第二个)。

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

    如果你想这样做,即以编程方式,这里是步骤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

答案 1 :(得分:11)

如果你想最终想要使用PHP,使用Facebook PHP SDK v3(see on 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登录”网址,要求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');

希望有所帮助!

答案 2 :(得分:6)

我不久前在我的博客上做了一个教程。它不需要任何插件或诸如此类的东西,它是用PHP完成的,我已经测试过了。我做的主要是墙贴,但在你认证后,你可以使用你想要的任何功能。

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

答案 3 :(得分:5)

您希望首先阅读身份验证指南中的Server Side Flow部分。基本上,从这个URL开始:

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

将您的应用程序ID available here)添加到网址,在OAuth用语中为client_id

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

在OAuth用语中添加offline_access permissionscope

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

如果您按照the link above进行操作,则会显示提示,然后点击“允许/不允许”后,会转到“回显”请求的页面。如果单击“允许”,您将获得一个code参数,您可以通过从服务器向Facebook发出HTTP请求来交换access_token,这样做的内容如下: / p>

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,因为这可能由于各种原因而发生。

答案 4 :(得分:3)

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

Java: 一个。 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

℃。使用以下代码创建另一个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解决方案(安全方面的大漏洞),请写信给我

答案 5 :(得分:2)

我想出了如何在经过大量的分解,一些试验和错误之后“检索”离线访问无限会话密钥。想知道我可以花费的所有其他富有成效的方法...同意facebook文档可能会好很多

1)如果您使用的是facebook-java-api ..那么请查看facebook演示网站上的“移动网络”,了解如何格式化请求离线访问的网址
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));

答案 6 :(得分: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))

Rember在$ scope中包含offline_access。 一旦重定向到此页面(登录到fb并授予权限后),您将以json格式获得$ _GET ['session']。

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

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

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

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