WordPressに自動で記事を投稿するPHPプログラム を書いてみた

ブログ自動投稿

WordPressに自動で記事を投稿するPHPプログラム を書いてみた。
先日FC2ブログに自動投稿するプログラムを書いたが、そのまま転用してWordpressに使えるかテストしてみたところ問題なく投稿できた。
せっかくなので公開しておきます。
基本的にはFC2用と同じですが、コメント等を若干書き換えてます。
ベースはこちらの記事を参照

FC2ブログに自動で記事を投稿するPHPプログラム 書いてみた。

コードだらけで見にくいですが、変更箇所のコメントがある変数の値を書き換えるだけです。
簡単に説明すると
ドメイン:http://marumusi.yahoo.com
WordPressディレクトリ:http://marumusi.yahoo.com/wp
WordPressユーザー名:admin
WordPressパスワード:password

だとすると
$wp_host = “marumusi.yahoo.com”;
$wp_xmlrpc_path = “/wp/xmlrpc.php”;
$wp_user = “admin”;
$wp_passwd = “password”;

となります。
ブロブ自動投稿プログラム

<?php
require_once("XML/RPC.php"); //XML-RPC package
$GLOBALS['XML_RPC_defencoding'] = "UTF-8";

//WordPress用定義情報
$wp_blogid = "";
// //////////////////////////////
// 変更箇所
// //////////////////////////////
//Wordpressが導入されているドメインを記入
$wp_host = "marumusi.yahoo.com";
//Wordpressのディレクトリ配下のxmlrpc.phpを記入
$wp_xmlrpc_path = "/wp/xmlrpc.php";
//ブログのログインIDを記入
$wp_user = "admin";
//ブログのログインパスワードを記入
$wp_passwd = "password";
//記事情報
//投稿モード(0:下書記事、1:公開記事)
$kiji_mode = 1;
//記事のタイトル
$kiji_title = "WordPressに自動で記事を投稿するPHPプログラム のテスト記事(タイトル)";
//記事の本文
$kiji_honbun = "WordPressに自動で記事を投稿するPHPプログラム のテスト記事(本文)<br /><br />
このサンプルプログラムの詳細は、<a href=\"http://antenna.infomixer.net/\">まるむしアンテナ</a>のブログにて。<br />";
// //////////////////////////////
//以下固定
$bm = new BlogManager();
$bm->post_blog($kiji_mode,$kiji_title,$kiji_honbun);

class BlogManager {
    function post_blog($kiji_mode,$kiji_title,$kiji_honbun){
        global $wp_xmlrpc_path,$wp_host,$wp_user,$wp_passwd;
        //クライアントの作成
        echo "クライアント作成<br\n>";
        $c = new XML_RPC_client( $wp_xmlrpc_path, $wp_host, 80 );
       
        //送信データ
        $blogid   = new XML_RPC_Value($wp_blogid, 'string');
        $username = new XML_RPC_Value($wp_user,   'string');
        $passwd   = new XML_RPC_Value($wp_passwd, 'string');
        $content  = new XML_RPC_Value(array(
        'title'      => new XML_RPC_Value($kiji_title,  'string'),
        'description'=> new XML_RPC_Value($kiji_honbun, 'string'),
        'dateCreated'=> new XML_RPC_Value(date("Ymd\TH:i:s",time()), 'dateTime.iso8601')
        ), 'struct');
        $publish  = new XML_RPC_Value($kiji_mode, 'boolean');
        //XML-RPCメソッドのセット
        $message = new XML_RPC_Message('metaWeblog.newPost',array($blogid, $username, $passwd, $content, $publish) );
       
        $this->send_message($c,$message);
       
    }
   
    function get_users_blogs(){
        global $wp_xmlrpc_path,$wp_host,$wp_user,$wp_passwd;
        //クライアントの作成
        echo "クライアント作成<br\n>";
        $c        = new XML_RPC_client( $wp_xmlrpc_path, $wp_host, 80 );
        $appkey   = new XML_RPC_Value ( ''         , 'string' );
        $username = new XML_RPC_Value ( $wp_user  , 'string' );
        $passwd   = new XML_RPC_Value ( $wp_passwd, 'string' );
       
        //メッセージ作成
        echo "メッセージ作成<br\n>";
        $message = new XML_RPC_Message( "blogger.getUsersBlogs",array($appkey, $username, $passwd) );

        send_message($c,$message);
    }
   
    function send_message($c,$message){
        //メッセージ送信
        echo "メッセージ送信<br\n>";
        $result  = $c->send($message);
       
        if( !$result  ){
             exit('Could not connect to the server.');
        }else if( $result ->faultCode() ){
             exit('XML-RPC fault ('.$result ->faultCode().'): '
                 .$result ->faultString());
        }
       
        return $result ;
    }
}
?>

ファイルが良ければこちらからダウンロードしてちょ。 wp_blog.txt
拡張子がphpのままだとアップできないのでtxtに変更してあります。
ダウンロードしたら wp_blog.txtwp_blog.php に変更してください。
とりあえず動かしてみたい場合は、
ソースの$wp_host,$wp_xmlrpc_path,$wp_user,$wp_passwdを自分のものに書き換えて、
phpが実行できるホームページエリアにアップロードして実行すれば動きます。
実行の仕方は、たとえば、
http://anatano_hp.com/wp_blog.php
といった感じですね。
ちなみにFC2の無料ホームページでは、phpの実行は禁止されています。
まるむしはxreaというところにもサーバーを持っているのでそちらからテストしました。
正常に動くと、ブラウザには、
クライアント作成
メッセージ送信
と2行表示されます。
これでもうあなたのブログにサンプルの記事が投稿されているはずです。
あとはソース中にコメントを書いておいたので参考にしてください。
あまり突っ込んだテストはしていないのでコード中に不備があるかもしれませんが、
まぁサンプルプログラムということで^^;)

コメント

  1. baku より:

    初めまして。
    当記事を参考にさせていただき、プログラムを作りました。
    $wp_host,$wp_xmlrpc_path,$wp_user,$wp_passwdを自分のものに書き換えて実行したのですが、以下のメッセージが表示されます。
    ----------------------------------------–
    クライアント作成
    Notice: Undefined variable: fc2_blogid in C:\xampp\htdocs\wordpressauto2.php on line 39
    メッセージ送信
    Notice: Undefined index: lv in C:\xampp\php\PEAR\XML\RPC.php on line 551
    Notice: Undefined index: lv in C:\xampp\php\PEAR\XML\RPC.php on line 555
    Notice: Undefined index: lv in C:\xampp\php\PEAR\XML\RPC.php on line 551
    Notice: Undefined index: lv in C:\xampp\php\PEAR\XML\RPC.php on line 555
    XML-RPC fault (2): Invalid return payload: enable debugging to examine incoming payload
    ----------------------------------------–
    この場合は、
    クライアント作成、メッセージ送信
    と表示されてますし、ErrorではなくNoticeなので問題ないのでしょうか?
    ワードプレスを見てみると、投稿されてなかったので何か問題なのかなと思ってます。
    宜しくお願い致します。

  2. まるむし より:

    コメントありがとうございます。
    まるむしもさほど詳しいわけでもなく結構試行錯誤しました。
    line 39ということは、new XML_RPC_Valueなので、
    1行目のrequire_once("XML/RPC.php"); しているモジュールをコールした途端にエラーを吐いたという事ですね。
    XML-RPC fault (2): Invalid return payload: enable debugging to examine incoming payload
    で実際問題として投稿されていない訳ですから解決しないわけにいかないようです。
    どうもRPC.phpを取り巻く環境に問題があるような雰囲気ですね。
    実際まるむしがいい加減に立てたテストサーバーではうまく動かなかった記憶があります。
    いい加減に立てたサーバーなので、問題になりそうな箇所は多々あるためそれ以上は追求しなかったのですが。。。
    実行環境を変えるだけですんなり動くのではないでしょうか?
    もしかして自宅サーバーかな?
    「Invalid return payload: enable debugging to examine incoming payload」でググると結構ヒントが得られるかも。
    解決策じゃなくてゴメンナさい^^;

  3. 三井 より:

    非常に興味深いスクリプトですね。
    早速実装してみたところ、投稿できた旨の2行は出るのですが、その下に以下のメッセージも出ます。
    Could not connect to the server.
    まんま読みますと、存在していません?、でしょうか。
    記事の方は投稿されていませんでした。
    解決策をご教授いただけますか?

  4. nou より:

    記事を拝見いたしました。
    さっそく試してみたのですが投稿できません。
    エラー?メッセージが以下になります。
    もしエラー内容にお心あたりございましたら、ぜひ教えてください。よろしくお願いいたします。
    EACCELERATOR: Open for write failed for "/tmp/eaccelerator/6/7/eaccelerator-5502.754746733": No such file or directory
    EACCELERATOR cached: "/home/[ID]/[ドメイン]/public_html/createarticle.php"
    EACCELERATOR: Open for write failed for "/tmp/eaccelerator/8/c/eaccelerator-3502.197935": No such file or directory
    EACCELERATOR cached: "/usr/share/pear/XML/RPC.php"
    X-Powered-By: PHP/5.3.3
    Content-type: text/html
    クライアント作成メッセージ送信EACCELERATOR: Open for write failed for "/tmp/eaccelerator/2/c/eaccelerator-3502.686935": No such file or directory
    EACCELERATOR cached: "/usr/share/pear/PEAR.php"
    Could not connect to the server.

  5. まるむし より:

    心当たりはありませんが、メッセージを見るとEACCELERATORがエラーを吐いているようですね。
    まるむしは、EACCELERATORというものはつかっていませんが、これはプリンコンパイラですかね。
    コンパイル済みの実行コードをキャッシュしておくことにより高速化するようですが、
    エラー内容を素直に読むと、
    キャッシュしておいたはずのものが見つからないとEACCELERATORがぼやいています。
    なにかテストプログラムなどを作って実行した場合は正常に動くのでしょうか?
    キャッシュ先のフォルダーに書き込み権限があるのか?など調べてみましたか?
    (フォルダーは実在するのか? 権限は777になっているのかなどね^^)
    まずはEACCELERATORのエラーをとることが先決かと…
    EACCELERATORを外してみるのも手ですかね。

  6. nou より:

    ありがとうございます。
    正直、わかりませんがやってみます。
    ありがとうございました!

  7. だいご より:

    >>4
    変数が
    $wp_xmlrpc_path
    $wp_・・・
    ですが、関数の中身が
    $fc2_xmlrpc_path
    $fc2_・・・
    FC2用のままなのでコピペのあとに変更してみて下さい。

  8. まるむし より:

    ご指摘ありがとうございます。
    たしかに、$fc2のまんまですね。^^;
    FC2ブログ版の焼き直し記事で変換漏れですね。
    文中にある「[太字]wp_blog.txt[/太字]」をダウンロードしてもらうと実際に実行させたプログラムがベースなので正しいです。
    先ほどテストしたら正常に投稿できたので間違いないです。

  9. バース より:

    素晴らしいスクリプトありがとうございます。
    早速試してみたところ動作しました!!感動です。
    スクリプトが理解できていないため、いじることができないのですが、投稿時のカテゴリを選択する事って可能なのでしょうか?
    もし可能でしたら、ご教授お願いいたします。

  10. まるむし より:

    そうですねぇ…
    実はこの記事を書いたときに少しテストしたのですがうまく行きませんでした。
    もうひとつ投稿日の設定もうまく行かなかったのですが、最近記事にも書いたように現在は問題なく設定できます。
    以前はwordpressにバグがありうまく行かなかったんですよ。
    もしかするとカテゴリのコントロールも、現バージョンでテストすると成功するかもしれませんが、今のところ試していません。ごめんなさい。
    (単に技量不足の可能性もあり^^;)
    また成功しましたら掲載させていただきます。

  11. バース より:

    まるむしさん
    お返事ありがとうございます!!
    楽しみにしています☆

  12. mfl より:

    記事を読みました。
    //Wordpressのディレクトリ配下のxmlrpc.phpを記入
    $wp_xmlrpc_path = "/wp/xmlrpc.php";
    とありますが、これを自分の物に変更するというのはどういう事になるんでしょうか?
    また、1つめの導入されてるドメインというのは、アップロードしてるサーバーのドメインでいいんですよね?
    ログインのidとパスもワードプレスの編集ページへのログイン、パスというのは分かるんですが、上記のディレクトリ配下というのがよく分からないです。
    良かったら分かりやすく教えてほしいです。

  13. まるむし より:

    まぁ見様見真似で適当にやってうまく行ったというだけのまるむしに解説をといわれても困っちゃうんですけど^^;
    多分混乱の原因は、xmlrpc.phpという名前にあると思うのですが…
    「名前が一緒だからって同一人物だと思ったら大間違いだぜ!へっへっへっ。」
    ということです。
    2つのファイルの中身は全然違いますよ。
    最初のはこのプログラムが実行されるサーバー環境に導入されているものですね。
    XML-RPCを実装しているもです。
    もうひとつはWPが導入されている側のサーバーというかWPがXML-RPCでの投稿を実現するためのものですね。
    まぁ簡単に言うと送りと受けです。
    勉強のために難しい話が聞きたいならまるむしでは無理ですのでこちらを見ましょう。
    http://pear.php.net/manual/ja/package.webservices.xml-rpc.api.php
    http://pear.php.net/manual/ja/package.webservices.xml-rpc.intro.php
    >また、1つめの導入されてるドメインというのは、アップロードしてるサーバーのドメインでいいんですよね?
    本プログラムをアップロードして実行するサーバーのことですね?
    そうです。
    このブログを書いたときは、WPの導入したレンタルサーバーではこのパッケージが導入されていなかったようでうまく行かず、
    本プログラムをA(仮名)サーバーで実行し、B(仮名)サーバーのWPに投稿しました。
    現在は、自前サーバーにWPを入れており、パッケージも導入しましたので、1サーバーで完結しています。
    >上記のディレクトリ配下というのがよく分からないです。
    WPを導入すると「xmlrpc.php」と言うファイルがあると思いますよ。
    ようするに、$wp_hostと$wp_xmlrpc_pathとで、
    http://marumusi.yahoo.com/wp/xmlrpc.php
    というようにパス成立すればよしということです。
    実際やってみてください。(ブラウザのURLに入力して)
    「XML-RPC server accepts POST requests only.」
    とメッセージが出ればパスは合ってます。

タイトルとURLをコピーしました