Python で、XMLRPC を使う。

Python で XMLRPC を扱うには、涙がちょちょぎれる(死語?)ほど簡単であった。XMLRPC サーバ側を Drupal にすると、その生産性は何倍にもなるであろう。

そこでまず、

  • XMLRPC サーバとしての Drupal 側ではアクセスしてきた XMLRPC クライアントの IP アドレスを返してあげる機能

すなわち get_addr メソッドを実装する。そして

  • Drupal にアクセスして get_addr メソッドをコールする Python の XMLRPC クライアント

を考えてみる。

しかも Drupal の XMLRPC サーバには、Drupal のユーザー名とパスワード(今回は admin / password)でログインチェックも行うようにする。

<?php define('EXAMPLE_PRIVILEGE_ACCESS', 'access to this server'); /** * Implementation of hook_perm(). * Define the permissions this module uses */ function example_perm() { return array(EXAMPLE_PRIVILEGE_ACCESS); } function example_xmlrpc() { return array( <pre> 'example.get_addr' => '_example_get_addr' ); } /** * Return a bootstrap servers * @return a bootstrap servers */ function _example_get_addr($username = NULL, $password = NULL) { _example_validate_user($username, $password); $ip_addr = $_SERVER['REMOTE_ADDR'] ? $_SERVER['REMOTE_ADDR'] : '0.0.0.0'; return array(
'ip_addr' => $ip_addr
); } /** * Ensure that the given user has permission. */ function _example_validate_user($username, $password) { global $user; $user = user_authenticate($username, $password); if ($user->uid) {
return user_access(example_PRIVILEGE_ACCESS, $user);
} return FALSE; } ?>

Python の XMLRPC クライアントは以下の通り。太字で示した部分。こんな簡単でいいのだろうか?

import socket # Drupal's URL, username and password XML_SERVER_URL = 'https://yourdomain.com/xmlrpc.php'; USERNAME = 'admin' PASSWORD = 'password' # Create an object to represent our server. server = xmlrpclib.Server(XML_SERVER_URL) # Call the server and get our result. result = server.example.get_addr(USERNAME, PASSWORD) ip_addr = result['ip_addr'] print 'IP Address: ' . ip_addr