更新: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 不回答如何检索会话密钥
编辑:我仍然坚持这一点。我想没有人真的尝试过这样的批量访问...
答案 0 :(得分:63)
使用新的Facebook Graph API,事情变得更简单但文档记录更少。以下是我只能从服务器端(不是浏览器会话的一部分)php脚本加载我的墙贴的方法:
创建一个Facebook应用程序,如果您还没有可用于此项目的应用程序
http://www.facebook.com/developers/apps.php#!/developers/createapp.php
- 并设置沙盒/开发人员模式! @高级设置&gt;沙箱模式&gt;启用(仅允许应用程序的开发人员查看。)
您需要在该应用程序的开发者帐户摘要中列出的应用程序ID(APP_ID)和密钥(SECRET_KEY),而不是旧的API密钥。
在您的浏览器中加载,已作为您希望服务器端应用程序连接的帐户登录到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
从生成的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
现在使用你刚刚获得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);
?>
注意图形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
permission或scope
:
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启动会话会话,我就不知道了。