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 を操作するは以上です。