Facebook OAuthError - Невозможно опубликовать общедоступное сообщение в ленте пользователя.

Я хочу иметь возможность публиковать сообщения на стене пользователя (сообщение, которое он редактирует). Но если пользователь не разрешил публиковать сообщения от своего имени, я получаю следующую ошибку:

(# 1) Произошла ошибка при создании общего ресурса | OAuthException

Затем я прочитал, что могу снова запросить разрешение, снова отправив его на свой URL-адрес входа, но даже после разрешения там он отправляет ту же ошибку.

Код:

try{...
     $ret_obj = $facebook -> api('/' . $user_id . '/feed', 'POST', array('name' => $title, 'link' => $redirect_url, 'caption' => $ptnr_fb_caption, 'icon' => 'http://...logo-small.png', 'picture' => $ptnr_fb_img, 'message' => $desc, 'privacy' => $arrPriv));

} catch(FacebookApiException $e) {

        echo '<div id="text">Error :</div><br /><p style="width: 365px;margin: 0 auto;">Problem authenticating via Facebook, please allow us to share on your behalf.</p>';
        echo '<center><a href="https://www.facebook.com/dialog/oauth?client_id=<my_id>&redirect_uri=http://<mysite>/getFacebookData.php&display=popup&scope=email,publish_stream&type=web_server">Allow here</a><center>';

        //Send email to admin
        $subject = "ERROR Facebook";
        $body = "user email:" . $user_email . '| error:' . $e -> getMessage().'|'.$e->getType();
}

Изменить: Я обнаружил, что когда я снова разрешаю разрешения (по ссылке после получения сообщения об ошибке), только «все» / общедоступные генерируют ошибку, а только я и мои друзья - нет.

Обновление (@Axel Amthor):

$facebook = new Facebook( array('appId' => 'app_id', 'secret' => 'removed', ));

//We got after the authentication request
$access_token = $_POST['access_token'];

$facebook -> setAccessToken($access_token);
try {
    $user_info = $facebook -> api('/me');
    $user_id = $user_info['id'];
} catch (FacebookApiException $e) {
    //return 0;
}

Обновление 2: Код, связанный с областью действия:

$red_url = 'https://www.facebook.com/dialog/oauth?client_id=my_id&redirect_uri=http://mysite/facebook/getFacebookData.php&display=popup&scope=email,publish_stream&type=web_server';

Он перенаправляет на getFacebookData.php:

$access_token = '';

    $token_url = "https://graph.facebook.com/oauth/access_token?client_id=my_id&redirect_uri=http://mysite/facebook/getFacebookData.php&client_secret=secret&code=" . $_GET['code'];
    $access_token = file_get_contents($token_url);
    $access_token = substr($access_token, 13, strlen($access_token) - (13 + 16));

Он отправляет этот токен доступа на третью страницу (код в обновлении: «Обновить (@Axel Amthor):»).


person funerr    schedule 22.05.2013    source источник
comment
не могли бы вы вставить код, в который создается и инициализируется $facebook?   -  person Axel Amthor    schedule 29.05.2013
comment
@AxelAmthor Я обновил код.   -  person funerr    schedule 29.05.2013
comment
не могли бы вы убедиться, что это $user_info = $facebook -> api('/me'); работает?   -  person Axel Amthor    schedule 30.05.2013
comment
@AxelAmthor, да, он возвращает массив, заполненный правильными данными моего пользователя.   -  person funerr    schedule 30.05.2013
comment
Мне не хватает где-то параметра scope, с просьбой предоставить разрешение для publish_stream, status_update или publish_action - что вы хотите сделать? В настоящее время, я полагаю, никаких разрешений не установлено.   -  person Axel Amthor    schedule 30.05.2013
comment
Например, посмотрите на это: developers.facebook.com/docs/reference/api/note   -  person Axel Amthor    schedule 30.05.2013
comment
@AxelAmthor, смотри мое обновление.   -  person funerr    schedule 30.05.2013


Ответы (2)


Отсутствует параметр области видимости (из моего кода):

$OAuth_request = _formatOAuthReq($OAuth, "read_insights,ads_management,publish_actions,manage_pages,publish_stream,read_stream,offline_access", $state);

....

function _formatOAuthReq($OAuthParams, $scope, $state)
{
    $uri = $OAuthParams['oauth_uri'];
    $uri .= "?client_id=" . $OAuthParams['client_id'];
    $uri .= "&redirect_uri=" . $OAuthParams['redirect_uri'];
    $uri .= "&scope=" . $scope;
    $uri .= "&response_type=code";
    $uri .= "&approval_prompt=force&access_type=offline";

Чтобы опубликовать что-либо в профиле пользователя, примите во внимание следующие разрешения:

  1. создать событие
  2. create_note
  3. photo_upload
  4. publish_stream
  5. read_stream
  6. Обновление статуса
  7. video_upload
  8. Эл. адрес
  9. publish_actions

Согласно /[acctid]/feed вы собираетесь опубликовать «заметку» на стене пользователя, обозначенной [acctid]. Фактически, это пользователь, который «вошел в систему» ​​с токеном доступа, указанным в диалоговом окне OAuth. Я только что заглянул в наш код, и мы делаем это с помощью

/me/feed

и это работает как шарм. На самом деле это не вы отправляете «иностранному пользователю», а сам пользователь, размещающий ваше приложение на своей стене, предоставляя вашему приложению разрешение делать это от его / ее имени. Я знаю, это сложно.

person Axel Amthor    schedule 29.05.2013
comment
/ Me / feed устранил проблему! спасибо :) (Сделайте акцент на этом, чтобы другие пользователи сразу увидели ответ). - person funerr; 30.05.2013

Я обнаружил, что когда я снова разрешаю разрешения (по ссылке после получения сообщения об ошибке), только «все» / публика генерирует ошибку, а только я и мои друзья - нет.

Итак, вы хотите заставить пользователя публиковать публичные сообщения? Вы не должны этого делать - пусть решает пользователь!

Возможно, установите "общедоступный" в качестве конфиденциальности действий по умолчанию в настройках приложения - тогда пользователь может изменить это значение на более ограничительное значение, если ему нравится, либо непосредственно из диалогового окна входа в систему, либо позже в настройках своего профиля приложения. .

А затем вообще не указывайте параметр privacy в вызове API, чтобы значение, выбранное пользователем, применялось автоматически.

person CBroe    schedule 30.05.2013
comment
Я даю пользователю элемент выбора, где он может ВЫБРАТЬ, какую опцию вводить, когда они пытаются выбрать общедоступную опцию, это разрушает функциональность. Вдобавок я уже установил общедоступный по умолчанию. - person funerr; 30.05.2013