Facebook离线访问一步一步

57 java offline facebook

更新:Facebook offline_access权限已被弃用.有关更多信息,请参阅官方文档.
您将到20125月1日,此日期将禁用此设置.有关详细信息,请参阅开发人员路线图.


在facebook和谷歌上搜索了一天,以获得一个看似简单的最新和工作方式:

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

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

谢谢.

是的,我确实检查了facebook维基.

更新:任何人?

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

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

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

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

Rog*_*gus 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的誓言访问令牌从图形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);
    ?>
    
    Run Code Online (Sandbox Code Playgroud)

注意到图形api和rest api不仅返回不同的结构,还返回不同的信息 - 所以在这里,我更喜欢其余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! ?>
Run Code Online (Sandbox Code Playgroud)

并将浏览器中的用户指向: 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


Que*_*tin 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

如果他不是,您生成"登录Facebook"URL请求offline_access权限:

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

然后在模板中显示链接:

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

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

if ($user) {
    $token = $facebook->getAccessToken();
    // store token
}
Run Code Online (Sandbox Code Playgroud)

使用脱机访问令牌

要在用户未登录时使用脱机访问令牌:

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

$facebook->setAccessToken("...");
Run Code Online (Sandbox Code Playgroud)

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

$user_profile = $facebook->api('/me');
Run Code Online (Sandbox Code Playgroud)

希望有所帮助!


Jon*_*yes 6

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

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


daa*_*aku 5

您希望首先阅读身份验证指南中的" 服务器端流程"部分.基本上,从这个URL开始:

https://www.facebook.com/dialog/oauth
Run Code Online (Sandbox Code Playgroud)

将您的应用程序ID(此处提供)添加到URL,在OAuth中说明如下client_id:

https://www.facebook.com/dialog/oauth?client_id=184484190795
Run Code Online (Sandbox Code Playgroud)

添加offline_access 权限scopeOAuth用语:

https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access
Run Code Online (Sandbox Code Playgroud)

添加一个redirect_uriFacebook将在用户完成授权步骤后重定向到的位置("允许"或"不允许",查看文档以获取响应格式或只是尝试一下):

https://www.facebook.com/dialog/oauth?client_id=184484190795&scope=offline_access&redirect_uri=https%3A%2F%2Ffbrell.com%2Fecho
Run Code Online (Sandbox Code Playgroud)

如果你按照上面的链接,它将带你到一个提示,然后点击允许/不允许它将带你到一个"回声"支持请求的页面.如果单击"允许",您将获得一个code参数,您可以access_token通过从服务器向Facebook发出HTTP请求来交换参数,这样做的内容如下:

https://graph.facebook.com/oauth/access_token?client_id=184484190795&client_secret=XXX&code=YYY&redirect_uri=ZZZ
Run Code Online (Sandbox Code Playgroud)

你需要在你通过client_id,你的应用程序的秘密必须通过在作为client_secret,同样的redirect_uri,你先前使用和code你收到的响应.这将返回该用户的offline_access启用状态access_token.

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


Leo*_*d L 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;
Run Code Online (Sandbox Code Playgroud)

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

b. 不要忘记将您的 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);}
Run Code Online (Sandbox Code Playgroud)

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

FacebookXmlRestClient  client = new FacebookXmlRestClient(YOUR_API_KEY, FACEBOOK_APPLICATION_SECRET,SECRET_SESSION_KEY);
client.setIsDesktop(false); 
client.users_setStatus("YourMessage");
Run Code Online (Sandbox Code Playgroud)

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