【CakePHP】Services_Bloggingを利用してXML-RPCに対応したブログに記事を投稿する

ブログネタは20個くらい溜まっているのにアウトプットしていなかったので、腐る前にポストします。
今回はXML-RPCで更新できるブログをPEARのServices_Bloggingを利用して更新するTipsです。

CakePHP1.3系、PEARはVendorsに置くこととします。

XML-RPCで更新できるブログには次のようなものがあります。

ようするにServices_Bloggingを使えばこれらのブログを一括で更新したり、自動で更新させたりすることが可能ということです。便利ですよね。

Services_Bloggingでは、XML-RPC以外にも対応しているプロトコル*1 はありますが、今回はXML-RPCに絞ってお話しします。

PEAR::Services_BloggingをVendorsに置く

Services_BloggingからServices_Blogging本体と依存ファイルをDLして、Vendorsに入れます。

もちろんサーバでPEARを利用していればPEARコマンドでインストールしても構いません。僕はCakeアプリをサーバに置くだけでアプリを動作させたい*2 のでVendorに置いています。

ちなみに僕の場合、CakePHPでPEARを利用するときには/vendors/PEAR/に置くことにしています。PEARのライブラリが他のライブラリを参照できるようにパスを通す必要があるので、bootstrap.phpでset_include_pathしてしまいましょう。

if (!defined('PEAR')) {
    define('PEAR', VENDORS . 'PEAR' . DS);
}
// include_path に pearのライブラリパスを追加
set_include_path(PEAR . PATH_SEPARATOR . get_include_path());

あとは、Services_Bloggingを利用したいController,Componentsで

App::import('Vendor', 'Services_Blogging', array("file" => "pear".DS."Services".DS."Blogging.php"));

で利用できます。

ブログを投稿する

Services_Bloggingを利用すればブログを投稿するのは非常に簡単です。
必要な要素は次の5つだけ。*3

  • ユーザ名
  • パスワード
  • 投稿用のURL(エンドポイント)
  • 記事のタイトル
  • 記事の本文

これを使って投稿するためのソースはこんな感じ。

// 以下CakePHP1.3系のソースなので2系の方は注意
//まずServices_Bloggingを読み込む
App::import('Vendor', 'Services_Blogging', array("file" => "Services".DS."Blogging.php"));
class hogeController extends AppController(){
	var $name = "Hoges";
	
	function post() {
		// 必要な情報は以下の5つだけ。
		$user = "hogetarou";
		$password = "hogehoge";
		$url = http://blog.fc2.com/xmlrpc.php;	// FC2の場合
		$title = "XML-RPCデビュー!";
		$body = "おかあさん、ついにデビューを果たしました。";
		
		// urlをホストとパスに分解
		$urls = parse_url($url);
		$host = $urls['host'];
		$path = $urls['path'];
		
		// factoryメソッドで適切なクラスのインスタンスを作成(日本語合ってる?)
		$blog = Services_Blogging::factory(
			"MetaWeblog",	// Driverを指定 XML-RPCならMetaWeblog
			$user,
			$password,
			$host,
			$path
		);
		
		// 上記設定で新規投稿を行う
		$post = $blog->createNewPost();
		// タイトルと本文を設定|他にもカテゴリや投稿日時など設定できる。詳しくはBlogging/Post.phpを参照
		$post->title = $title;
		$post->content = $body;
		// 投稿 $blogのsavePostの引数に$postだからね。
		$blog->savePost($post);
		
		// 投稿に失敗するとFatal Errorが出ると思う(たぶん。。)idが取れれば成功
		if (!empty($post->id)) {
			$this->Session->setFlash("投稿成功");
		} else {
			$this->Session->setFlash("(゚Д゚;)");
		}
	}
		
}

と、こんな感じ。
コメントだらけで長くなっちゃったけど、実質10行ちょいくらい。
Services_Bloggingのお陰でこんなに簡単にブログ投稿できちゃいます。

userとblogidが異なる場合

Services_Bloggingの仕様だと、factoryでインスタンスを作成するときの引数にblogidがありません。ソースを追うとわかりますが、blogidにuserを指定しているようです。

そのため、seesaaブログ(他にもあるかも)には前述のままでは投稿できません。
そこで、Services_Blogging_Driver_MetaWeblogクラスを継承してblogidを指定できるようにします。

// Services_Blogging_Driver_MetaWeblogクラスを読み込む
App::import('Vendor', 'Services_Blogging_Driver_MetaWeblog', array("file" => "Services".DS."Blogging".DS."Driver".DS."MetaWeblog.php"));
class hogeController extends AppController(){
// ?省略?
}
class Blogid_MetaWeblog extends Services_Blogging_Driver_MetaWeblog {

	public function __construct($user, $pass, $server, $path, $blogId) {

		$this->userdata = array(
			'user'		=> $user,
			'pass'		=> $pass,
			'server'	=> $server,
			'path'		=> $path,
			'rpc_user'	=> new XML_RPC_Value($user, 'string'),
			'rpc_pass'	=> new XML_RPC_Value($pass, 'string'),
			'rpc_blogid'=> new XML_RPC_Value($blogId, 'string'),
		);

		$this->rpc_client = new XML_RPC_Client(
			$this->userdata['path'],
			$this->userdata['server']
		);

	}

}

この場合コントローラに直接書いちゃったパターン。僕の場合はブログを扱うコンポーネントに書いてるから違和感ないけど、コントローラに書くと変ですね。うまいことやってください。

で、前項のServices_Blogging::factory部分を以下のように変更

$blog = new Blogid_MetaWeblog(
	$user,
	$password,
	$host,
	$path,
	$blogid
);

参考:PHP、XML-RPCでブログ投稿MetaWeblog編 | バレで昼寝
blogidを利用するための拡張方法を参考にさせて頂きました。ありがとうございます!

やってみたいけど技術がないんだよ・・・とお嘆きの方へ

ちょっと宣伝。

この記事の仕組みを使ったシステムの開発を5万円からお引き受けいたします。*4

たとえば・・・

  • サイトの新着情報を別のブログにも投稿したい
  • APIで取得した情報をブログの記事に整形して投稿したい
  • ECサイトの新商品情報、新着レビューなどを自動でブログに投稿したい

など、応用範囲は様々。

もちろん要件によって費用は変わりますが、CakePHPベースのアプリで簡単なものなら5万円で最短納期1日*5 で可能です。

やってみたいな?って方はお問い合わせフォームよりご連絡ください(^^)
お見積もりをご希望の方は「見積もり希望」とお書き添えいただければ無料でお見積もりいたします♪

  1. プロトコルでいいのかな?単語の使い方が間違っていたらごめんなさい。 []
  2. あとで別のサーバで使いまわすときにPEARの〇〇入れなきゃだった!ってなるのがイヤなのでσ(^_^;) []
  3. 場合によってはblogIdがusernameと異なる場合があるので6つになります。それについては次項で []
  4. CakePHPベースのアプリで、データベースに入っている情報を特定のブログにポストしたい。この程度ならもう少し安くできるかもしれません。 []
  5. 仕事が詰まっていなければなので、場合によりますがσ(^_^;) []
スポンサーリンク
336x280_1
336x280_1

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
336x280_1