Facebook API: как публиковать на ленте новостей, когда пользователь отключен без разрешения offline_access
Используя API-интерфейс Facebook, мне удалось опубликовать его в фиде пользователя, когда пользователь отключен только с разрешения publish_stream. Мне не нужно разрешение offline_access. Я объяснил, как я сделал это здесь: Facebook Stream Publish в автономном режиме
Я не был так успешным с публикацией на странице, пока пользователь оффлайн. Здесь мой сценарий:
Пользователь U - администратор страницы P. P разрешает и устанавливает мое приложение. U разрешает мое приложение и предоставляет мне следующие расширенные разрешения:
- publish_stream
- manage_pages
Как только пользователь отключится, если я попробую тот же метод, который я использую для публикации в пользовательском потоке (без разрешения offline_access), чтобы вместо этого публиковать на странице, я получаю "Пользователь не разрешил приложению выполнять это действие". Здесь техника:
1) выберите приложение access_token
2) используйте мое приложение access_token для публикации в P P:
POST https://graph.facebook.com/ {page_id}/feed
Если вместо пункта {page_id} на шаге 2 я использую {user_id}, он без каких-либо проблем публикует фид пользователя. Тем не менее, я хотел бы опубликовать на ленте. Можно ли сделать это? Или мне нужно разрешение пользователя offline_access для этого пользователя?
Спасибо,
Джонни
Ответы
Ответ 1
Проблема в том, что вам нужно использовать токен доступа для страницы, предоставленной через полученные предложения...
Ух... Легче сказать, что это:
Ваше приложение запросило вход в "manage_pages" - после того, как вы принимаете/предоставляете предварительную заявку, у вас есть access_token для предпраздничных приложений (offline будет просто делать expires = 0 здесь)
Итак, теперь ваше приложение имеет возможность управлять вашими страницами, но для этого нужна маркер для конкретной страницы...
Итак, если вы выпустите /me/accounts
(или /UID/accounts
) с первым токеном, вы получите список страниц, к которым приложение имеет доступ для доступа, и их соответствующие токены...
Оттуда просто возьмите маркер страницы, а затем выполните команду с этим токеном
Использование класса facebook (facebook.php
и файла сертификата)
require_once 'library/facebook.php';
$app_id = "YOURAPPID";
$app_secret = "YOURSECRET";
$facebook = new Facebook(array(
'appId' => $app_id,
'secret' => $app_secret,
'cookie' => true
));
$token = array(
'access_token' => 'THE Token from app / manage_page auth'
);
$userdata = $facebook->api('/me/accounts', 'GET', $token);
echo '<pre'>;
print_r($userdata);
echo '</pre>';
Вы должны увидеть список идентификаторов страниц и их токенов доступа...
Обычно я делаю foreach $userdata['data']
и ищу идентификатор страницы, а затем я беру маркер из этого подмассива...
Ответ 2
Полный поток - пример на четыре страницы (проще для редактирования и понимания для примера)
Итак, у конфигурации просто есть базовая информация о приложении...
Когда вы загружаете index.php
- он перенаправляется на facebook, чтобы получить авторизацию на странице.. (возможно, уже есть это.. но покрывает все базы)
Facebook затем перенаправляет обратно в redirecturl (backfromfb.php
)...
Facebook возвращает токен доступа как хэш, а не переменную get, поэтому эта страница обновляется с хешем как переменной...
Затем он загружает PageUpdate.php
, который обрабатывает петлю через токены app/admin и находит правильный для страницы, которую вы хотите отправить, в.
Затем он создает сообщение и отправляет его.
Похоже, вы понимаете большую часть этого... Так что, надеюсь, это поможет вам в этом последнем бит.
config.php
<?php
$config = array(
'appId' => 'YOUR APP ID',
'secret' => 'YOUR APP SECRET',
'cookie' => true;
);
$baseurl = 'http://yoursite.com/';
$returnpage = 'backfromfb.php';
require_once('library/facebook.php');
?>
index.php
<?php require_once('config.php'); ?>
<html><head><title>Redirecting for auth</title></head><body><script type="text/javascript">
window.location.href = 'https://www.facebook.com/dialog/oauth?client_id=<?php echo $config['appId']; ?>&redirect_uri=<?php echo $baseurl . $returnpage; ?>&scope=manage_pages&response_type=token';
</script></body></html>
backfromfb.php
<?php
require_once('config.php');
// this page just passes the access token from the hash to a GET arg...
if (!isset($_GET['access_token'])) {
?>
<html><head><title>Redirecting</title></head><body><script type="text/javascript">
accessToken = window.location.hash.substring(1);
window.location.href = '<?php echo $baseurl . $returnpage; ?>?' + accessToken;
</script></body></html>
<?php
} else {
require_once('PageUpdate.php');
} ?>
PageUpdate.php
<?php
require_once('config.php');
$pageID = "123456 WHatever you page id is";
$AppToken = array(
'access_token' => $_REQUEST['acess_token']
);
$fb = new Facebook($config);
// Load APP page access rights for user via AppToken
$pageAdmin = $fb->api('/me/accounts', 'GET', $AppToken);
// Find the page access token
foreach ($pageAdmin['data'] as $data) {
if ($data['id'] == $pageID) {
$pageToken['access_token'] = $data['access_token'];
continue;
}
}
// compile the post
$WallPost = array(
'message' => 'Test post from my app!'
); // you can also use 'picture', 'link', 'name', 'caption', 'description', 'source'....
//http://developers.facebook.com/docs/reference/api/
// post to wall
$response = $fb->api($pageID . '/feed','POST',$WallPost);
if($response) {
echo 'Success!';
echo '<pre>' . $response . '</pre>';
} else echo "failed";
?>
Ответ 3
Это мой ответ. Выше код не работает для меня. Но я сделал один для себя, это прекрасно работает. Вот код.
Код для серверной части:
<?php
@session_start();
require "fblib/facebook.php";
define('YOUR_APP_ID','');
define('YOUR_APP_SECRET','');
$facebook = new Facebook(array(
'appId' => YOUR_APP_ID,
'secret' => YOUR_APP_SECRET,
));
if($_SESSION['access_token']!='') {
$access_token = $_SESSION['access_token'];
$user_id = $_SESSION['user_id'];
} else {
$access_token = $_REQUEST['access_token'];
$_SESSION['access_token'] = $_REQUEST['access_token'];
$user_id = $_REQUEST['user_id'];
$_SESSION['user_id'] = $_REQUEST['user_id'];
}
$user_id = $_REQUEST['user_id'];
$facebook->setAccessToken($_REQUEST['access_token']);
$post = array(
'message' => 'This message is posted with access token - ' . date('Y-m-d H:i:s')
);
// and make the request
$response = $facebook->api('/me/feed', 'POST', $post);
?>
Код для клиентской стороны:
<?php
require "fblib/facebook.php";
define('YOUR_APP_ID','387647494631464');
define('YOUR_APP_SECRET','857f41bdd23c26ae132a1c75a343ddc9');
$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) {
// The access token we have is not valid
$user = null;
}
}
?>
<div id="fb-root"></div>
<script language="javascript" src="js/jquery-1.7.2.min.js"></script>
<script>
var accessToken;
var uid;
// Load the SDK Asynchronously
(function(d){
var js, id = 'facebook-jssdk', ref = d.getElementsByTagName('script')[0];
if (d.getElementById(id)) {
return;
}
js = d.createElement('script');
js.id = id;
js.async = true;
js.src = "//connect.facebook.net/en_US/all.js";
ref.parentNode.insertBefore(js, ref);
}(document));
// Init the SDK upon load
window.fbAsyncInit = function() {
FB.init({
appId : '', // App ID
channelUrl : '//'+window.location.hostname+'/channel', // Path to your Channel File
status : true, // check login status
cookie : true, // enable cookies to allow the server to access the session
xfbml : true // parse XFBML
});
// listen for and handle auth.statusChange events
FB.Event.subscribe('auth.statusChange', function(response) {
if (response.authResponse) {
// user has auth'd your app and is logged into Facebook
FB.api('/me', function(me) {
if (me.name) {
// document.getElementById('auth-displayname').innerHTML = me.name;
accessToken = response.authResponse.accessToken;
uid = response.authResponse.userID;
}
})
// document.getElementById('auth-loggedout').style.display = 'none';
// document.getElementById('auth-loggedin').style.display = 'block';
} else {
// user has not auth'd your app, or is not logged into Facebook
// document.getElementById('auth-loggedout').style.display = 'block';
// document.getElementById('auth-loggedin').style.display = 'none';
}
});
// respond to clicks on the login and logout links
document.getElementById('auth-loginlink').addEventListener('click', function() {
// FB.login();
FB.login(function(response) {
// handle the response
}, {scope: 'offline_access,publish_stream'});
});
}
function gettoken() {
// alert("User Token :"+accessToken+", User id :"+uid);
$.post('fbpost.php',{access_token:accessToken,user_id:uid},function(data) {
// alert(data);
});
}
</script>
<?php if (!$user): ?>
<a href="Javascript:void(0)" id="auth-loginlink">Login with Facebook</a>
<?php else: ?>
<a href="Javascript:void(0)" id="auth-logoutlink" onClick="FB.logout()" >Logout from Facebook</a>
<?php endif ?>
<a href="Javascript:void(0)" onclick="gettoken()" >Post Into Wall</a>
Отключите "Удалить разрешение offline_access": из настроек приложения fb apps. выбрав переключатель отключить радио.