2012-02-11 16 views
2

現在、私のアプリは、アプリにアクセスするたびにユーザの壁に投稿します。私は彼らが最初にアプリを認可するときに一度だけ壁に投稿したい。後でアクセスするたびに、ニュースフィードのステータスのみが更新されます。ここユーザーが自分のアプリを許可してから1回だけユーザーの壁に投稿するには?

は私の現在のコードです:

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

私はそれが起こるようにするために変更する必要がありますか?

+0

「ニュースフィードのステータスのみを更新する」ということを明確にすることはできますか?フィードを更新すると**新しい投稿が作成されます。ステータスの更新は、壁にある他の投稿と同じです。そのユーザーのみが、通常はリンクを含んでいません。 – Lix

+0

私が意味するものの例。私は引っかくアプリを持っているが、私はアプリを使用する場合、それは私の壁に投稿していない、それがニュースフィードに、私は引っかくとアプリへのリンクを果たしたと言って自分のアクティビティログに表示されます。 –

+1

コードサンプルの書式を少し変更しても構わないと思いますが、書式設定に少しずつ努力すれば、後で読みやすくなります。特にあなたのコードを読んでいる他の人の場合。脇 – Lix

答えて

0

私はそれを考え出しました。私は情報を格納するデータベースを作成し、ユーザー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); 
} 

?> 
+0

:/ – Lix

1

この動作を達成する方法は2つあります。

  1. ユーザーのランディングページにFeed Dialogを使用します。これによりFacebookのウィンドウがポップアップし、壁に何かを共有するようユーザーに促します。この方法では、JavaScript SDKも実装する必要があります。
  2. PHP SDKを利用し、エンドポイント/me/feedにフィードストーリーをプログラムで投稿します。 (コードサンプルのtry-catchブロックで行ったように)。

最初の訪問時に投稿するのは、データベースにブール値を格納する必要があります。データベース内の新しいユーザーの新しいレコードを作成するときは、first_visitのようなフィールドを含め、それに "true"の値を設定する必要があります。
その後、返信したユーザー(彼が既にデータベースに入っていることを意味する)を検出すると、first_visitフィールドが "false"に設定されていることを確認できます。

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

追加ソリューション(データベースを必要としないが)これに似たものが考えられます:次にPHP SDKを経由してあなたのポストは、条件式の結果がfirst_visit値をテストすることができ

承認されていないユーザーに対して$facebook->getLoginUrl()メソッドを使用してログインURLを巧みに生成する場合、パラメータを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でも可能です


IMO - ユーザーの壁に自動的に投稿するのはちょっと迷惑です。アプリケーション設定には、Social Discoveryと呼ばれるパラメータがあります。これを「有効」に設定すると、ユーザーがアプリケーションをインストールするとすぐにストーリーが自動的に作成されます。オプションのユーザー開始アクションとして、ユーザーの壁に投稿を残すことをお勧めします。

+0

ニュースフィードの問題、私はまだユーザー壁に、彼らはそれを使用するたびに投稿することなく、私のアプリを取得する方法がわかりません。彼らがアプリを承認するとき、私は最初の壁のポストだけが欲しい。私はそれを行うために私の現在のコードを編集する方法がわからないのですか? –

+0

助けてくれてありがとう! –

+0

@Tyler - あなたは私のポストが役に立ったと評価していた場合、あなたは[答えとしてあなたの質問をマーク]を検討すべきである(http://meta.stackexchange.com/questions/5234/)私のポストを支援することをお会いできて感激 – Lix

関連する問題