【问题标题】:Get latest Facebook posts of page with PHP SDK使用 PHP SDK 获取页面的最新 Facebook 帖子
【发布时间】:2015-01-24 09:31:34
【问题描述】:

以下代码位于名为 facebook_posts.php 的文件中,我从索引文件中调用该文件,如下所示:<?php require_once("http://www.example.com/design/php/facebook_posts.php"); ?>。但是,放置此代码的位置没有响应。因此,成功和 catch 错误都不会返回错误(如我所见)。我尝试了绝对 URL,但这也不起作用。 (我隐藏了 api 和页面信息。)显然 require_once 后面的内容(页脚和脚本)没有加载。包含 SDK 时似乎出了点问题。

我没有使用 composer,我需要 require Facebook\ 文件还是 use 它们?从页面中检索帖子需要哪些?

<?php
// Defining FB SDK with absolute paths
define('FACEBOOK_SDK_V4_SRC_DIR', 'http://example.com/design/Facebook/');
require 'http://example.com/design/php/autoload.php';

use Facebook\FacebookSession;
use Facebook\FacebookRequest;
use Facebook\GraphUser;
use Facebook\FacebookRequestException;

FacebookSession::setDefaultApplication('{my-app-id}','{my-app-secret}');

$session = new FacebookSession('{my-long-lived-access-token}');

// Get the GraphUser object for the current user:

try {
$request = new FacebookRequest(
  $session,
  'GET',
  '/{my-page-id}/feed'
);
$response = $request->execute();
$graphObject = $response->getGraphObject();

var_dump($graphObject);
echo graphObject;
echo "banana";

} catch (FacebookRequestException $e) {
  echo "API ERROR";
} catch (\Exception $e) {
  echo "other error";
}

?>

编辑:所以我只是 required in 所有 FB 文件,这似乎有效。但是,我不知道如何遍历/迭代返回的对象。 IE。如何循环浏览不同的帖子(页面的四个最新帖子)并在 HTML 中回显它们。基本结构如下所示:

<time>{publish date}</time>
<p>{post message}</p>
<a href="{link to included url}">{title to included url}</a>

【问题讨论】:

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


【解决方案1】:

您需要使用长期有效的页面访问令牌。

页面访问令牌

这些访问令牌类似于用户访问 令牌,除了它们向 API 提供读、写权限 或修改属于 Facebook 主页的数据。获取页面 访问令牌,您需要首先获取用户访问令牌和 请求 manage_pages 权限。一旦您拥有用户访问权限 令牌,然后您可以通过 Graph API 获取页面访问令牌。

正如@CBroe 所说,您不应在客户端代码中使用该访问令牌,因为它是秘密/私有的,您不希望任何人获得它。

因此,对于您想做的事情,Javascript 不是正确的选择。您将不得不使用一些服务器端代码,如 PHP、Python 或 Ruby 来获取帖子。如果这很清楚,那么您可以通过以下方式创建它。


  1. 创建一个 Facebook 应用:

    • 保留应用 ID (1) 和应用机密 (2)
    • 在“高级”设置中,激活 OAuth 以避免The application has disabled OAuth client flow
  2. 您需要创建一个用户访问令牌。

    • 继续Graph API Explorer 并选择您刚刚创建的应用程序,
    • 生成访问令牌:点击“获取访问令牌”并在“扩展权限”选项卡中勾选manage_pages
  3. Get your short-lived page access token.

    • 仍在 Graph API 资源管理器中,查询 me/accounts (GET),
    • 找到您的页面并获取其访问令牌(3)
  4. Get your long-lived page access token.

    • 在浏览器的地址栏中粘贴https://graph.facebook.com/oauth/access_token?client_id=(1)&amp;client_secret=(2)&amp;grant_type=fb_exchange_token&amp;fb_exchange_token=(3)
    • (1)(2)(3) 替换为您的应用 ID、应用密码和页面访问令牌,
    • 从结果中获取新的长期访问令牌:access_token=FAKECAALBygJ4juoBAJyb8Cbq9bvwPYQwIaX53fLTMAWZCmDan1netI30khjITZAqcw9uE0lRT4ayWGm2ZCS7s7aZCVhF3ei6m0fuy2AkTkwmzUiJI4NUOZAyZAzuL
    • 使用Access Token Debugger 验证您的访问令牌将永不过期

现在您可以使用新的访问令牌来检索您页面的帖子:

$session = new FacebookSession('FAKECAALBygJ4juoBAJyb8Cbq9bvwPYQwIaX53fLTMAWZCmDan1netI30khjITZAqcw9uE0lRT4ayWGm2ZCS7s7aZCVhF3ei6m0fuy2AkTkwmzUiJI4NUOZAyZAzuL');

try {
    $data = (new FacebookRequest(
        $session, 'GET', '/me/posts'
    ))->execute()->getGraphObject()->getPropertyAsArray("data");

    foreach ($data as $post){
        $postId = $post->getProperty('id');
        $postMessage = $post->getProperty('message');
        print "$postId - $postMessage <br />";
    }
} catch (FacebookRequestException $e) {
    // The Graph API returned an error
} catch (\Exception $e) {
    // Some other error occurred
}

【讨论】:

  • 这很好用,但是当我签入访问令牌调试器时,它在最后一步返回的长寿命令牌对我来说只有 2 个月有效,而不是永远有效?
  • 我为 api 制作了两个文件,就像这个链接:developers.facebook.com/docs/php/howto/example_facebook_login ... 所以请告诉我我把这段代码放在哪个文件中
  • 因为我收到此错误:“致命错误:在 /mounted-storage/home117a/sub009/sc47323-PUDP/www/siteurl.com/fb-test/fb- 中找不到类 'FacebookSession'第 37 行的 callback.php"
【解决方案2】:

我发现投票最多的解决方案太复杂了,只能持续 2 个月。

对我来说,这是使用带有 Graph API 2.5 的应用程序的最佳解决方案:

1.- 创建一个应用程序。

2.- 转至:https://developers.facebook.com/tools/explorer/

  • 在右上角选择您新创建的应用。
  • 选择“获取应用令牌”

3.- 复制此“{ACCESS-TOKEN}”(格式为:数字|哈希)

重要提示:(这不是 app_id|app_secret !!!)

4.- 使用 CURL 查询 URL:

(5).- 等效 URL:

我把所有这些放在一个非常简单的要点中:

https://gist.github.com/biojazzard/740551af0455c528f8a9

【讨论】:

  • 只返回一个帖子。我怎样才能获得多个帖子?
【解决方案3】:
  1. 创建应用Developer Facebook Page

然后是代码示例:

<ul>
<?php

$page_name = '{PAGE_NAME}'; // Example: http://facebook.com/{PAGE_NAME}
$page_id = '{PAGE_ID}'; // can get form Facebook page settings
$app_id = '{APP_ID}'; // can get form Developer Facebook Page
$app_secret = '{APP_SECRET}'; // can get form Developer Facebook Page
$limit = 5;

function load_face_posts($page_id, $page_name, $app_id, $app_secret, $limit, $message_len) {
    $access_token = "https://graph.facebook.com/oauth/access_token?client_id=$app_id&client_secret=$app_secret&grant_type=client_credentials";
    $access_token = file_get_contents($access_token); // returns 'accesstoken=APP_TOKEN|APP_SECRET'
    $access_token = str_replace('access_token=', '', $access_token);
    $limit = 5;
    $data  = file_get_contents("https://graph.facebook.com/$page_name/posts?limit=$limit&access_token=$access_token");
    $data = json_decode($data, true);
    $posts = $data[data];
    //echo sizeof($posts);

    for($i=0; $i<sizeof($posts); $i++) {
        //echo $posts[$i][id];
        $link_id = str_replace($page_id."_", '', $posts[$i][id]);
        $message = $posts[$i][message];

        echo ($i+1).". <a target='_blank' href='https://www.facebook.com/AqualinkMMC/posts/".$link_id."'>".$message."</a><br>";
    }
}

load_face_posts($page_id, $page_name, $app_id, $app_secret, $limit, $message_len);
?>
</ul>

【讨论】:

    【解决方案4】:

    您需要从 facebook 提要获取最新帖子的所有内容都在这里描述:http://piotrpasich.com/facebook-fanpage-feed/

    在快捷方式中 - 使用您的粉丝页面供稿(请用正确的 id 替换 {id})

    https://facebook.com/feeds/page.php?format=atom10&id={id}

    您可以使用这段代码下载提要:

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $rss_url);
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 1.0.3705; .NET CLR 1.1.4322; Media Center PC 4.0)');
    curl_setopt($curl, CURLOPT_REFERER, '');
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_TIMEOUT, 10);
    $raw_xml = curl_exec($curl); // execute the curl command
    

    【讨论】:

    • 我希望您知道 SO 需要某种形式的代码,以防链接变暗。
    • 我刚刚尝试过(2018 年 3 月),但它似乎不起作用(我想不再)
    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多