FacebookからエクスポートしたJSONファイル、最初は何もわからず(資料がないんだもん)、データ構造を解析して投稿を抽出していました。
その後のGraphAPIでは、リファレンスが用意されており、またGraphAPIエクスプローラを利用することで、データ構造を確認しながら開発しました。
エクスポートしたJSONファイルのデータ構造と、GraphAPIで取得できるデータ構造、異なる部分もありますが、わかってしまえばそんなに苦ではありませんでした。
データの取得は、file_get_contentsでJSONファイルを読み込む。
日本語デコード("\u00xx")は正規表現で置換する。(正規表現ちんぷんかんぷんですが)
データの階層の違い、attachments構造の違いに合わせコーディングする。
画像や動画は、Facebookからエクスポートしたファイルを解凍し、フォルダごとWordPressのuploadsにアップロードしておく。投稿データのattachmentsをもとに、メディア登録する。
//実行時間制限延長(秒) 0は無制限 このスクリプトのみ有効
$maxtime = 3600;
ini_set("max_execution_time",$maxtime);
// アップロード用ディレクトリのパスを取得。
$wp_upload_dir = wp_upload_dir();
//Facebook jsonfile
$jsonfile = 'wordpress uploads下にアップロードしたjsonfile';
$graphNode = file_get_contents($wp_upload_dir['baseurl'].$jsonfile);
//facebook日本語マルチバイトデコード"\n00xx"-"%xx"に置換してURLDecode
$patterns = '/\Q\u\E00([0-9A-Fa-f]{2})/';
$graphNode = preg_replace_callback($patterns,
function ($matches) {
return rawurldecode('%' . $matches[1]);
}, $graphNode);
$json = json_decode($graphNode,true);
if(json_last_error() !== JSON_ERROR_NONE){
// エラー処理
} else {
if (array_key_exists('group_posts',$json)) {
//グループ投稿jsonはgroup_posts,activity_log_dataを削って階層同じにする
$json = $json['group_posts']['activity_log_data'];
}
}
//jsonfileからの場合
$feed = $json; //そのまま
foreach ( $feed as $feeddata ) {
//attachments
//$feeddata['attachments'][0]['data']下の配列にあります。存在チェック要。
// ['attachments'][0]['data'][n]['media']['uri']にダウンロードしたファイル名で入っています。
//メディア登録するコードを記述します。
//$atthtml = '<img src="{$url}" >'; //メディア登録した画像や動画を投稿に埋め込むHTMLを作成しよう。
//insertpost
$post_content = $feeddata['data'][0]['post'] . $atthtml;
$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['timestamp']) // 投稿の作成日時。
);
// 投稿をデータベースへ追加
$postid = wp_insert_post( $post );
}
今回もシンプルにさせていただきました。
処理時間が長くなるとエラーで中止されてしまうので、
制限時間を指定しておきます。
処理が終了するまで、ブラウザのクルクルが回っています。気長に待ちます。
attachmentsのところはごめんなさい。
必要であればご自身で記述してください。
依頼されているFacebookは、投稿データが何百件、何千件とあります。
添付の画像ファイルもすごく多いので、データを範囲指定して取り込みますが、数時間ごと、何回かに分けて実行します。