【问题标题】:Post custom message to facebook wall将自定义消息发布到 Facebook 墙上
【发布时间】:2011-09-05 09:25:47
【问题描述】:

我正在编写用于在访客墙上发布消息的脚本。访问者可以在表单中输入自己的消息,然后将其发送到 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);
        }
    }



?>

我已经尝试了一切,谁能指出我正确的方向???

【问题讨论】:

标签: php facebook


【解决方案1】:

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

我刚开始开发一个应用程序,发现使用 Facebook PHP SDK 更容易使用。代码也更干净。开发区有一个示例 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>";
 }

?>

【讨论】:

  • 谢谢卡尔,这很有意义。我将看一下 Facebook PHP SDK。感谢您为我指明正确的方向!
【解决方案2】:

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

<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 应用 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>

这个例子来自我的书Social App Development,作者是 Joel Dare。获取它在social.joeldare.com

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-21
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-29
    • 2012-04-27
    相关资源
    最近更新 更多