さり海馬

Thoughts walk away, blog stays.

xml-rpc で trac につないでみた

とりあえずはライブラリ・リファレンスにあるxmlrpclibを使ってみる。

必要な手順

  1. trac の管理メニューから、xml-rpc でアクセスするアカウントに XML_RPC 権限を与える
  2. リモートのクライアントからアクセスする

設定したら、公開されているAPIの名前を取得する listMethods() というやつを呼んでみる。

import xmlrpclib

server = xmlrpclib.ServerProxy(
    "http://ユーザー名:パスワード@サーバーのアドレス:tracのポート番号/trac/プロジェクト名/login/xmlrpc")

apilist = server.system.listMethods()

for item in apilist:
  print item

結果:「ProtocolError:

…なんだか認証がダメだと言っているようだ。

いろいろとごにょごにょしていると、どうもこの xmlrpclib は proxy 経由でのアクセスに対応できていないっぽい。さすがに自分では書けないなー。

一縷の望みを求めてグーグル先生におすがりしていると、まさにそのものズバリなコードを公開されている方が。

標準のxmlrpclibがシンプル過ぎて繋げないサーバーがあるので、 もう少しがんばって繋ぎに行くXML-RPCクライアントラッパーを作成しました。

…神だ。早速パクって参考にさせていただいて、やってみる。

import xml_rpc

url = 'http://ユーザー名:パスワード@サーバーのアドレス:tracのポート番号/trac/プロジェクト名/login/xmlrpc'
user, password = 'ユーザー名','パスワード'
server = xml_rpc.XmlRpcServer(url, user, password)
print server.system.listMethods()


['system.multicall', 'system.listMethods', 'system.methodHelp', 'system.methodSignature', 'system.getAPIVersion', 'ticket.query', 'ticket.getRecentChanges', 'ticket.getAvailableActions', 'ticket.get', 'ticket.create', 'ticket.update', 'ticket.delete', 'ticket.changeLog', 'ticket.listAttachments', 'ticket.getAttachment', 'ticket.putAttachment', 'ticket.deleteAttachment', 'ticket.getTicketFields', 'ticket.component.getAll', 'ticket.component.get', 'ticket.component.delete', 'ticket.component.create', 'ticket.component.update', 'ticket.version.getAll', 'ticket.version.get', 'ticket.version.delete', 'ticket.version.create', 'ticket.version.update', 'ticket.milestone.getAll', 'ticket.milestone.get', 'ticket.milestone.delete', 'ticket.milestone.create', 'ticket.milestone.update', 'ticket.type.getAll', 'ticket.type.get', 'ticket.type.delete', 'ticket.type.create', 'ticket.type.update', 'ticket.status.getAll', 'ticket.status.get', 'ticket.status.delete', 'ticket.status.create', 'ticket.status.update', 'ticket.resolution.getAll', 'ticket.resolution.get', 'ticket.resolution.delete', 'ticket.resolution.create', 'ticket.resolution.update', 'ticket.priority.getAll', 'ticket.priority.get', 'ticket.priority.delete', 'ticket.priority.create', 'ticket.priority.update', 'ticket.severity.getAll', 'ticket.severity.get', 'ticket.severity.delete', 'ticket.severity.create', 'ticket.severity.update', 'wiki.getRecentChanges', 'wiki.getRPCVersionSupported', 'wiki.getPage', 'wiki.getPageVersion', 'wiki.getPageHTML', 'wiki.getPageHTMLVersion', 'wiki.getAllPages', 'wiki.getPageInfo', 'wiki.getPageInfoVersion', 'wiki.putPage', 'wiki.listAttachments', 'wiki.getAttachment', 'wiki.putAttachment', 'wiki.putAttachmentEx', 'wiki.deletePage', 'wiki.deleteAttachment', 'wiki.listLinks', 'wiki.wikiToHtml', 'search.getSearchFilters', 'search.performSearch']

キタ━━━(゚∀゚)━( ゚∀)━( ゚)━( )━(゚ )━(∀゚ )━(゚∀゚)━━━!!!!!