xmlrpclib

xmlrpclibを使ってみます。

基本的にはこれだけです。簡単ですね。以下ははてなの公開APIを使った例です。


はてなダイアリーキーワード連想語API

import xmlrpclib

s = xmlrpclib.ServerProxy('http://d.hatena.ne.jp/xmlrpc')
r = s.hatena.getSimilarWord({'wordlist': ['Hatena', 'Python']})
print ', '.join(w['word'] for w in r['wordlist'])

実行結果

ReportLab, はてな伝説, ISBN:, 言語, アプリ, :detail, モジュール, VM, ビルド, Nokia, 付属, シンプル, Guido van Rossum, ...

再帰的にゲット(数が多くなるので最大でも10個ずつに限定)

# getword.py
import sys
import xmlrpclib

def get(s, w, n, p=''):
  for i in s.hatena.getSimilarWord({'wordlist': w})['wordlist'][:10]:
    print p+i['word'].encode('euc-jp')
    if n:
      get(s, i['word'], n-1, p+'-')

s = xmlrpclib.ServerProxy('http://d.hatena.ne.jp/xmlrpc')
get(s, sys.argv[2:], int(sys.argv[1]))

実行例

> python getword.py 2 hatena apple
GUI
-MacOS
--はてなダイアリーFAQ「その他のFAQ」
--2000年
--マルチタスク
--NeXT
--業界
--パーソナルコンピューター
--Mac
--リリース
--クリエイター
--Apple社
-1984年
--柴田あゆみ
--Apple
--Macintosh
--6月13日
--金田美香
--10月7日
--ひまわり
--水泳
--1949年
--3月29日
...

はてなダイアリーキーワード自動リンクAPI

# -*- coding: euc-jp -*-
import xmlrpclib

s = xmlrpclib.ServerProxy('http://d.hatena.ne.jp/xmlrpc')
r = s.hatena.setKeywordLink({'body': 'はてなダイアリーのキーワードをリンクして!',
                             'score': 20,
                             'cname': ['book', 'movie'],
                             'a_target': '_blank',
                             'a_class': 'keyword'})
print r.encode('euc-jp')

実行結果

はてなダイアリーの<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%a5%ad%a1%bc%a5%ef%a1%bc%a5%c9">キーワード</a>をリンクして!

はてなダイアリーキーワード連想語APIで取得したキーワードをはてなダイアリーキーワード自動リンクAPIでリンクする(全カテゴリのキーワードをリンクするためにcnameを省略)

# getword_setlink.py
import sys
import xmlrpclib

s = xmlrpclib.ServerProxy('http://d.hatena.ne.jp/xmlrpc')
for w in s.hatena.getSimilarWord({'wordlist': sys.argv[1:]})['wordlist']:
  print s.hatena.setKeywordLink({'body': w['word'].encode('euc-jp'),
                                 'a_target': '_blank',
                                 'a_class': 'keyword'}).encode('euc-jp')

実行例

> python getword_setlink.py りんご
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%c5%a3%b5%dc%cd%fd%b7%c3">釘宮理恵</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%a5%ea%a5%f3%a5%b4">リンゴ</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/TOWER%20RECORDS">TOWER RECORDS</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/HIPHOP">HIPHOP</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%a5%ec%a5%d3%a5%e5%a1%bc">レビュー</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/2004%c7%af">2004年</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%a5%a2%a5%eb%a5%d0%a5%e0">アルバム</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/ken">ken</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%c8%af%c9%bd">発表</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/bounce">bounce</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%a5%c0%a5%e1%a5%ec%a5%b3">ダメレコ</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/MC">MC</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/Da%2eMe%2eRecords">Da.Me.Records</a>
<a class="keyword" target="_blank" href="http://d.hatena.ne.jp/keyword/%a5%ec%a1%bc%a5%d9%a5%eb">レーベル</a>

気がついたことなど

  • APIに食わせた結果として返ってくる文字列はunicode
    • printするだけなら勝手にコンソールの文字コードエンコードされる
    • リダイレクト(python getword_setlink.py りんご > r とか)したいときなどは明示的にencodeする必要がある
  • APIに日本語を食わせるときはunicodeのままではなく、何らかの文字コードにencodeする必要がある(だけど何故かutf8だと化けることがある)
    • ファイルの先頭で -*- coding: euc-jp -*- と書いて、同じ文字コードで保存すると、ファイル中の日本語は指定した文字コード(この場合はeuc-jp)であると認識される
    • sys.argvで日本語を受け取った場合、コンソールの文字コードになる