ロリポップからXML-RPCを使いFC2ブログへ記事投稿する
契約しているロリポップサーバーにてFC2ブログへの記事投稿を定期実行させたかったのでメモ。
・CakePHP2系を使う
・PEARのXML-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になんらかのキーを設定すればいいのだろうか。。。
もう少し調査と検証が必要です(:_;)