Intereting Posts
Пропустить и получить идентификатор от JavaScript до контроллера PHP проверить возвращаемое значение метода, который вызывает ошибку с помощью PHPUnit Как включить php-gmp в Mac OS X 10.6.6? (без macports) Как определить частичную вертикальную / горизонтальную линию в изображении? PHP – помощь с моей рекурсивной функцией на основе REGEX найти max () определенного значения многомерного массива в php подсчитывать строки в таблице со многими различными параметрами Не удалось установить Cookie в curl Request CakePHP: как сгенерировать xml-файл и сохранить его на сервере PHP Найдите первую часть почтового индекса в Великобритании, когда полный или часть может быть введена Загрузка классов с именами с автозагрузчиком Symfony 1.4? Счетчик отношений Laravel OrderBy Как установить pthreads на phpfarm php install Как преобразовать двумерный массив в одномерный массив в php5 Поместите URL-адреса из строки в массив с помощью regex (проблема с периодом ожидания)

расширенные разрешения facebook

ОБНОВЛЕНИЕ 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 &amp; 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 &amp; 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. Довольно давно я это прочитал, поэтому он, возможно, изменился.