Google社が提供している無料のブログページ作成サービス「Blogger」に投稿した記事を、APIを使ってWordPress側で取得してみようと思う。もちろん、すでに「Blogger」で自分のブログを開設しているのが大前提だ。その上で、まずBlogger用のAPIを利用するためのAPI KEYを入手する。
Google API KEY の取得方法
- Google Developers Consoleに、Bloggerでブログを開設したGoogleアカウントでログインする。
- Google Developers Consoleのサイドバーメニューから「APIs」を選択して、「Blogger API v3」を有効化する(図1 参照)。

- サイドバーメニューの「Credentials」を選択して、“Public API access”欄の「Create new Key」を押す(図2 参照)。

- APIをどこから利用するかを選択する。もしJavaScriptからAPIリクエストを投げるのであれば「Browser Key」を選択する(図3 参照)。今回はJavaScriptとPHPの両方のケースでBlogger連携をしてみようと思う。

- APIの呼び出しを許可するリクエスト元のサイトのドメイン(FQDN)を指定する(図4 参照)。ワイルドカードが使えるので、サブドメインやドキュメントルート下のパスは「*」にしておくとサイト全体を呼び出し元として許可できる。

- まずJavaScript連携用のAPI Keyが出力される(図5 参照)。

- 次にCGI連携用のAPI Keyを作成するので、3.の手順と同じく、再び「Create new Key」を押す。
- サーバーサイドCGIからAPIリクエストを投げる用のAPI Keyを作成するので、「Server key」を選択する(図6 参照)。

- APIの呼び出しを許可するリクエスト元のIPアドレス(もしくはサブネットアドレス)を指定する(図7 参照)。

- 最後にAPI Keyを確認したら完了(図8 参照)。図8の赤い枠線で囲った欄のAPIKEYを控えておきます。

Google Developers ConsoleにはAPI Explorerというツールがあって、実際のAPIの動きをシミュレートできる。例えば「APIs」のAPI一覧から「Blogger API v3」を選ぶと、利用できるAPIのメソッドが一覧表示される。使ってみたいメソッドを選ぶと、API Explorerページが表示されるので、WEB上から必要なパラメータを入力してやることで、実際のAPIリクエストのサンプルと実行結果がその場で確認できる。ここで動きを確認してから、必要なAPIコマンドだけを呼び出し元サイトに設定するというお手軽なAPI連携開発ができるのだ(さすが、Google!)。
BloggerのブログIDを取得する
BloggerのブログIDは何気にダッシュボードや設定画面などに明示的に書いてなかったので、URLから拾うのが手っ取り早い。各投稿のページか、ダッシュボードの概要ページのURLなどのGETパラメータblogIDの値を取得しよう。
記事投稿ページ(新規投稿)
https://draft.blogger.com/blogger.g?blogID=<ここの数字がブログID>#editor/src=dashboard
ダッシュボード・概要ページ
https://draft.blogger.com/blogger.g?blogID=<ここの数字がブログID>#overview/src=dashboard
WordPress側でのAPI呼び出し
今回はBloggerの記事リストを最大10件取得して、WordPress側に未登録のブログIDがあればWordPressの投稿として登録するような処理を作ってみようかと思う。この処理に必要なAPIメソッドは、Bloggerの記事リストを取得できる「blogger.posts.list」だ。ただ、blogger.posts.listメソッドを素で呼ぶと、投稿についたコメントや投稿者情報など、WordPress側で利用したい記事データ以外の情報も含まれて、通信量が膨らんでしまってパフォーマンスが悪くなるので、fieldsパラメータで取得するデータを絞り込むことにする。その辺の取得データの絞り込みを行うのにはGoogle Developers ConsoleのAPI Explorerが便利だ。これでパラメータを色々試してみて、最終的なAPIリクエストはこうしてみた。
GET https://www.googleapis.com/blogger/v3/blogs/{BLOG_ID}/posts?maxResults=10&orderBy=published&fields=items(content%2CcustomMetaData%2Cid%2Cimages%2Ckind%2Clabels%2Cpublished%2Cstatus%2Ctitle%2CtitleLink%2Cupdated%2Curl)&key={YOUR_API_KEY}
ではさっそく、WordPressサイト側でBloggerの記事を取得してみよう。まずはAPI経由で記事を取得する部分のみのコードをPHPとJavaScriptでそれぞれ書いてみる。
PHP版
<?php
$google_api_key = '<Google API Key (Server key)>';
$blog_id = '<BloggerのブログID>';
$fields_param = 'items(content%2CcustomMetaData%2Cid%2Cimages%2Ckind%2Clabels%2Cpublished%2Cstatus%2Ctitle%2CtitleLink%2Cupdated%2Curl)';
$api_request = sprintf("https://www.googleapis.com/blogger/v3/blogs/%s/posts?maxResults=10&orderBy=published&fields=%s&key=%s", $blog_id, $fields_param, $google_api_key);
$response = file_get_contents($api_request);
$r = json_decode($response);
$blogger_posts = array();
$i = 0;
foreach ($r as $items) {
foreach ($items as $item) {
foreach ($item as $key => $val) {
$blogger_posts[$i][$key] = $val;
}
$i++;
}
}
var_dump($blogger_posts);
JavaScript版
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
</head>
<body>
<ul class="posts"></ul>
<script>
$(document).ready(function(){
var google_api_key = '<Google API Key (Browser key)>';
var blog_id = '<BloggerのブログID>';
var fields_param = 'items(content%2CcustomMetaData%2Cid%2Cimages%2Ckind%2Clabels%2Cpublished%2Cstatus%2Ctitle%2CtitleLink%2Cupdated%2Curl)';
var request_url = 'https://www.googleapis.com/blogger/v3/blogs/' + blog_id + '/posts?maxResults=10&orderBy=published&fields=' + fields_param + '&key=' + google_api_key;
function parseData(postObj) {
var post_list = '<li><h3 kind="' + postObj.kind + '"><a href="' + postObj.url + '">' + postObj.title + '</a> (' + postObj.id + ')</h3><div>' + postObj.content + '</div><p>PublishDate: <time>' + postObj.published + '</time></p></li>';
$('.posts').append(post_list);
}
$.ajax({
type: 'GET',
url: request_url,
dataType: 'json',
complete: function(response) {
var items = response.responseJSON.items;
items.forEach(parseData);
}
});
});
</script>
</body>
</html>
素でAjax処理書くのが面倒だったので、jQuery使ってます。
さて、これでBloggerの最新記事が最大10件、API経由で取得できたので、あとはWordPressに同じ投稿がなければ、新規投稿として登録するという処理を作ってみる。こちらはPHP建てになるので、API呼び出し部のソースもPHP版を使う。
WordPressにBloggerの記事を登録する
最終的な処理仕様は、API経由で取得したBloggerの最新10件の記事にて、同じ記事タイトルの投稿がWordPress側になかった場合、WordPressの新規投稿として記事を登録するというもの。今のところ記事の同一性はタイトル名でしか判断していない。また、WordPress側への登録時の投稿ステータスは「下書き」(draft)にしてある。もし、取得した記事をそのまま公開してしまいたい場合は、投稿ステータスをpublishにすること。
あと、WordPressへの記事登録が成功した場合は、スクリプトを実行したディレクトリと同一のところに登録投稿IDのログを出力している。
regist_post_to_blogger.php
<?php
require_once './wp-load.php';
$google_api_key = '<Google API Key (Server key)>';
$blog_id = '<BloggerのブログID>';
$fields_param = 'items(content%2CcustomMetaData%2Cid%2Cimages%2Ckind%2Clabels%2Cpublished%2Cstatus%2Ctitle%2CtitleLink%2Cupdated%2Curl)';
$api_request = sprintf("https://www.googleapis.com/blogger/v3/blogs/%s/posts?maxResults=10&orderBy=published&fields=%s&key=%s", $blog_id, $fields_param, $google_api_key);
$response = file_get_contents($api_request);
$r = json_decode($response);
$blogger_posts = array();
$i = 0;
foreach ($r as $items) {
foreach ($items as $item) {
foreach ($item as $key => $val) {
$blogger_posts[$i][$key] = $val;
}
$i++;
}
}
$wp_posts = get_posts( array('numberposts'=>-1) );
$insert_posts = array();
$insert_post_ids = array();
for ($i = 0; $i<count($blogger_posts); $i++) {
$insert_flag = true;
foreach ($wp_posts as $wp_post) {
if ($wp_post->post_title == $blogger_posts[$i]['title']) {
$insert_flag = false;
break;
}
}
$insert_posts[] = $insert_flag;
}
if (in_array(true, $insert_posts)) {
for ($i = 0; $i<count($insert_posts); $i++) {
if ($insert_posts[$i]) {
$add_post = array(
'post_title' => $blogger_posts[$i]['title'],
'post_content' => $blogger_posts[$i]['content'],
'post_status' => 'draft',
'post_type' => str_replace('blogger#', '', $blogger_posts[$i]['kind']),
'post_author' => 1,
'ping_status' => get_option('default_ping_status'),
'post_category' => array(0),
'post_name' => $blogger_posts[$i]['id'],
'post_date' => date('Y-m-d H:i:s', strtotime($blogger_posts[$i]['published'])),
'post_date_gmt' => gmdate('Y-m-d H:i:s', strtotime($blogger_posts[$i]['published'])),
'post_parent' => 0,
'menu_order' => 0,
'to_ping' => '',
'post_password' => '',
'guid' => '',
'post_content_filtered' => '',
'post_excerpt' => '',
'import_id' => 0,
);
$post_id = wp_insert_post($add_post);
if ($post_id)
$insert_post_ids[] = $post_id;
}
}
}
if (!empty($insert_post_ids)) {
error_log(sprintf('The post ids of %s was inserted.', implode(',', $insert_post_ids)), 3, './insert_pid.log');
}
スクリプトの最初で
require_once './wp-load.php';をしているので、WordPressがインストールされているディレクトリ下であれば、どこに配置しても動作するようにしてある。なので、cronジョブなどに組み込んで、1日1回とか自動実行することも可能だ。テーマやプラグインなどに組み込む場合は、require_once './wp-load.php';を外して、別途起動するディスパッチャを作ってあげるといいかも。
これで、BloggerとWordPressにて記事の連携(Bloggerに記事を書く→WordPressにインポートして記事を公開するという流れ)が可能になる。







