【问题标题】:Posting an Event to Page Wall with PHP使用 PHP 将事件发布到页面墙
【发布时间】:2012-01-05 13:20:28
【问题描述】:

两周以来,我一直在头撞墙,仔细研究网络,研究 stackoverflow,反复测试,但未能将脚本组合在一起以将事件发布到粉丝页面。我终于得到了一个有效地创建事件的脚本,但它没有出现在页面上。

在 DMCS 将我指向 PAGE 访问令牌后,我开始着手生成它们。现在,问题是事件出现在我的个人墙上,而不是我要定位的页面墙上。谁能看到我错过了什么?

这是最新编辑后的脚本:

    <?php
    $app_id = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    $app_secret = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
    $my_url = "http://xxxxxxxxxxxxxxxxxxxxxx.com/testfiles/fbeventform.php";

//Going to get the PAGE access code
//First to get USER Access Code
   session_start();
   $code = $_REQUEST["code"];

   if(empty($code)) {
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
     $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
       . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
       . $_SESSION['state'] . "&scope=create_event&scope=manage_pages";

     echo("<script> top.location.href='" . $dialog_url . "'</script>");
   }

   if($_REQUEST['state'] == $_SESSION['state']) {
     $token_url = "https://graph.facebook.com/oauth/access_token?"
       . "client_id=" . $app_id . "&redirect_uri=" . urlencode($my_url)
       . "&client_secret=" . $app_secret . "&code=" . $code;

     $access_token = @file_get_contents($token_url);
     $params = null;
     parse_str($access_token, $params);

     $graph_url = "https://graph.facebook.com/me?access_token=" 
       . $params['access_token'];

     $user = json_decode(file_get_contents($graph_url));
     echo("Hello " . $user->name);
   }
   else {
     echo("The state does not match. You may be a victim of CSRF.");
   }

    echo '<hr />' . $access_token;

//Now, getting the PAGE Access token, using the user access token

    $page_token_url = "https://graph.facebook.com/" .  $page_id . "?fields=access_token&" . $access_token;
  $response = file_get_contents($page_token_url);

// Parse the return value and get the Page access token
  $resp_obj = json_decode($response,true);

  $page_access_token = $resp_obj['access_token'];

    echo '<hr />' . $page_access_token;

//Post the event--here's the form function

if( !empty($_POST) && (empty($_POST['name']) || empty($_POST['start_time']) || empty($_POST['end_time'])) ) {
    $msg = "Please check your inputs!";
} elseif(!empty($_POST)) {
    $url = "https://graph.facebook.com/" . $page_id . "/events?" . $access_token;
    $params = array();
    // Prepare Event fields
    foreach($_POST as $key=>$value)
        if(strlen($value))
            $params[$key] = $value;

    // Check if we have an image
    if( isset($_FILES) && !empty($_FILES['picture']['name']) ) {
        $uploaddir = './upload/';
        $uploadfile = $uploaddir . basename($_FILES['picture']['name']);
        if (move_uploaded_file($_FILES['picture']['tmp_name'], $uploadfile)) {
            $params['picture'] = "@" . realpath($uploadfile);
        }
    }  

    // Start the Graph API call
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL,$url);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    $result = curl_exec($ch);
    $decoded = json_decode($result, true);
    curl_close($ch);
    if(is_array($decoded) && isset($decoded['id'])) {
        // Event created successfully, now we can
        // a) save event id to DB AND/OR
        // b) show success message AND/OR
        // c) optionally, delete image from our server (if any)
        $msg = "Event created successfully: {$decoded['id']}";
    }
}
?>
    <form enctype="multipart/form-data" action="" method="post">
        <p><label for="name">Event Name</label><input type="text" name="name" value="a" /></p>
        <p><label for="description">Event Description</label><textarea name="description"></textarea></p>
        <p><label for="location">Location</label><input type="text" name="location" value="" /></p>
        <p><label for="">Start Time</label><input type="text" name="start_time" value="<?php echo date('Y-m-d H:i:s'); ?>" /></p>
        <p><label for="end_time">End Time</label><input type="text" name="end_time" value="<?php echo date('Y-m-d H:i:s', mktime(0, 0, 0, date("m")  , date("d")+1, date("Y"))); ?>" /></p>
        <p><label for="picture">Event Picture</label><input type="file" name="picture" /></p>
        <p>
            <label for="privacy_type">Privacy</label>
            <input type="radio" name="privacy_type" value="OPEN" checked='checked'/>Open&nbsp;&nbsp;&nbsp;
            <input type="radio" name="privacy_type" value="CLOSED" />Closed&nbsp;&nbsp;&nbsp;
            <input type="radio" name="privacy_type" value="SECRET" />Secret&nbsp;&nbsp;&nbsp;
        </p>
        <p><input type="submit" value="Create Event" /></p>
    </form>
    </body>
    </html>

这有效地创建了事件,但它没有出现在我定位的页面墙上。我真的在这件事上束手无策......

感谢所有帮助,我很乐意为未来的用户发布最终结果!

【问题讨论】:

标签: php facebook events facebook-graph-api facebook-php-sdk


【解决方案1】:

https://developers.facebook.com/tools/lint 调试您正在使用的访问令牌,并确保您拥有 PAGE 访问令牌而不是 USER 访问令牌。

有关获取页面访问令牌,请参阅https://developers.facebook.com/docs/authentication/ 的“页面登录”部分

【讨论】:

  • 感谢这些链接!看起来我有一个 APP 访问令牌。我更改了我的令牌调用以反映身份验证文档中的信息,将“manage_pages”添加到我的请求中,这产生了正确的结果——我被要求允许应用程序修改我的页面。但是,我猜我在提交过程中遗漏了一些内容,以防止它出现在页面本身上。或者,我到底需要获取 PAGE 访问令牌,而不是 APP 令牌?
  • 您需要 PAGE 访问令牌。对 me/accounts 执行 GET 操作,您将在那里看到 PAGE 访问令牌。
  • 好的,我想我会休息一晚,早上再看一遍。我有我的 PAGE 访问令牌,但如果我用这些令牌替换 APP 访问令牌,脚本会失败,而且我想我开始在任何地方看到令牌 ;-)
  • 谢谢!如您所见,这是我的第一篇 stackoverflow 帖子。我一定会坚持下去,因为你的回答让我朝着正确的方向前进,我只需要一点咖啡就可以看到它!你能看看现在的问题吗?该事件正确发布到我的个人墙上,但不是我收到的页面令牌预期的页面。我必须错过最后一个块......
  • 由于您的原始问题已解决,您可能想提出一个新问题,因为通过 cmets 跟随 Q 可能会很棘手。
猜你喜欢
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
相关资源
最近更新 更多