Facebook PHP发布到粉丝页面与cronjob?

Max*_*ain 17 php cron facebook

我使用以下代码发布到我的Facebook粉丝页面,它工作正常.现在我想使用cronjob发布到Facebook.我知道我必须使用访问令牌,但我不知道如何设置它.我试图使用echo我自己的访问令牌和页面的访问令牌,并在post api中使用它,但这不起作用我得到了这个错误:

Uncaught OAuthException: An active access token must be used to query information about the current user.
Run Code Online (Sandbox Code Playgroud)

这是我尝试的代码:

require_once('scripts/facebook.php');
    $config = array('appId' => 'xxx','secret' => 'xxx');

    $params = array('scope'=>'user_likes,publish_actions,email,offline_access,publish_stream,manage_pages');
    $facebook = new Facebook($config);
    $user = $facebook->getUser();
    if($facebook->getUser()) {
    try {

        $user_profile = $facebook->api('/me');
        $access_token = $facebook->getAccessToken();
        //echo "1. ".$access_token;

      } catch(FacebookApiException $e) {
                        $login_url = $facebook->getLoginUrl($params);
                        error_log($e->getType());
                        error_log($e->getMessage());
      }   
    } else {
        $login_url = $facebook->getLoginUrl($params);

    }    

$page_id = "xxxxxxxxxxxxx";
            $page_access_token = "";
            $result = $facebook->api("/me/accounts");
            foreach($result["data"] as $page) {
                if($page["id"] == $page_id) {
                $page_access_token = $page["access_token"];
                //echo '<br>';
                //echo "2. ".$page_access_token;
                break;
                    }
                }


        $args = array(
            'access_token'  => 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx',
            'message'       => stripslashes($image_caption).$animaged_gif,
            'name' => stripslashes($image_caption).$animaged_gif,
            'link' => "http://www.example.com/images.php?i=".$image_name,
            'picture' => "http://www.example.com/thumbnails/".$image_name.".png",
            'actions' => array(
            'name' => 'See Pic',
            'link' => "http://www.example.com/images.php?i=".$image_name
            )

        );
       $post = $facebook->api("/$page_id/feed","post",$args);
Run Code Online (Sandbox Code Playgroud)

正如您所看到的那样,我尝试使用我在回显自己的访问令牌时获得的实际访问令牌.但那没用.我还使用了页面的访问令牌,但这也没有用.你能告诉我这里缺少什么或者这样做的正确方法是什么?在我做了一些进一步的搜索后,我遇到了setAccessToken,$page_info = $fb->api("/".$sInfo['pageId']."?fields=access_token");但是如何使用它们的资源非常有限.我甚至不确定这些是否适合这个问题.我需要知道的是我需要使用哪个访问令牌以及设置它的适当代码是什么?

Kis*_*hor 12

这是你如何做到的:

  1. 获得短暂的访问权限.
  2. 扩展它.
  3. 获取一个长期访问的页面.(无所谓,这里我们每次都要获取新的accessstoken.不那么复杂,可靠.)

以为我会使用算法,而是添加所有可能的代码和文档,因为这可能对其他人有所帮助.

获取短期访问令牌并扩展它:

fetchtoken.php

<?php

//read more : https://developers.facebook.com/docs/howtos/login/server-side-login/
session_start();
$app_id = "xxxxxxxxxxxxxx";
$app_secret = "xxxxxxxxxxxxxxxx";
$my_url = "www.stackoverflow.com/";  // redirect url

$code = $_REQUEST["code"];

if(empty($code)) {
    // Redirect to Login Dialog
    $_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=publish_stream,read_friendlists,email";


    echo("<script> top.location.href='" . $dialog_url . "'</script>");
}
if($_SESSION['state'] && ($_SESSION['state'] === $_REQUEST['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;

     $response = file_get_contents($token_url);
     $params = null;
     parse_str($response, $params);
     $longtoken=$params['access_token'];


//save it to database   
} 
?>
Run Code Online (Sandbox Code Playgroud)

因此,您现在可以在数据库,文本文件或其他任何内容中使用长期存在的accessstoken.

cronjob.php

<?
require_once('scripts/facebook.php');
// Pull access token from the file/db
$access_token = "access token from file or db";
$facebook->setAccessToken($access_token); // sets our access token as the access token when we call something using the SDK, which we are going to do now.

$config = array('appId' => 'xxx','secret' => 'xxx');

$params = array('scope'=>'user_likes,publish_actions,email,publish_stream,manage_pages');
$facebook = new Facebook($config);
$user = $facebook->getUser();
if($facebook->getUser()) {
    try {

        $user_profile = $facebook->api('/me');
    } catch(FacebookApiException $e) {
        $login_url = $facebook->getLoginUrl($params);
        error_log($e->getType());
        error_log($e->getMessage());
    }   
}
else {
    $login_url = $facebook->getLoginUrl($params);
}    

$page_id = "xxxxxxxxxxxxx";
$page_access_token = "";
$result = $facebook->api("/me/accounts");
foreach($result["data"] as $page) {
    if($page["id"] == $page_id) {
        $page_access_token = $page["access_token"];
        //echo '<br>';
        //echo "2. ".$page_access_token;
        break;
    }
}

$args = array(
    'access_token'  => $page_access_token,
    'message'       => stripslashes($image_caption).$animaged_gif,
    'name' => stripslashes($image_caption).$animaged_gif,
    'link' => "http://www.example.com/images.php?i=".$image_name,
    'picture' => "http://www.example.com/thumbnails/".$image_name.".png",
    'actions' => array(
            'name' => 'See Pic',
             'link' => "http://www.example.com/images.php?i=".$image_name
    )
);
$post = $facebook->api("/$page_id/feed","post",$args);
?>
Run Code Online (Sandbox Code Playgroud)

确保您没有在脚本中再次获取access_token(用户访问令牌/ $ access_token).

此外,access_token$args这页面访问令牌应该由$ page_access_token变量不能手动插入,和.

offline_access在范围确实没有什么比他们展示在他们的数据可以被访问,可以不用该通知反正做的任何时间权限对话框.

只要您在开始时访问fetch.php一次,并且每60天手动访问一次,这应该有效.

让我知道.


Kis*_*hor 8

这可能应该解决它.

推荐使用offline_access.它现在被一个系统所取代,你可以获得一个扩展的expiry access_token.

当您手动运行它时,您生成一个实时访问令牌,在您实际运行它1-2小时后该令牌无效.并且你无法用cron生成另一个access_token.生成访问令牌应该手动完成.

所以要修复它,请阅读:https://developers.facebook.com/roadmap/offline-access-removal/

并实现这一点:https://developers.facebook.com/docs/howtos/login/server-side-login/

并将Access令牌保存到您的数据库.运行cron时,从数据库中获取令牌.

PS:access_token有效期为60天,应该再次扩展,可以由用户手动登录完成.access_token通常"可能"不会改变,但只是延长了到期时间.

添加:

安排帖子: 您也可以安排帖子长达6个月.只是阅读它,并认为我会指出.

阅读:https://developers.facebook.com/docs/reference/api/page/向下滚动到帖子创建部分