被ブックマーク合計数取得API

はてなダイアリ以外にもはてなが提供しているサービスはいくつかある。はてなアンテナはてなブックマークだ。で、そのへんに関連する情報をXML-RPCを用いて問合せするAPIがあって、「被ブックマーク合計数取得API」はそのひとつ。
例のコードはPerlで書いてあるのだれども、ちょっとためしにGaucheを使って書いてみた。Gauche 0.8.8リリース記念ということで。

(use text.tree)
(use sxml.tools)
(use sxml.ssax)
(use rfc.http)

(define (make-request uri)
  (call-with-output-string
   (lambda(str-port)
     (write-tree
      `(,"<?xml version='1.0'?>"
        ,@ (sxml:sxml->xml
            `(methodCall
              (methodName "bookmark.getTotalCount")
              (params (param (value (string ,uri))))))) str-port)
     (get-output-string str-port))))

(define (parser xml)
  (string->number
   ((ssax:make-parser
     NEW-LEVEL-SEED    (lambda a '())
     CHAR-DATA-HANDLER (lambda (s1 s2 seed) s1)
     FINISH-ELEMENT
     (lambda (elem-gi attributes namespaces parent-seed seed)
       seed))
    (open-input-string xml) '())))

(define (getTotalCount uri)
  (receive (result-number headers body)
           (http-post "b.hatena.ne.jp" "/xmlrpc"
                      (make-request uri))
           (parser body)))

getTotalCountにuriを渡すとブックマーク数が返ってくる。

gosh> (getTotalCount "http://d.hatena.ne.jp/SaitoAtsushi/")
11

案外多いような少ないような。
ところで、初めてssaxを使ってみたのだけれど、なかなか使いでがありそう。今回はかなりやる気なさげな使い方しかしてないのに、これでXMLがパースできるんだから立派なものだ。実際には木の最後の末端を取得してるだけ。
Document ID: a71054a6b37691cd7e893a580712428f