Facebook离线访问逐步

2021/01/17 12:11 · java ·  · 0评论

更新offline_access不建议使用Facebook权限。请参阅官方文档以获取更多信息。

您需要在
20125月1日之前停用该设置。有关更多信息,请参考开发者路线图


在Facebook和Google上进行1天的字面搜索之后,找到了一种看起来可行的最新且可行的方法:

我正在寻找逐步说明,以便为用户获取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个人在那工作?

看似相同的问题:
脱机访问使用Facebook
无法回答如何检索会话密钥

编辑:我仍然坚持。我猜没有人真正尝试过这种批量访问...

借助新的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. 现在使用您刚刚获得的誓言访问令牌从图形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(第二个)。

请在“请求扩展权限”和“在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! ?>

并将用户引导到他们的浏览器中:
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),这非常简单。要记录具有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');

希望能有所帮助!

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

编辑:帖子不再存在。FB API仍然会更新...

首先,请阅读身份验证指南中的服务器端流程”部分。基本上,从以下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

如果您单击上面的链接,将带您进入提示,然后单击“允许/不允许”,它将带您到一个“ echos”回退请求的页面。如果单击“允许”,则会code返回一个参数,您可以access_token通过从服务器向Facebook发出HTTP请求来交换一个参数,该参数可以执行以下操作:

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,因为各种原因也会发生这种情况。

我知道两种解决方案: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并允许扩展权限

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

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

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

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

经过反复梳理,反复试验,想知道我本来可以用的所有其他生产方式,我想出了如何“检索”离线访问无限会话密钥的方法……同意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在授予离线访问权后立即将用户重定向到“下一个” URL时,您应该再次“获取” 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));

对于会话访问,我不得不使用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来启动会话的功能,我不知道。

本文地址:http://java.askforanswer.com/facebooklixianfangwenzhubu.html
文章标签: ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!