【问题标题】:Expend access token for fan pages花费粉丝页面的访问令牌
【发布时间】:2012-12-18 20:31:12
【问题描述】:

我搜索了 2 天来解决我的问题,找到了很多解决方案,但没有一个对我有用。 我想制作一个 facebook 应用程序,我将从 cronjob 访问一次 20 分钟。 这个应用程序应该在我的页面上发布一张带有相册描述的照片。问题是令牌访问过期......所以代码......

//connect to api
$facebook = new Facebook(array(
          'appId'  => APP_ID,
          'secret' => APP_SECRET
        ));

//get the page token
$page_id = 222506244512259;
$page_info = $facebook->api("/$page_id?fields=access_token");

$page_info['access_token']; //so if i use this token is ok but it expires in 2 hours

//now we try to use something else to extend the time

$token_url="https://graph.facebook.com/oauth/access_token?client_id=".APP_ID."&client_secret=".APP_SECRET."&grant_type=fb_exchange_token&fb_exchange_token=".$facebook->getAccessToken();

//so if i use this formula i will receive a token that never expires, is ok but if I try to use the acces token for posting it doesn work is not valid

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


//and this is the rest code for posting

$image['file'] = 'images/rezultate/'.$link;
$args = array( 'access_token' => $page_info['access_token'], 'message' => ':-) <3', 'no_story' => 0);
$args['image'] = '@' . $image['file'];
$target_url = "https://graph.facebook.com/356048711158011/photos";

$ch = curl_init(); 
curl_setopt ($ch,CURLOPT_URL,$target_url); 
curl_setopt ($ch, CURLOPT_POST, 1); 
curl_setopt ($ch, CURLOPT_RETURNTRANSFER,1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $args);
curl_exec($ch); 
curl_close ($ch);

我更新了代码,但还是不行,可能是你出了点问题……

define('TITLU', 'Postare automată'); //titlu aplicatie
define('APP_ID',123096994520827); //id aplicatie
define('APP_SECRET', '25dedb6a969e9bd934e1ea9f16944a83'); //secret aplicatie
define('TABEL', 'postareautomata'); //numar random maxim


//start facebook
$facebook = new Facebook(array(
      'appId'  => APP_ID,
      'secret' => APP_SECRET
));

//get page id and 2 hour page token
$page_id = 222506244512259;
$page_info = $facebook->api("/$page_id?fields=access_token");
//access token 2 hours
$page_info['access_token'];

//here i get my account but for nothing
$acc = $facebook->api("/100001036884257/accounts");
//echo var_export($acc, true);


//here i get the long token it returns a code value but when i used down don`t work
$longtoken = 'https://graph.facebook.com/oauth/access_token?client_id='.APP_ID.'&client_secret='.APP_SECRET.'&grant_type=fb_exchange_token&fb_exchange_token='.$facebook->getAccessToken();     
$response = file_get_contents($longtoken);
$params = null;
parse_str($response, $params);
$longtoken = $params['access_token'];

echo"Acces Token short: ".$page_info['access_token'];
echo"<br />Acces Token long: ".$longtoken;

//here i get my folder picture and pictures
$a = file_get_contents('http://www.ingersidemon.ro/proiecte/pitzi-world.ro/.facebook/postareautomata/images/rezultate/');
$dom = new DOMDocument;
$dom->loadHTML($a);
$nodes = $dom->getElementsByTagName('a');
$nrpoze = $dom->getElementsByTagName('a')->length - 1;
$picid = get_last_picture();
$link = $nodes->item($picid['id'] + 1)->getAttribute('href');
//echo "Link poza: ".$link;



if($picid['id'] + 1 <= $nrpoze) {
    $data = array(
        'link' => $link,
        'desc' => ':-) <3'
    );
    insert_picture($data);
//and here is the bog problem if i use short acces token it works for 2 hours but the long never work
    $params = array('access_token' => '$longtoken', 'message' => ':-) <3');
    $params['source'] = '@' . realpath('images/rezultate/'.$link);
    $facebook->setFileUploadSupport(true);
    $post_id = $facebook->api('/'.$page_id.'/photos','post',$params);

}

更新 3:该应用程序运行良好,但前提是我访问它,而不是来自 cronjob,并且访问令牌是 2 个月,在 cronjob 中提供

PHP 致命错误:未捕获的 OAuthException:请求此资源需要用户访问令牌。

define('TITLU', 'Postare automată'); //titlu aplicatie
define('APP_ID',123096994520827); //id aplicatie
define('APP_SECRET', '25dedb6a969e9bd934e1ea9f16944a83'); //secret aplicatie
define('TABEL', 'postareautomata'); //numar random maxim

$facebook = new Facebook(array(
      'appId'  => APP_ID,
      'secret' => APP_SECRET
));


// Get User
$user = $facebook->getUser();


// ask for the extended token and get it from session ...
$facebook->setExtendedAccessToken();
$access_token = $_SESSION["fb_".APP_ID."_access_token"];
// now set it into the facebook object ....
$facebook->setAccessToken($access_token);
// now our fb object will use the new token as usual ...
$accessToken = $facebook->getAccessToken();
echo $access_token;

$params = array(
                'access_token' => 'AAABv9MChnvsBAALtC4XoywkLdGQMzmJHYbN8G2RjgZCGlzR6DnkB8X12FZCE6XIZB81KkYevIYzC2pu5UvVZBoOFvw8j0cgjLeHcwvcOpwZDZD',
                'message'=> "cron"
        );
    $post_id = $facebook->api('/'.$page_id.'/feed','post',$params);

【问题讨论】:

    标签: php facebook facebook-graph-api


    【解决方案1】:

    普通访问令牌2小时到期,延长令牌有效期2个月。

    如果您想要扩展令牌,请通过以下方式:How to extend access token validity since offline_access deprecation

    (您可以使用Facebook's Debug Tool 来检查您的访问令牌的有效性。)

    【讨论】:

    • 谢谢,我已经使用了这个函数,它给了我长访问令牌但是当我用作 $post_id = $facebook->api('/'.$page_id.'/photos 的参数时','post',$params); [2012 年 12 月 18 日 11:37:02] PHP 致命错误:未捕获的 OAuthException:请求此资源需要用户访问令牌。在 /home/ingersid/public_html/proiecte/pitzi-world.ro/.facebook/postareautomata/base_facebook.php 在第 1249 行 [18-Dec-2012 11:37:03] CSRF 状态令牌与提供的不匹配。你可以看到代码了。
    • 您是否请求过“publish_stream”权限?
    • 如果我用cronjob怎么问?我现在设置 if (!$user) { echo $loginUrl = $facebook->getLoginUrl(array('scope'=>'manage_pages,publish_stream,offline_access', 'redirect_uri' => 'apps.facebook.com/apppostauto/')); //离线访问的登录url }
    • 如果您有扩展令牌,则在使用 cron 时无需验证用户。如果用户之前任何时候都允许发布操作,只需在您的 cron 中使用他的 extended_access_token 并发布。这肯定会奏效。
    • 您好,我更新了帖子,请去更新3 ...可以吗?只有当我手动访问时,cron 才起作用。
    【解决方案2】:

    使用在Access Token Tool 中找到的App Token

    【讨论】:

    • 不起作用,唯一有效的访问令牌是 $page_info['access_token'] .. 还有什么?
    【解决方案3】:

    查看我对类似问题的回答here

    来自开发者页面:

    通过使用长期存在的用户访问令牌,查询 [User ID]/accounts 端点现在将提供 不提供的页面 访问令牌 用户管理的页面过期。

    【讨论】:

    • 谢谢,所以我使用了这里的所有代码:developers.facebook.com/blog/post/2011/05/13/… 我在哪里 $access_token = $facebook->getAccessToken(); and i receive: Curent token: AAABv9MChnvsBACTlYqcLNWXnrq5QwlwqPKZAQPDZBFnllrNFyywBOZAdZCn3yl91zJznZAuWNjWHHlo1NfY3r0WXr2VZBQg76XLTM3lg4mDQNmIbTuvuzZALKRXcMUQTCcZD And the succes long token from facebook code wich lives 2 months: AAABv9MChnvsBAALtC4XoywkLdGQMzmJHYbN8G2RjgZCGlzR6DnkB8X12FZCE6XIZB81KkYevIYzC2pu5UvVZBoOFvw8j0cgjLeHcwvcOpwZDZD All is good but when i use the token as a param to post error.
    • [18-Dec-2012 11:37:02] PHP 致命错误:未捕获的 OAuthException:请求此资源需要用户访问令牌。在第 1249 行 [2012 年 12 月 18 日 11:37:03] CSRF 状态令牌与提供的不匹配。
    【解决方案4】:

    页面令牌的持续时间与用于获取它们的用户访问令牌一样长。你不能拥有一个无限持久的令牌。您需要能够定期更新您的令牌并处理意外过期的令牌。 a FB blog post from last year 有更多信息。

    【讨论】:

    • 是的,我知道,有些令牌会在 2 个月内到期…… 2 个月内可以,但不能 2 小时
    • 同样,当用户令牌到期时,即使是长期存在的令牌也可能在任何时间到期。这意味着它可能会在获得后几秒钟内过期。
    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 2013-02-07
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    • 2013-10-24
    • 2013-11-20
    • 1970-01-01
    相关资源
    最近更新 更多