【问题标题】:How to post to a Facebook page with PHP如何使用 PHP 发布到 Facebook 页面
【发布时间】:2012-03-02 19:20:18
【问题描述】:

我想使用 PHP 从我的网站发布到我自己的 Facebook 页面的墙上。

我有以下几点:

  • Facebook 应用程序,带有 AppID、AppSecret、ApiKey
  • Facebook 页面,带有 PageID
  • 我自己的 Facebook 帐户 - 我是上述应用程序和页面的管理员和创建者。

例如我写了一篇博文,我想在我的 Facebook 页面的墙上获取名称、简短描述和图片。或者我想每天在 Facebook 页面上自动发布一些文章作为 cron 作业。

您能否提供一个分步教程如何完成此操作?

我读过这篇关于 Facebook 登录的文章:
https://developers.facebook.com/docs/facebook-login/
但我仍然不知道在我的代码中写什么。


更新 1

这是我发送应用访问令牌请求的方式:

$url = 'https://graph.facebook.com/oauth/access_token?grant_type=client_credentials&client_id='
        .Yii::app()->params['FacebookAppID']
        .'&client_secret='
        .Yii::app()->params['FacebookSecret'];

响应与此类似(假符号):

access_token=326584076429|ax3-D39YbpDcR9rMRQn_fMvNu_s

access_token 是什么?应用程序访问令牌?如何获取用户访问令牌?

我尝试使用此处的访问令牌:
https://developers.facebook.com/tools/explorer?method=GET&path=me%2Faccounts 但我收到以下错误消息:

必须使用主动访问令牌来查询当前用户的信息

那么我应该如何获得正确的访问令牌呢?

更新 2:

如何在没有任何客户端交互的情况下在我的应用程序中获取正确的 Facebook 令牌?
我是 Facebook 应用程序和 Facebook 页面的管理员和创建者。

【问题讨论】:

    标签: php facebook facebook-graph-api access-token


    【解决方案1】:

    一步一步

    1. 验证作为页面管理员(您自己)的用户
    2. 请求一个扩展的访问令牌(以获得一个 60 天的品种,因为 offline_access 已经消失)。见https://developers.facebook.com/docs/offline-access-deprecation/
    3. 调用 Graph API me/accounts 并搜索结果列表以找到您感兴趣的页面
    4. 从页面获取页面访问令牌并开始使用它来调用 post
    5. 有可能获得页面访问令牌的扩展访问令牌,如步骤 2 中所述,请尝试告诉我们是否也可以为页面访问令牌完成此操作。

    您可以在https://developers.facebook.com/tools/explorer 进行上述实验

    编码愉快!

    编辑

    要为任何用户获取不带对话的访问令牌,您可以使用https://developers.facebook.com/tools/access_token/ 获取访问令牌。

    【讨论】:

    • 感谢您的回答。 Authenticate a user that is a page admin怎么办?我应该传递哪些数据以及传递到哪里?谢谢。 :)
    • 我正在尝试 :) 没有结果。请参阅第一篇文章中的 UPD1。
    • 感谢您的真诚努力!了解整个 Facebook 身份验证可能需要一段时间(我花了整整两天的时间来了解它……是的,我的脑袋很厚)。你所拥有的那个困难的部分是你希望它成为一个 cron 工作。这意味着您必须从该图形浏览器工具中获取用户访问令牌,然后请求 60 天版本(请参阅developers.facebook.com/docs/offline-access-deprecation),然后将该令牌放入您的 cron-job 代码中。更好的方法是确保每次发布时都使用 php 进行身份验证。
    • :) 那么...你知道从 cron-job 进行身份验证的任何方法吗?请帮忙 :) cron-script 如何发布到 Facebook 页面的墙上?
    • 60 天后,Facebook 要求用户重新与您的应用交互。不要开枪,我只是在读他们写的东西。从他们的文档中:“如果您想更新仍然有效的 access_token,您必须先获取新的客户端访问令牌,然后调用下面的相同端点。应用程序将无法设置后台/cron 作业尝试自动延长过期时间,因为“授权码”是短暂的,会过期的。”
    【解决方案2】:

    步骤:

    1. 请求 manage_pages 权限(允许此过程):

      https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=YOUR_URL&scope=manage_pages&response_type=token
      
    2. 从 URL 获取访问令牌:
      如果管理员允许此权限。您应该被重定向到以下 URL:

      http://YOUR_URL/#access_token=AAABY5jBXQz0BAEzNKkb6FZC22D7aOoKIfFuozIjoOpkGHRJ6SyzBvqx24JGooMc31374EdRFNXkOyLZCBzETRD9vhZAZC8MZD&expires_in=0
      

      在 URL 中使用 Access token 你应该会得到这个:

      AAABY5jBXQz0BAEzNKkb6FZC22D7aOoKIfFuozIjoOpkGHRJ6SyzBvqx24JGooMc31374EdRFNXkOyLZCBzETRD9vhZAZC8MZD
      
    3. 使用 Graph API 检查访问令牌:

      https://graph.facebook.com/me/accounts?access_token=TOKEN_FROM_ABOVE
      

      Connection 将返回每个页面的信息和访问令牌。

    4. 在您的代码中实现它:
      您可以在调用 Facebook Graph API 方法时使用应用访问令牌。

    更新:
    如果您想在 Facebook SDK 中使用 API 方法,已弃用 REST API 或 FQL 查询...

    你必须这样使用users_accesstoken

    1. 方法一:
      使用您的帐户或用户以offline_access权限登录您的Facebook页面,并在使用$facebook->getAccessToken()登录成功时获取access_token,并将其保存在数据库中以便您随时使用。
      您可以检查令牌here 的到期时间,具有offline_access 权限的令牌永不过期,除非用户更改密码或其他任何情况。

    2. 方法二:
      您可以使用下面的代码动态更新您的access_token(告别过期令牌)。 Facebook 展示了这个解决方案here,它是执行 FQL 查询的示例代码:

    代码:

    <?php
    $app_id = 'YOUR_APP_ID';
    $app_secret = 'YOUR_APP_SECRET';
    $my_url = 'POST_AUTH_URL';
    $code = $_REQUEST["code"];
    
    //auth user
    if(empty($code)) {
        $dialog_url = 'https://www.facebook.com/dialog/oauth?client_id=' 
            . $app_id . '&redirect_uri=' . urlencode($my_url) ;
        echo("<script>top.location.href='" . $dialog_url . "'</script>");    
    }
    
    //get user access_token
    $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);   
    

    【讨论】:

    • 第一步中的redirect_uri=YOUR_URL是什么?脚本应以自动模式运行,无需用户交互。所以,如果我尝试CURL 这个链接 - 我得到了 Facebook 的登录表单。没有办法继续了:)
    • 如果没有设置$_REQUEST['code'](取决于PHP error_reporting),您应该使用$code = isset($_REQUEST['code']) ? $_REQUEST['code'] : NULL; 而不是$code = $_REQUEST["code"];,而不是获得PHP 通知。是的,Facebook 开发者的网站shows a bad example 很糟糕。
    【解决方案3】:

    试试这个简单的功能贴到墙上:

    function doWallPost($postName = '', $postMessage = '', $postLink = '', $postCaption = '', $postDescription = '') {
      $FB_APP_ID     = 'xxxxxxxxxxxxxxxxxxxxxxxx';
      $FB_APP_SECRET = 'xxxxxxxxxxxxxxxxxxxxxxxxxxx';
    
      $APP_RETURN_URL = ((substr($_SERVER['SERVER_PROTOCOL'], 0, 4) == "HTTP") ? "http://" : "https://") . $_SERVER['HTTP_HOST'] . $_SERVER['SCRIPT_NAME'];
    
      $code = $_REQUEST["code"];
    
      if (empty($code)) {
        $dialog_url = "http://www.facebook.com/dialog/oauth?client_id=" . $FB_APP_ID . "&redirect_uri=" . $APP_RETURN_URL . "&scope=publish_stream";
        header("Location:$dialog_url");
      }
    
      $token_url    = "https://graph.facebook.com/oauth/access_token?client_id=" . $FB_APP_ID . "&redirect_uri=" . urlencode($APP_RETURN_URL) . "&client_secret=" . $FB_APP_SECRET . "&code=" . $code;
      $access_token = file_get_contents($token_url);
    
      $param1          = explode("&", $access_token);
      $param2          = explode("=", $param1[0]);
      $FB_ACCESS_TOKEN = $param2[1];
    
    
      $url        = "https://graph.facebook.com/me/feed";
      $attachment = array(
        'access_token' => $FB_ACCESS_TOKEN,
        'name' => $postName,
        'link' => $postLink,
        'description' => $postDescription,
        'message' => $postMessage,
        'caption' => $postCaption
      );
    
      $ch = curl_init();
      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, 2);
      curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
      curl_setopt($ch, CURLOPT_POST, true);
      curl_setopt($ch, CURLOPT_POSTFIELDS, $attachment);
      $result = curl_exec($ch);
      header('Content-type:text/html');
      curl_close($ch);
    
      return $result;
    }
    

    【讨论】:

    • 我从 cron-job 执行这个脚本,而不是从浏览器。所以我不能在 Facebook 的弹出对话框中做任何批准,因为它不在浏览器中:)
    • 如果没有设置$_REQUEST['code'],你应该使用$code = isset($_REQUEST['code']) ? $_REQUEST['code'] : NULL;而不是$code = $_REQUEST["code"];来获取PHP通知(取决于PHP error_reporting)。是的,Facebook 开发者的网站shows a bad example 很糟糕。
    猜你喜欢
    • 2012-04-08
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2023-04-07
    • 2012-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多