Как опубликовать на стене пользователя только 1 раз, когда пользователь разрешает мое приложение? - PullRequest
2 голосов
/ 11 февраля 2012

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

вот мой текущий код:

// Get User ID
$user = $facebook->getUser();

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $access_token = $facebook->getAccessToken();
    $vars = array(
      'message' => "Message goes here",
      'picture' => "image",
      'link' => "link here",
      'name' => "Name here",
      'caption' => "Caption here"
    );
    $result = $facebook->api('/me/feed', 'post', $vars);

  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

// Login or logout url will be needed depending on current user state.
if ($user) {
  $logoutUrl = $facebook->getLogoutUrl();
} else {
   $loginUrl = $facebook->getLoginUrl(array('redirect_uri'=> $app_url));
   echo "<script type='text/javascript'>";
   echo     "top.location.href = '{$loginUrl}';";
   echo "</script>";
}

Что мне нужно изменить, чтобы это произошло?

Ответы [ 2 ]

1 голос
/ 12 февраля 2012

У вас есть 2 варианта методов для достижения этого поведения.

  1. Используйте диалоговое окно Feed на целевой странице для своих пользователей. Это откроет окно Facebook, предлагающее вашим пользователям поделиться чем-то на своей стене. Этот метод требует также реализации JavaScript SDK .
  2. Использование PHP SDK и программная публикация истории фида в конечную точку /me/feed. (Как вы сделали в блоке try-catch вашего примера кода).

Что касается публикации только при первом посещении пользователя, вам следует сохранить в вашей базе данных логическое значение. Когда вы создаете новую запись для нового пользователя в вашей базе данных, вы должны включить поле с именем что-то вроде first_visit и заполнить его "истинным" значением.
Затем, когда вы обнаружите возвращающегося пользователя (это означает, что он уже находится в вашей базе данных), вы можете проверить, установлено ли в поле first_visit значение «false». Тогда ваш пост через PHP SDK может быть результатом условного выражения для проверки значения first_visit:

...
...
if ($first_visit == 'true'){
  $result = $facebook->api('/me/feed', 'post', $vars);
}

Дополнительное решение (не требующее базы данных) может выглядеть примерно так:

Когда вы так ловко сгенерируете URL для входа в систему с помощью метода $facebook->getLoginUrl() для ваших неавторизованных пользователей, вы можете добавить временный параметр GET к параметру redirect_uri. Что-то вроде:

$redirect_uri = 'https://apps.facebook.com/waffle-ville?new_user=true';

Тогда ваше условное выражение для публикации на стене пользователя будет выглядеть примерно так:

...
...
if ($_GET['new_user'] == 'true'){
  $result = $facebook->api('/me/feed', 'post', $vars);
}

Не забудьте перенаправить пользователя обратно на исходный URL после того, как вы сделали сообщение:

var app_url = "https://apps.facebook.com/waffle-ville";
echo "<script type='text/javascript'>";
echo     "top.location.href = app_url;";
echo "</script>";

Перенаправление также возможно с PHP:

$app_url = "https://apps.facebook.com/waffle-ville";
header("Location: {$app_url}");

IMO - Автоматическая публикация на стене пользователя немного раздражает. В настройках вашего приложения есть параметр, который называется Social Discovery. Если для этого параметра установлено значение «включено», история создается автоматически, как только пользователь устанавливает ваше приложение. Я рекомендую оставлять сообщения на стене пользователя как дополнительное действие, инициированное пользователем.

0 голосов
/ 12 февраля 2012

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

<?php

require 'facebook.php';
require 'dbconnect.php';

// Create our application instance
// (replace this with your appId and secret).
$app_id = "APP_ID";
$secret = "APP_SECRET";
$app_url = "APP_URL";

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

// Get User ID
$user = $facebook->getUser();

// We may or may not have this data based on whether the user is logged in.
//
// If we have a $user id here, it means we know the user is logged into
// Facebook, but we don't know if the access token is valid. An access
// token is invalid if the user logged out of Facebook.

if ($user) {
  try {
    // Proceed knowing you have a logged in user who's authenticated.
    $user_profile = $facebook->api('/me');
    $access_token = $facebook->getAccessToken();
    $name = $user_profile['name'];
    $birthday = $user_profile['birthday'];

  } catch (FacebookApiException $e) {
    error_log($e);
    $user = null;
  }
}

// Login or logout url will be needed depending on current user state.
if ($user) {
  $logoutUrl = $facebook->getLogoutUrl();
} else {
   $loginUrl = $facebook->getLoginUrl(array('redirect_uri'=> $app_url));
   echo "<script type='text/javascript'>top.location.href = '$loginUrl';</script>";
}

//DO NOT EDIT BELOW
$db=mysql_connect($hostname, $dbuser, $pass);
mysql_select_db($database, $db);
//check if user has already signed up before
    $insert = true;
        $result = mysql_query("SELECT * FROM table_name") or die(mysql_error());

        while($row = mysql_fetch_array($result)){
            //if user id exists, do not insert
            if(( $row['UID'] == $user)){
                $insert = false;
            }
        }

    // if new user, insert user details in your mysql table
    if($insert){
    mysql_query("INSERT INTO table_name (UID, username, userbirthday) VALUES ('$user','$name','$birthday') ") or die(mysql_error());

    $access_token = $facebook->getAccessToken();
    $vars = array(
            'message' => "message goes here",
            'picture' => "image",
            'link' => "Link here",
            'name' => "Name here",
            'caption' => "Caption here",
);
        $result = $facebook->api('/me/feed', 'post', $vars);
}

?>
...