将自定义消息发布到Facebook墙

时间:2011-05-31 10:41:27

标签: php facebook

我正在制作一个脚本,用于在访客墙上发布消息。访问者可以在表单中输入自己的消息,然后将其发送到Facebook。

的index.php:

<form name="form" method="post" action="wall.php">
<textarea name="t_update" cols="50" rows="5" id="t_update" >message</textarea><br>
<input type="submit" name="Submit" value="Post To Your facebook Account!">
</form>

这会将“t_update”发送到“wall.php”。 wall.php脚本工作正常我用静态文本测试它。但是当我尝试将“t_update”文本插入var $ APP_MSG时,它在发送到Facebook时是空的。这是完整的wall.php脚本。

wall.php:

<?php 

    /** FB APP DATA **/
    $FB_APPID   =   "Facebook app id";
    $FB_SECRET  =   "Facebook secret code";
    /** MSG DATA **/
    $APP_MSG            =   ($_POST['t_update']); // post message
    $APP_MSG_LINK_TITLE =   "Title";
    $APP_MSG_LINK       =   "www.domain.com";

    global $ch;
    $code       =   $_REQUEST["code"];
    $error      =   $_REQUEST["error"];
    $returnurl  =   "http://".$_SERVER["HTTP_HOST"].$_SERVER["SCRIPT_NAME"];


    function facebook_curl_request($url,$params=array(),$post = false){
        global $ch;
        curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt ($ch, CURLOPT_URL, $url);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 2);
        curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 20);
        curl_setopt ($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.11) Gecko/20071127 Firefox/2.0.0.11');
        curl_setopt ($ch, CURLOPT_HEADER, false); 

        if($post == true){
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
        }
        $response = curl_exec ($ch);
        $temp = json_decode($response,1);
        if(isset($temp["error"]) && is_array($temp["error"])){
            echo $temp["error"]["type"]."<br>";
            echo $temp["error"]["message"]."<br>";
            echo "--------------------------------------------";
            curl_close ($ch);
            exit;
        }
        return $response;
    }

    if(empty($code)) {
        $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" 
        . $FB_APPID . "&redirect_uri=" . urlencode($returnurl) . "&scope=publish_stream,email";
        header("Location: $dialog_url");
    }

    if(!empty($error)){
        echo $_REQUEST["error"]."<br>".$_REQUEST["error_reason"]."<br>".$_REQUEST["error_description"];
    }else{

        if(!empty($code)){
            /** CREATE TOKEN **/
            $ch         =   curl_init();

            $token_url  = "https://graph.facebook.com/oauth/access_token?"
                        . "client_id=" . $FB_APPID . "&redirect_uri=" . $returnurl
                        . "&client_secret=" . $FB_SECRET  . "&code=" . $code;

            $token  =   facebook_curl_request($token_url);
            $tarr   =   explode("&",$token);
            list($token_name,$token) = explode("=",$tarr[0]);

            /**GET USER INFO**/
            $graph_url  = "https://graph.facebook.com/me?".$token_name."=".$token;
            $user       = json_decode(facebook_curl_request($graph_url),1);
            $userid     = $user["id"];

            /* POST TO WALL **/
            $graph_url  = "https://graph.facebook.com/".$userid."/feed";
            $params = array(
                $token_name     =>  $token,
                "message"       =>  $APP_MSG,
                'name'          =>  $APP_MSG_LINK_TITLE,
                'link'          =>  $APP_MSG_LINK
            );
            $response = facebook_curl_request( $graph_url, $params, true);
            list($userid,$postid) = explode("_",$response);
            echo "<html><head></head><body>Bedankt voor het posten op facebook!</body></html>";

            curl_close ($ch);
        }
    }



?>

我已经尝试过,任何人都能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:2)

我测试了代码并确认它无效。之所以不是因为当你第一次点击wall.php时,你会被重定向到Facebook进行身份验证,然后用gET重定向回你的应用程序脚本“wall.php” - 所以你在重定向上丢失了你的POST变量。这就是它最终空洞的原因。您的其他变量仍然存在,因为它是硬编码的,无论您何时运行脚本,都会被调用。希望这是有道理的。

我刚刚开始研究应用程序,并发现使用Facebook PHP SDK更容易使用。代码也更清晰。 Dev区域有一个示例PHP文件,您可以使用该文件向您展示如何进行身份验证。

以下示例:

<?php

require_once 'facebook-php-sdk/src/facebook.php';

$APP_MSG =   ($_POST['t_update']); 

$facebook = new Facebook(array(
  'appId'  => 'APPID',
  'secret' => 'SECRET'
));

$wallArgs = array('message' => $APP_MSG);
try {
   $facebook->api('me/feed', 'post', $wallArgs);

  }
catch(Exception $e) {
    print "<pre>";
    print_r($e);
    print "</pre>";
 }

?>

答案 1 :(得分:0)

您也可以在HTML和JavaScript中执行此操作,而无需请求用户权限。首先,在HTML页面中初始化Facebook API。把它放在页面的底部,在结束体标记之前。

<div id="fb-root"></div>
<script src="https://connect.facebook.net/en_US/all.js"></script>
<script>
 FB.init({
  appId : '[your_app_id_goes_here];',
  status : true, // check login status
  cookie : true, // enable cookies to allow the server to access the session
  xfbml : true // parse XFBML
 });
</script>

不要忘记将[your_app_id_goes_here]替换为您的Facebook App ID。接下来,创建一个将在用户墙上发布的JS函数。把它放在页面的头部。

<script>
 // A function to post on the users wall
 function wallPost() {
  FB.ui(
   {
    method: 'feed',
    name: 'Go find something!',
    link: 'http://www.google.com',
    picture: 'http://www.google.com/images/logos/ps_logo2&#46;png',
    caption: 'Google',
    description: 'This was posted from a test app I created.',
    message: ''
   },
   function(response) {
    if (response && response.post_id) {
     document.getElementById('message').innerHTML = 'Thanks for sharing!';
    } else {
     document.getElementById('message').innerHTML = 'Hey, you didn\'t share!';
    }
   }
  );
 }
</script>

最后,使用您刚刚在某种链接中创建的功能。

<p id="message">
 <a href="#" onclick="wallPost();">Share Me!</a>
</p>

这个例子来自Joel Dare的书 Social App Development 。在social.joeldare.com获取。