Mac って何?それって美味しいの?

マイコンと呼ばれた時代から現在まで、使用記から何から何でも。

FacebookからWordPressへの引っ越し(GraphAPI編)

 

yummac.hatenablog.jp

FacebookのGraphAPIを利用するにあたって、

  1. Facebook開発者アカウントの登録
  2. Facebook for Developersで アプリの作成
  3. アクセストークンを取得

が必要です。

これらの作業は、移行したいFacebookのアカウントで行います。
Facebook for Developersのアプリ作成は、ユーザデータにアクセス可能なアクセストークンが欲しいだけなので「コネクテッドエクスペリエンス」を選択し適当に必要項目を入力して登録するだけです。
そして、GraphAPIエクスプローラで「user_photo、user_video、user_posts」をアクセス許可したアクセストークンを作成します。
取得したアクセストークンは、そのままだと有効期限が短いので約3か月延長します。

GraphAPIエクスプローラで結構遊べますが、手順にならってFacebookSDKをインストールしました。めんどくさい思いをしてインストールしましたが、SDK使わずに結果を取得できることが後ほど判明して、それ以降SDKは使わずに開発をすすめます。

GraphAPIを使って投稿を取得し、WordPressに投稿を追加するプログラム例)

$accessToken = '取得したaccessToken';
$gettext = '/me?fields=feed'; //取得したい項目や条件を指定、グループ投稿はmeをグループIDに変更

//FacebookSDK利用の場合
$fb = new \Facebook\Facebook([
    'app_id' => 'Facebook開発者アカウントで作成したアプリID',
    'app_secret' => '上記アプリのapp_secret',
    'default_graph_version' => 'v2.10',
    //'default_access_token' => '', // optional
]);
try {
    $response = $fb->get($gettext, $accessToken);
} catch(\Facebook\Exception\FacebookResponseException $e) {
    // When Graph returns an error
    echo 'Graph returned an error: ' . $e->getMessage();
    exit;
} catch(\Facebook\Exception\FacebookSDKException $e) {
    // When validation fails or other local issues
    echo 'Facebook SDK returned an error: ' . $e->getMessage();
    exit;
}
$graphNode = $response->getGraphNode();

//file_get_contentsの場合
$graphNode = @file_get_contents( 'https://graph.facebook.com' . $gettext . '&access_token=' . $accessToken );

$json = json_decode($graphNode,true);

//SDK利用時
$feed = $json['feed'];
//file_get_contents使用時
$feed = $json['feed']['data'];

foreach ( $feed as $feeddata ) {
    //insertpost
    $post_content = $feeddata['message'];
    $post_title = mb_strimwidth($post_content,0,20,"..."); //Facebookの投稿はタイトル無いので。

    $post = array(
        'post_content'   => $post_content, // 投稿の全文。
        'post_title'     => $post_title, // 投稿のタイトル。
        'post_status'    => 'publish', // 公開ステータス。デフォルトは 'draft'。
        'post_type'      => 'post', // 投稿タイプ。デフォルトは 'post'。
        'post_date'      => wp_date("Y-m-d H:i:s",$feeddata['created_time']) // 投稿の作成日時。
    );

    // 投稿をデータベースへ追加
    $postid = wp_insert_post( $post );
}

実際に作成したコードはものすごく汚く見せられないので、投稿テキスト追加のみのシンプルにしてみました。SDKを使うか、file_get_contentsを使うかで変更が必要です。また、データの内容によってエラーとなったり、追加の記述も必要になります。
作成したプラグインではattachmentsのサイドロードも作りこんでいます。

GraphAPIを使ったプラグインの開発は順調に進んでいましたが、2つの壁にぶち当たります。

1つ目の壁は、「取得制限」です。
GraphAPIでは、一度に取得できるデータ量が(負荷軽減のため?)制限されます。
投稿データの取得で、無指定だと25件、since、until、limit等パラメータ指定でも最大100件まで。一度に全投稿(大量に)取得はできません。
データ量が多い投稿が含まれると、「reduceしろ」とエラーになり、さらに範囲や件数を絞り込まないと取得できません。
投稿データはpagenationで続きを取得できますが、投稿に付随するsubattachmentsはpagenationが使えず、100件を超えるデータ(画像等)の続きは取得できませんでした。
実際、該当する投稿が何件かあり、この投稿については100枚を超える画像は、切り捨てる対応となってしまいます。

2つ目の壁は、「フルサイズの画像が取得できない」ことです。
縦横最大740ピクセルの画像は、リンクからサイドロード取得できますが、フルサイズが参照できるURLは、Javascriptでリダイレクトされたページで閲覧できるようになるため、PHPがリダイレクトに対応できず、どうやってもエラーで取得できませんでした。
アルバムから投稿された画像であれば、別リクエストでアルバムを指定して読み込めば取得できそうな感じがします。が、リクエスト回数が増大し、制限に引っかかったりしそうです。
また、アルバム以外の画像は、投稿と関連付ける項目が見当たらず方法がありません。

こうなってくるとGraphAPIはあきらめて、また前の移行方法に戻ります。
ただ、今度は遠回りせず、FacebookからダウンロードしたJSONファイルを、そのままWordPressで読み込み、投稿やattachmentsを一括登録できるようにします。

 

yummac.hatenablog.jp