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(
'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.
<strong>server = xmlrpclib.Server(XML_SERVER_URL)</strong>
# Call the server and get our result.
<strong>result = server.example.get_addr(USERNAME, PASSWORD)</strong>
ip_addr = result['ip_addr']
print 'IP Address: ' . ip_addr
トラックバック URL:
https://perltips.twinkle.cc/trackback/253