work.log

元エンジニアの備忘録的ブログ

PerlからWordPressを操作する

投稿:2014-03-21 11:33  更新:

Perl から WordPress を操作するメモです。

モジュールが何種類かあるのでちょっと迷ったんですが、RPC::XML::Client が使いやすそうに見えたのでこれで試してみました。

WordPress に接続するサンプル

まずは WordPress の xmlrpc.php へ接続して blogid を取得してみます。

メソッドの操作には殆んどの場合 blogid とログイン情報がセットで必要です。

うろ覚えですが、ブログが 1 つしかない場合は「1」を直接指定してもいけますが、マルチサイトとかだとコレが違ったはずなので、初回接続の時に blogid を取得するようにしてみました。

#!/usr/bin/perl

use strict;
use warnings;
use RPC::XML::Client;
use Encode;

    # WordPress の認証情報
    my $param = {
           server => 'http://example.jp/xmlrpc.php',
           user   => 'username',
           pass   => 'userpass'
       };

    # $param を XML 形式にエンコードしておく
    my $xml = {
           appkey => RPC::XML::string->new(''),
           user   => RPC::XML::string->new($param->{user}),
           pass   => RPC::XML::string->new($param->{pass})
       };

    # XML-RPC クライアントオブジェクトの作成
    my $xmlrpc = RPC::XML::Client->new($param->{server});
    my ($req, $res, $title);

    # リクエストの作成
    # 'blogger.getUsersBlogs' を使う
    $req = RPC::XML::request->new(
        'blogger.getUsersBlogs',
        $xml->{appkey},
        $xml->{user},
        $xml->{pass}
    );

    # リクエスト送信はサブルーチンへ投げる
    $res = &send_xmldata($xmlrpc, $req);

    # $xml に返ってきた blogid をエンコードして入れる
    $xml->{blogid} = RPC::XML::string->new(@{$res->value}[0]->{blogid});

sub send_xmldata {

    my ($xmlrpc, $req) = @_;

    # リクエストを送信
    my $res = $xmlrpc->send_request($req);

    # エラー時の処理
    if ($res =~ /error/) {

        print "ERROR: $res\n";
        exit;

    } elsif ($res->is_fault) {

        my $msg = encode('utf-8', $res->value->{faultString});

        print "ERROR: $msg\n";
        exit;

    }

    return($res);

}

exit;

これで OK です。

WordPress の投稿タイトルを取得するサンプル

blogid が取得できたので、次は WordPress の記事情報を取得してみようと思います。

先ほどのコードを下記のようにして実行してみます。

#!/usr/bin/perl

use strict;
use warnings;
use RPC::XML::Client;
use Encode;

    # WordPress の認証情報
    my $param = {
           server => 'http://example.jp/xmlrpc.php',
           user   => 'username',
           pass   => 'userpass'
       };

    # $param を XML 形式にエンコードしておく
    my $xml = {
           appkey => RPC::XML::string->new(''),
           user   => RPC::XML::string->new($param->{user}),
           pass   => RPC::XML::string->new($param->{pass})
       };

    # XML-RPC クライアントオブジェクトの作成
    my $xmlrpc = RPC::XML::Client->new($param->{server});
    my ($req, $res, $title);

    # リクエストの作成
    # 'blogger.getUsersBlogs' メソッドを使う
    $req = RPC::XML::request->new(
        'blogger.getUsersBlogs',
        $xml->{appkey},
        $xml->{user},
        $xml->{pass}
    );

    # リクエスト送信はサブルーチンへ投げる
    $res = &send_xmldata($xmlrpc, $req);

    # $xml に返ってきた blogid をエンコードして入れる
    $xml->{blogid} = RPC::XML::string->new(@{$res->value}[0]->{blogid});

    # 取得する投稿 id
    my $post_id = 1234;

    # リクエストの作成
    # 'wp.getPost' メソッドを使う
    $req = RPC::XML::request->new(
        'wp.getPost',
        $xml->{blogid},
        $xml->{user},
        $xml->{pass},
        RPC::XML::string->new($post_id)
    );

    $res = &send_xmldata($xmlrpc, $req);
    $title = encode('utf-8', $res->value->{post_title});

    print "TITLE: $title\n";

sub send_xmldata {

    my ($xmlrpc, $req) = @_;

    # リクエストを送信
    my $res = $xmlrpc->send_request($req);

    # エラー時の処理
    if ($res =~ /error/) {

        print "ERROR: $res\n";
        exit;

    } elsif ($res->is_fault) {

        my $msg = encode('utf-8', $res->value->{faultString});

        print "ERROR: $msg\n";
        exit;

    }

    return($res);

}

exit;

成功するとこんな感じに取得できます。

$ perl xmlrpc_client.pl
TITLE: WordPressの自動投稿ツール作成 その7

ついでにエラーの一例。

ホスト名が間違っててサーバへ接続できない時。

$ perl xmlrpc_client.pl
ERROR: RPC::XML::Client::send_request: HTTP server error: Can't connect to example.com:80 (Bad hostname)

認証失敗時。

$ perl xmlrpc_client.pl
ERROR: ユーザー名またはパスワードが正しくありません。

こんな感じにできました。

WordPress 限定で使うなら、既にメソッドが用意されている WordPress::XMLRPC を使うのも便利かもしれません。

簡単ですが Perl から WordPress を操作するは以上です。

おすすめのVPSサーバ

  • OSが選べる
  • VPS同士でLANが組める
  • 複数台構成向き

このブログで使っています。

  • 転送量が多いサービスに
  • 借りてるのは3年間一度もdown無し!

よく見られている記事

  • 本日
  • 週間
  • 月間