ОБНОВЛЕНИЕ 2:
Хорошо, получилось «вроде» работать, изменив:
$loginUrl = $facebook->getLoginUrl(array( 'canvas' => 1, 'fbconnect' => 0, 'req_perms' => 'publish_stream', 'next' => 'http://'.$_SERVER['SERVER_NAME'].'/success.php', 'cancel_url' => 'http://'.$_SERVER['SERVER_NAME'].'/cancel.php' ));
к этому:
$loginUrl = $facebook->getLoginUrl(array( 'canvas' => 1, 'fbconnect' => 0, 'req_perms' => 'publish_stream', 'next' => 'http://'.$_SERVER['SERVER_NAME'].'/success.php', 'cancel_url' => 'http://'.$_SERVER['SERVER_NAME'].'/cancel.php' )); header('Location: '.$loginUrl);
т.е. я добавил header('Location: '.$loginUrl);
,
Но страница ведет себя странно. Я должен перейти на страницу, войти в систему, а затем обновить страницу, снова войти в систему, затем он попросит у меня разрешения на публикацию на странице и, в конечном итоге, опубликует ее на странице.
Почему мне нужно дважды входить в систему?
ОБНОВЛЕНИЕ 1:
У меня теперь есть следующий скрипт, который, похоже, не работает. В этом состоянии я просто пытаюсь опубликовать его на своей собственной стене, но в конце концов захочу также опубликовать на стене друзей:
<?php /** * * Copyright 2011 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ require 'facebook.php'; // Create our Application instance (replace this with your appId and secret). $facebook = new Facebook(array( 'appId' => '<appId removed for security reasons>', 'secret' => '<secret removed for security reasons>', 'cookie' => true, )); // We may or may not have this data based on a $_GET or $_COOKIE based session. // // If we get a session here, it means we found a correctly signed session using // the Application Secret only Facebook and the Application know. We dont know // if it is still valid until we make an API call using the session. A session // can become invalid if it has already expired (should not be getting the // session back in this case) or if the user logged out of Facebook. $session = $facebook->getSession(); $me = null; // Session based API call. if ($session) { try { $uid = $facebook->getUser(); $me = $facebook->api('/me'); $post = $facebook->api("/me/feed", "POST", array('message' => 'Hello! I\'m using the FB Graph API!')); } catch (FacebookApiException $e) { error_log($e); } } // login or logout url will be needed depending on current user state. if ($me) { $logoutUrl = $facebook->getLogoutUrl(); } else { $loginUrl = $facebook->getLoginUrl(array( 'canvas' => 1, 'fbconnect' => 0, 'req_perms' => 'publish_stream', 'next' => 'http://'.$_SERVER['SERVER_NAME'].'/success.php', 'cancel_url' => 'http://'.$_SERVER['SERVER_NAME'].'/cancel.php' )); } ?> <!doctype html> <html xmlns:fb="http://www.facebook.com/2008/fbml"> <head> <title>php-sdk</title> <style> body { font-family: 'Lucida Grande', Verdana, Arial, sans-serif; } h1 a { text-decoration: none; color: #3b5998; } h1 a:hover { text-decoration: underline; } </style> </head> <body> <!-- We use the JS SDK to provide a richer user experience. For more info, look here: http://github.com/facebook/connect-js --> <div id="fb-root"></div> <script> window.fbAsyncInit = function() { FB.init({ appId : '<?php echo $facebook->getAppId(); ?>', session : <?php echo json_encode($session); ?>, // don't refetch the session when PHP already has it status : true, // check login status cookie : true, // enable cookies to allow the server to access the session xfbml : true // parse XFBML }); // whenever the user logs in, we refresh the page FB.Event.subscribe('auth.login', function() { window.location.reload(); }); }; (function() { var e = document.createElement('script'); e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; e.async = true; document.getElementById('fb-root').appendChild(e); }()); </script> <h1><a href="example.php">php-sdk</a></h1> <?php if ($me): ?> <a href="<?php echo $logoutUrl; ?>"> <img src="http://img.ruphp.com/php/cxrz4k7j.gif"> </a> <?php else: ?> <div> Using JavaScript & XFBML: <fb:login-button></fb:login-button> </div> <?php endif ?> <h3>Session</h3> <?php if ($me): ?> <pre><?php print_r($session); ?></pre> <h3>You</h3> <img src="https://graph.facebook.com/<?php echo $uid; ?>/picture"> <?php echo $me['name']; ?> <h3>Your User Object</h3> <pre><?php print_r($me); ?></pre> <?php else: ?> <strong><em>You are not Connected.</em></strong> <?php endif ?> </body> </html>
Я получаю следующую ошибку:
[Wed Apr 27 22:28:16 2011] [error] [client <ip address removed for security reasons>] OAuthException: (#200) The user hasn't authorized the application to perform this action, referer: http://<ip address removed for security reasons>/index.php
ОРИГИНАЛЬНЫЙ QUESITON:
У меня есть следующий рабочий скрипт, который позволяет кому-то войти на мою страницу, используя их данные в facebook, после чего я могу захватить их access_token, чтобы я мог использовать его с графиком api:
<?php /** * * Copyright 2011 Facebook, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. You may obtain * a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations * under the License. */ require 'facebook.php'; // Create our Application instance (replace this with your appId and secret). $facebook = new Facebook(array( 'appId' => 'app id goes here', 'secret' => 'secret id goes here', 'cookie' => true, )); // We may or may not have this data based on a $_GET or $_COOKIE based session. // // If we get a session here, it means we found a correctly signed session using // the Application Secret only Facebook and the Application know. We dont know // if it is still valid until we make an API call using the session. A session // can become invalid if it has already expired (should not be getting the // session back in this case) or if the user logged out of Facebook. $session = $facebook->getSession(); $me = null; // Session based API call. if ($session) { try { $uid = $facebook->getUser(); $me = $facebook->api('/me'); } catch (FacebookApiException $e) { error_log($e); } } // login or logout url will be needed depending on current user state. if ($me) { $logoutUrl = $facebook->getLogoutUrl(); } else { $loginUrl = $facebook->getLoginUrl(); } ?> <!doctype html> <html xmlns:fb="http://www.facebook.com/2008/fbml"> <head> <title>php-sdk</title> <style> body { font-family: 'Lucida Grande', Verdana, Arial, sans-serif; } h1 a { text-decoration: none; color: #3b5998; } h1 a:hover { text-decoration: underline; } </style> </head> <body> <!-- We use the JS SDK to provide a richer user experience. For more info, look here: http://github.com/facebook/connect-js --> <div id="fb-root"></div> <script> window.fbAsyncInit = function() { FB.init({ appId : '<?php echo $facebook->getAppId(); ?>', session : <?php echo json_encode($session); ?>, // don't refetch the session when PHP already has it status : true, // check login status cookie : true, // enable cookies to allow the server to access the session xfbml : true // parse XFBML }); // whenever the user logs in, we refresh the page FB.Event.subscribe('auth.login', function() { window.location.reload(); }); }; (function() { var e = document.createElement('script'); e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js'; e.async = true; document.getElementById('fb-root').appendChild(e); }()); </script> <h1><a href="example.php">php-sdk</a></h1> <?php if ($me): ?> <a href="<?php echo $logoutUrl; ?>"> <img src="http://img.ruphp.com/php/cxrz4k7j.gif"> </a> <?php else: ?> <div> Using JavaScript & XFBML: <fb:login-button></fb:login-button> </div> <?php endif ?> <h3>Session</h3> <?php if ($me): ?> <pre><?php print_r($session); ?></pre> <h3>You</h3> <img src="https://graph.facebook.com/<?php echo $uid; ?>/picture"> <?php echo $me['name']; ?> <h3>Your User Object</h3> <pre><?php print_r($me); ?></pre> <?php else: ?> <strong><em>You are not Connected.</em></strong> <?php endif ?> </body> </html>
Как только пользователь вошел в систему, я понимаю, что могу получить список своих друзей через:
https://graph.facebook.com/me/friends?access_token=...
Я не могу понять, как использовать расширенные разрешения, поэтому мое приложение может публиковать на стенах друзей друзей Facebook.
По-видимому, я должен использовать расширенные разрешения плюс следующее:
curl -F 'access_token=...' \ -F 'message=Hello, Arjun. I like this new API.' \ https://graph.facebook.com/arjun/feed
Я не понимаю, как я должен делать это с PHP.
Обновление :
Ну, я не могу это проверить сам, так что несколько советов, что вы могли бы попробовать. Измените $loginUrl
на это:
$loginUrl = $facebook->getLoginUrl(array( 'req_perms' => 'publish_stream', 'next' => 'http://'.$_SERVER['SERVER_NAME'].'/success.php', 'cancel_url' => 'http://'.$_SERVER['SERVER_NAME'].'/cancel.php' ));
Во всем контексте верхняя часть файла должна выглядеть так:
require 'facebook.php'; $facebook = new Facebook(array( 'appId' => '<appId removed for security reasons>', 'secret' => '<secret removed for security reasons>', 'cookie' => true, )); $session = $facebook->getSession(); $me = null; if ($session) { try { $uid = $facebook->getUser(); $me = $facebook->api('/me'); $post = $facebook->api("/me/feed", "POST", array('message' => 'Hello! I\'m using the FB Graph API!')); } catch (FacebookApiException $e) { error_log($e); } } else { $loginUrl = $facebook->getLoginUrl(array( 'req_perms' => 'publish_stream', 'next' => 'http://' . $_SERVER['SERVER_NAME'] . '/success.php', 'cancel_url' => 'http://' . $_SERVER['SERVER_NAME'] . '/cancel.php' )); header('Location: ' . $loginUrl); }
Ну, сначала проверьте, есть ли у вас сеанс, поэтому вам нужно настроить SDK для Facebook, как в примере:
$facebook = new Facebook(array( 'appId' => 'app id goes here', 'secret' => 'secret id goes here', 'cookie' => true, ));
Затем вы можете проверить, зарегистрирован ли пользователь и разрешено ли ваше приложение:
if ($facebook->getSession() == null) { // not logged in or not authorized }
В if
-clause вам нужно сделать перенаправление к правильному URL-адресу для входа, чтобы получить все необходимые разрешения:
$loginUrl = $facebook->getLoginUrl(array( 'canvas' => 1, 'fbconnect' => 0, 'req_perms' => 'publish_stream', 'next' => // url where to go when you were authorized 'cancel_url' => // url to go to when user cancelled )); header('Location: '.$loginUrl);
После получения разрешений вы можете опубликовать, как указано в документации, используя
$facebook->api(/* url */, array(/* additional parameters go here */));
Документация для Facebook показывает необработанную реализацию для выполнения этой задачи, которая является скрученным вызовом, который вы вставили. Это в основном просто демонстрирует функциональность и не совсем объясняет, как выполнить задачу на выбранном вами языке.
Как указал Майкл Роуз ниже, вам нужно, во-первых, попросить расширенное разрешение на публикацию на стене пользователей. Чтобы сделать это, ваш вызов $ loginUrl должен быть чем-то вроде:
$loginUrl = $facebook->getLoginUrl(array( 'canvas' => 1, 'fbconnect' => 0, 'req_perms' => 'publish_stream', 'next' => // url where to go when you were authorized 'cancel_url' => // url to go to when user cancelled ));
Это заставит пользователя установить ваше приложение и предоставить вам доступ к расширенному разрешению publish_stream, которое требуется для публикации на стене и стенах своих друзей.
Для того, чтобы НАЧАТЬ стеновую стойку, ваш код будет похож на этот:
$facebook->api("/{$friends_fb_uid}/feed", "POST", array('message' => 'Hello! I\'m using the FB Graph API!'));
Вы должны использовать это в запросе POST или какой-либо запрос на страницу (даже если вам нужен запрос ajax) после того, как у вас есть разрешение от пользователя. FB PHP SDK должен автоматически подбирать токен доступа вашего пользователя, проверять его и делать запрос для вас.
Попробуйте перейти от
header('Location: '.$loginUrl);
в
echo '<script>top.location="'.$loginUrl.'";</script>'; die();
Я не помню, где, но я где-то читал, что вам нужно сделать перенаправление с помощью javascript. Довольно давно я это прочитал, поэтому он, возможно, изменился.