【问题标题】:How to post to user wall only 1 time when a user allows my app?当用户允许我的应用程序时,如何仅在用户墙上发布 1 次?
【发布时间】:2012-02-11 02:09:48
【问题描述】:

目前,我的应用程序每次访问应用程序时都会发布到用户墙。我只希望在他们第一次授权应用程序时将其发布到墙上。然后每次他们之后访问它时,它只会更新新闻提要状态。

这是我当前的代码:

// 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>";
}

为了实现这一点,我需要进行哪些更改?

【问题讨论】:

  • 您能否澄清“仅更新新闻提要状态”的意思?更新提要创建一个新帖子。状态更新与墙上的任何其他帖子相同 - 仅由该用户发布,通常不包含任何链接。
  • 我的意思的例子。我有拼字游戏应用程序,但是当我使用该应用程序时,它不会发布到我的墙上,它会显示在新闻源和我的活动日志中,说我玩了拼字游戏和一个指向该应用程序的链接。
  • 我希望你不介意我稍微改变了你的代码示例的格式;我发现在格式上稍加努力会使以后阅读起来更容易。尤其是在其他人阅读您的代码的情况下。

标签: post facebook-php-sdk facebook-apps


【解决方案1】:

您有 2 种方法来实现此行为。

  1. 为您的用户使用登录页面上的Feed Dialog。这将弹出一个 Facebook 窗口,提示您的用户在他们的墙上分享一些东西。此方法要求您同时实现JavaScript SDK
  2. 利用PHP SDK 并以编程方式将提要故事发布到/me/feed 端点。 (正如您在代码示例的 try-catch 块中所做的那样)。

关于仅在用户首次访问时发布,您应该在数据库中存储一个布尔值。当您在数据库中为新用户创建新记录时,您应该包含一个名为 first_visit 之类的字段,并使用“true”值填充它。
然后,当您检测到返回用户(这意味着他已经在您的数据库中)时,您可以检查 first_visit 字段是否设置为“false”。然后您通过 PHP SDK 发布的帖子可以是条件表达式的结果,以测试 first_visit 值:

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

额外的解决方案(不需要数据库)可能与此类似:

当您如此巧妙地使用$facebook-&gt;getLoginUrl() 方法为未经授权的用户生成登录URL 时,您可以在redirect_uri 参数中添加一个临时的GET 参数。类似的东西:

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

那么您发布到用户墙的条件表达式将如下所示:

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

发完帖子后别忘了将用户重定向回原来的网址:

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 的参数。当它设置为“启用”时,一旦用户安装您的应用程序,就会自动创建一个故事。我建议将帖子留到用户墙上作为可选的用户启动操作。

【讨论】:

  • 除了新闻提要问题之外,我仍然不知道如何让我的应用在每次使用时都不会发布到用户墙上。我只想要他们授权应用程序时的初始墙帖。我不确定如何编辑我当前的代码来做到这一点??
  • @Tyler - 如果你觉得我的帖子有帮助,你应该考虑marking your question as answered
【解决方案2】:

我想通了。我创建了一个数据库来存储信息,它会检查用户 ID 是否已经存在。如果没有,那么它们将被放置在数据库中,并在他们的墙上发布一个帖子。如果它们在数据库中,则不会发生任何事情。

<?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);
}

?>

【讨论】:

  • 很高兴看到我的帖子对您​​有所帮助:/
猜你喜欢
  • 2011-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多