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