18

次のコードを使用してFacebookのファンページに投稿していますが、正常に機能しています。Facebookに投稿するためにcronjobを使用したいと思います。アクセストークンとして使用する必要があることはわかっていますが、設定方法がわかりません。自分のアクセストークンとページのアクセストークンを使用して、ポストAPIで使用しようとしechoましたが、機能しませんでした。次のエラーが発生しました。

Uncaught OAuthException: An active access token must be used to query information about the current user.

これが私が試した私のコードです:

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);

ご覧のとおり、自分のアクセストークンをエコーアウトしたときに取得した実際のアクセストークンを使用しようとしました。しかし、それはうまくいきませんでした。ページのアクセストークンも使用しましたが、それも機能しませんでした。私がここで欠けているもの、またはこれを行うための適切な方法を教えてください。setAccessTokenさらに検索したところ、出くわしまし$page_info = $fb->api("/".$sInfo['pageId']."?fields=access_token");たが、使い方に関するリソースは非常に限られています。それらがこの問題に適切であるかどうかさえわかりません。私が知る必要があるのは、使用する必要のあるアクセストークンと、それを設定するための適切なコードは何ですか?

4

4 に答える 4

12

これはあなたがそれを行う方法です:

  1. 有効期間が短いアクセストークンを取得します。
  2. それを拡張します。
  3. 長期間有効なページ アクセス トークンを取得します。(関係ありません。ここでは、毎回新しいアクセストークンをフェッチします。複雑さが軽減され、信頼性が高くなります。)

私はアルゴリズムを使用すると思っていましたが、代わりに、他の人にも役立つ可能性があるため、可能なすべてのコードとドキュメントを追加しています。

短期間のアクセス トークンを取得して拡張する:

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   
} 
?>

これで、データベースやテキスト ファイルなどで有効期間の長い accesstoken の準備が整いました。

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);
?>

スクリプトで access_token(user access token / $access_token) を再度取得しないようにしてください。

また、ページ アクセス トークンの はaccess_token$args手動ではなく $page_access_token 変数によって挿入する必要があります。

offline_accessスコープ内にいることは、アクセス許可ダイアログ ボックスでデータにいつでもアクセスできることを示すこと以外には何もしません。

これは、最初に fetch.php に 1 回アクセスし、60 日に 1 回手動でアクセスする限り機能します。

お知らせ下さい。

于 2012-11-08T07:52:11.103 に答える
8

これでおそらく修正されるはずです。

offline_accessは非推奨になりました。現在、有効期限が延長された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/[投稿][セクションの作成]まで下にスクロールします

于 2012-11-06T00:52:53.237 に答える