Let's write β

プログラミング中にできたことか、思ったこととか

CommonLispではてなブックマークAPI

ちょっと情報を抽出したい事があったので、片手間ですが、つくってみました。

(ql:quickload :drakma)
(ql:quickload :cl-json)

(setq drakma:*text-content-types* 
      (cons '("application" . "json") 
            drakma:*text-content-types*))
(setq drakma:*header-stream* nil)

(defun get-hatebu-info (url)
  (json:decode-json-from-string
    (drakma:http-request 
      (format nil "http://b.hatena.ne.jp/entry/json/~A"
              url))))

(defclass <bookmark-entry> ()
  ((title :initarg :title :accessor title)
   (url :initarg :url :accessor url)
   (entry-url :initarg :entry-url :accessor entry-url)
   (screenshot :initarg :screenshot :accessor screenshot)
   (eid :initarg :eid :accessor eid)
   (related :initarg :related :accessor related)
   (bookmarks :initarg :bookmarks :accessor bookmarks)))

(defclass <user-bookmark> ()
  ((timestamp :initarg :timestamp :accessor timestamp)
   (user :initarg :user :accessor user)
   (tags :initarg :tags :accessor tags)
   (comment   :initarg :comment   :accessor comment)))

(defun parse-book-mark-info (info)
  (let ((bookmarks (cdr (assoc :bookmarks info)))
        (related (cdr (assoc :related info))))
    (make-instance '<bookmark-entry>
                   :title (cdr (assoc :title info))
                   :url (cdr (assoc :url info))
                   :entry-url (cdr (assoc :entry--url info))
                   :eid (cdr (assoc :eid info))
                   :screenshot (cdr (assoc :screenshot info))
                   :bookmarks
                   (loop for bk in bookmarks
                         collect (make-instance '<user-bookmark>
                                                :timestamp (cdr (assoc :timestamp bk))
                                                :tags (cdr (assoc :tags bk))
                                                :user (cdr (assoc :user bk))
                                                :comment   (cdr (assoc :comment bk))))
                   :related
                   (loop for rt in related 
                         collect (make-instance '<bookmark-entry>
                                                :title (cdr (assoc :title rt))
                                                :url (cdr (assoc :url rt))
                                                :entry-url (cdr (assoc :entry--url rt))
                                                :eid (cdr (assoc :eid rt)))))))

(defun get-hatebu (url)
  (parse-book-mark-info (get-hatebu-info url)))

こんな感じで情報がひっぱれてます。

(comment (car (bookmarks (get-hatebu "http://common-lisp.net/project/cl-json/"))))
=>"lispのリスト構造をJSONで表現"