現役プログラマのWordPressカスタマイズ相談

WordPress(ワードプレス)のお悩み、うまくいかなくてお困りなこと、不具合調査、新規制作依頼まで、ウェブアプリケーションエンジニアがあなたをサポートします。

ロリポップからXML-RPCを使いFC2ブログへ記事投稿する

f:id:jsaz:20161211162440p:plain

契約しているロリポップサーバーにてFC2ブログへの記事投稿を定期実行させたかったのでメモ。


・CakePHP2系を使う
PEARXML-RPCを使う
FC2ブログへ記事投稿
アイキャッチを登録したい(←ここは未解決)

ブログ投稿は簡単にできます。
画像UPも簡単です、ただ記事に紐づくアイキャッチ画像に登録することが難しいようです。
FC2側で対応していないのか、手順が見つけられませんでした。。。


ロリポップからPHPで記事投稿する一般的なスクリプトをサンプルで添付しておきます。



PEARのインストール

XML-RPCを使うためにはPEARをインストールする必要があります。


Saba noteさんの
PEARをロリポップ・レンタルサーバーにインストール
が参考になったのでそのまま載せておきます。

他は省略(ググればたくさん載っています)

CakePHP2でXML-RPCを使う

クラスのヘッダーでいろいろできますが、試行錯誤が面倒だったので直接require_onceで書きました。

ini_set('include_path', '.:/home/users/0/[ユーザー]/web/lib/pear/share/pear');
require_once("XML/RPC.php"); //XML-RPC package

この記述のセットでロリポサーバーでXML-RPCを使うことができます。
他のPEARライブラリを使うときも同じような記述でいけます。

※web/lib/の中にPEARをインストールしました。

FC2ブログへ投稿するサンプルコード

以下、3つはご自身のブログに合わせて変更する必要があります。

1. FC2_BLOG_ID は FC2ブログの管理画面左上にあるブログID
2. FC2_BLOG_USER は FC2IDへログインする際のメールアドレス
3. FC2_BLOG_PASS は FC2IDへログインする際のパスワード

const FC2_BLOG_URL = "blog.fc2.com";	//FC2用定義情報
const FC2_RPC = "/xmlrpc.php";
const FC2_PORT = 80;
const FC2_BLOG_ID = "XXX";
const FC2_BLOG_USER = "XXX";	//ログインID(メールアドレス)
const FC2_BLOG_PASS = "XXX";	//ログインパスワード

//~~~~~~~~~~

private function __post_fc2($title, $contents, $thumbnail_url, $date){
  require_once("XML/RPC.php"); //XML-RPC package
  try {
	$GLOBALS['XML_RPC_defencoding'] = "UTF-8";
	//XML_RPCクライアント
	$client = new XML_RPC_client(self::FC2_RPC, self::FC2_BLOG_URL, self::FC2_PORT);
	//ブログID
	$blogid = new XML_RPC_Value(self::FC2_BLOG_ID, 'string');
	//アカウント
	$username = new XML_RPC_Value(self::FC2_BLOG_USER, 'string');
	//パスワード
	$passwd = new XML_RPC_Value(self::FC2_BLOG_PASS, 'string');
	//公開設定
	$publish = new XML_RPC_Value(false, 'boolean');
	//記事情報
	$entry_data = array();
	$entry_data['title'] = new XML_RPC_Value($title, 'string');		/タイトル記事の作成
	$entry_data['description'] = new XML_RPC_Value($contents, 'string');	//記事の内容
	$entry_data['dateCreated'] = new XML_RPC_Value($date, 'dateTime.iso8601');	//投稿日時
	$content = new XML_RPC_Value($entry_data, 'struct');
	
	//XML-RPCメソッドのセット
	$message = new XML_RPC_Message(
				'metaWeblog.newPost',
				array(
					$blogid,
					$username,
					$passwd,
					$content,
					$publish
				)
	);
	//送信
	$result = $client->send($message);
	if( !$result ){
		echo __FUNCTION__ . " error\n";
		echo "'Could not connect to the server.<br>\n";
		return false;
	}else if( $result->faultCode() ){
		echo __FUNCTION__ . " error\n";
		echo "XML-RPC fault <br>\n(".$result->faultCode()."): ".$result->faultString();
		return false;
	}
	XML_RPC_decode( $result->value() );
  } catch (Exception $ex) {
	throw new Exception($ex->getMessage());
  }
}


投稿日時は以下のような「Ymd\TH:i:s」で日付を取得したものをセットします。

$date = date("Ymd\TH:i:s");

公開設定はtrueなら即時投稿、falseなら下書き投稿となります。

//公開設定
$publish = new XML_RPC_Value(false, 'boolean');

try, catchやエラー文言、エラー分岐処理などはざっと書いたのであまり気に留めていません。
ご自身のスクリプトに合わせてください。


アイキャッチ画像は$entry_dataになんらかのキーを設定すればいいのだろうか。。。
もう少し調査と検証が必要です(:_;)