hatena-star - はてなスター API

1 SYNOPSIS

(in-package :your-awesome-app)

(require "hatena-star/api")
(use-package :hatena-star.api)

;; RKS (ログインセッションごとに固有の ID, add/delete で必要)
(defvar *rks* nil)

;; はてなスターカウント API
(let ((blog (hatena-star-get-blog "http://d.hatena.ne.jp/hatenastar/")))
  ...)

;; エントリと RKS の取得
(multiple-value-bind (entries rks)
    (hatena-star-get-entries '("http://d.hatena.ne.jp/hatenastar/20071129/1196290565"
                               "http://d.hatena.ne.jp/hatenastar/20071124/1195896789"
                               "http://d.hatena.ne.jp/hatenastar/20071115/1195092449"))
  (setf *rks* rks)
  (your-cool-show-hatena-star-entry
   (mapcar #'(lambda (entry)
               ;; ☆が多くて省略されていたら再取得
               (if (hatena-star-stars-all-p entry)
                   entry
                 (hatena-star-get-entry (hatena-star-entry-uri entry))))
           entries)))

;; コメントの追加
(when (hatena-star-entry-can-comment-p entry)
  (hatena-star-add-comment (hatena-star-entry-uri entry)
                           *rks*
                           :title title
                           :body (read-string "コメント: ")))

;; 選択文字列を引用して☆の追加
(let ((title "ほげほげ")
      (quote (selection-start-end (s e) (buffer-substring s e))))
  (let ((r (hatena-star-add-star (hatena-star-entry-uri entry)
                                 *rks* :title title :quote quote)))
    (cond ((null r)
           (values nil nil))  ; ☆追加失敗
          ((string= quote (hatena-star-star-quote r))
           (values t t))      ; ☆追加 + 引用成功
          (t
           (values t nil))))) ; ☆追加成功 + 引用失敗

;; ☆の削除 (指定された entry の star を削除)
(when (hatena-star-deletable-p (hatena-star-star-name star))
  (hatena-star-delete-star (hatena-star-entry-uri entry)
                           *rks*
                           :name (hatena-star-star-name star)
                           :quote (hatena-star-star-quote star)))

2 DESCRIPTION

hatena-star は はてなスター API を xyzzy から実行するためのライブラリです。

以下のことができます。

xml-http-request を使っているので非同期にはてなスター API を実行できます。

3 INSTALL

3.1 NetInstaller でインストール

  1. NetInstaller で hatena-star をインストールします。

3.2 NetInstaller を使わずにインストール

  1. アーカイブをダウンロードします。

    <URL:http://miyamuko.s56.xrea.com/xyzzy/archives/hatena-star.zip>

  2. アーカイブを展開して、$XYZZY/site-lisp 配下にファイルをコピーします。

4 MODULE

4.1 DEPENDS

hatena-star は以下のモジュールに依存しています。別途インストールしてください。

4.2 PACKAGE

hatena-star は以下のパッケージを利用しています。

4.3 VARIABLE

hatena-star.api:*hatena-star-base-uri*
はてなスターのベース URI を指定します。 基本的には変更の必要はありません。
hatena-star.ui:*hatena-star-default-star-char*

hatena-star-make-stars-string などの関数で STAR-CHAR を省略した場合に利用する charcter です。

デフォルトは #\★ です。

hatena-star.ui:*hatena-star-default-star-color*

hatena-star-stars-insert で☆を描画するときの色です。

デフォルトは (:foreground 11) です。

hatena-star.ui:*hatena-star-inner-count-min*

hatena-star-stars-insert で☆を描画するときに、省略形式にする最小の☆の数です。

デフォルトは 16 です。

4.4 CONSTANT

なし。

4.5 CODITION

なし。

4.6 COMMAND

なし。

4.7 DATATYPE

BLOG-INFO

BLOG-INFO はブログのはてなスター情報を保持します。 BLOG-INFO は hatena-star-get-blog で取得します。

BLOG-INFO からは以下の関数で情報を取得できます。

ENTRY-INFO

ENTRY-INFO はブログエントリのはてなスター情報を保持します。 ENTRY-INFO は hatena-star-get-entries または hatena-star-get-entry で取得します。

ENTRY-INFO からは以下の情報を取得できます。

STAR-LIST

STAR-LIST はブログエントリの STAR-INFO のリストです。 STAR-LIST は hatena-star-entry-stars で取得します。

STAR-LIST からは以下の情報を取得できます。

STAR-INFO

STAR-INFO はブログエントリの☆の情報を保持します。 STAR-INFO は STAR-LIST の要素です。

STAR-INFO からは以下の情報を取得できます。

COMMENT-INFO

COMMENT-INFO はブログエントリのコメントを保持します。 COMMENT-INFO は hatena-star-entry-comments で取得します。

COMMENT-INFO からは以下の情報を取得できます。

4.8 FUNCTION

hatena-star.api:hatena-star-get-blog BLOG-URI &KEY SINCE NOMSG CALLBACK FUTURE

指定された BLOG-URI のブログのはてなスター情報を取得します。

BLOG-INFO を返します。

例:

(let ((blog (hatena-star-get-blog "http://d.hatena.ne.jp/hatenastar/")))
  (msgbox "~Aの☆は~D個です。~%~A"
          (hatena-star-blog-title blog)
          (hatena-star-blog-star-count blog)
          (hatena-star-blog-uri blog)))
hatena-star.api:hatena-star-blog-uri BLOG-INFO
ブログの URI を返します。
hatena-star.api:hatena-star-blog-title BLOG-INFO
ブログのタイトルを返します。
hatena-star.api:hatena-star-blog-star-count BLOG-INFO
ブログに付いた☆の数を返します。
hatena-star.api:hatena-star-get-entries PERMALINK-LIST &KEY SINCE NOMSG CALLBACK FUTURE

指定された PERMALINK-LIST に付けられた はてなスターの情報を取得します。

ENTRY-INFO と RKS (閲覧者情報) 多値で返します。

例:

(defvar *rks* nil)
(multiple-value-bind (entry rks)
    (hatena-star-get-entries "http://d.hatena.ne.jp/hatenastar/20071129/1196290565")
  (setf *rks* rks)
  (msgbox "~A~%~D" rks (hatena-star-stars-count entry)))

(multiple-value-bind (entries _)
    (hatena-star-get-entries '("http://d.hatena.ne.jp/hatenastar/20071129/1196290565"
                               "http://d.hatena.ne.jp/hatenastar/20071124/1195896789"
                               "http://d.hatena.ne.jp/hatenastar/20071115/1195092449"
                               "http://d.hatena.ne.jp/jkondo/20080130/1201642779"))
  (dolist (entry entries)
    (msgbox "~D: ~A"
            (hatena-star-stars-count entry)
            (hatena-star-entry-uri entry))))

☆が 15 個以上付いたエントリは☆の情報が省略され、 一部の情報 (最初の☆、間の☆の数、最後の☆) しか取得できません。

すべての☆を取得したい場合はさらに hatena-star-get-entry を呼び出す必要があります。

hatena-star.api:hatena-star-get-entry ENTRY-OR-PERMALINK &KEY SINCE NOMSG CALLBACK FUTURE

指定されたエントリに付いたはてなスターのエントリ情報を取得します。

ENTRY-INFO を返します。

この API で取得した場合、「最初の☆、間の☆の数、最後の☆」形式の省略はされません。

hatena-star.api:hatena-star-entry-can-comment-p ENTRY-INFO
そのエントリにコメントをつけることができるか返します。
hatena-star.api:hatena-star-entry-uri ENTRY-INFO
エントリの URI を返します。
hatena-star.api:hatena-star-entry-stars ENTRY-INFO

エントリから☆リストを取得します。

STAR-LIST を返します。

例:

(let* ((e (hatena-star-get-entry "http://d.hatena.ne.jp/hatenastar/20070707/1184453490"))
       (stars (hatena-star-entry-stars e)))
  (with-output-to-temp-buffer ("*Hatena:Star*")
    (format t "☆の数: ~D~%~A~%~%"
            (hatena-star-stars-count stars)
            (hatena-star-entry-uri e))
    (dolist (star stars)
      (multiple-value-bind (name quote _)
          (hatena-star-star-values star)
        (format t "~A「~A」~%" name (or quote ""))))))

☆のリストは省略されることがあります。

hatena-star.api:hatena-star-entry-comments ENTRY-INFO

エントリに付いたコメントをリストで返します。

コメントからは以下の情報を取得できます。

hatena-star.api:hatena-star-comment-name COMMENT-INFO
コメントをつけた人の名前を取得します。
hatena-star.api:hatena-star-comment-body COMMENT-INFO
コメントの本文を取得します。本文がない場合は nil を返します。
hatena-star.api:hatena-star-comment-values COMMENT-INFO
コメントをつけた人の 名前本文 を多値で返します。
hatena-star.api:hatena-star-stars-all-p ENTRY-OR-STARS

☆のリストが一切省略されていないなら t を返します。

エントリ情報と☆リストの両方を指定できます。

hatena-star.api:hatena-star-stars-by-user-p ENTRY-OR-STARS

☆のリストが☆をつけたユーザごとに集約されているなら t を返します。

エントリ情報と☆リストの両方を指定できます。

hatena-star.api:hatena-star-stars-inner-count-p ENTRY-OR-STARS

☆のリストが(最初の☆、間の☆の数、最後の☆)のみの場合 t を返します。

エントリ情報と☆リストの両方を指定できます。

hatena-star.api:hatena-star-stars-by-user ENTRY-OR-STARS &KEY LIST-QUOTE

☆のリストをユーザごとに集約します。 この関数は hatena-star-get-entry で取得した☆リストを、☆の数にかかわらずに集約形式にしたい場合に利用します。

エントリ情報と☆リストの両方を指定できます。

hatena-star.api:hatena-star-stars-inner-count-values ENTRY-OR-STARS

☆のリストから(最初の☆、間の☆の数、最後の☆)を多値で取得します。

hatena-star-stars-inner-count-p が nil でも上記形式で取得できます。

エントリ情報と☆リストの両方を指定できます。

hatena-star.api:hatena-star-stars-count ENTRY-OR-STARS
☆の総数を取得します。☆が省略されていても正しく取得可能です。
hatena-star.api:hatena-star-star-name STAR-INFO
☆をつけた人の名前を取得します。
hatena-star.api:hatena-star-star-quote STAR-INFO
☆の引用文を取得します。引用していない場合は nil を返します。
hatena-star.api:hatena-star-star-count STAR-INFO

☆をつけた人ごとの☆の個数を返します。

300 以上の☆がついたエントリ( hatena-star-stars-by-user-p が t を返す)の場合のみ値を返します。

☆の数が 300 未満の場合は nil を返します。

hatena-star.api:hatena-star-star-values STAR-INFO
☆をつけた人の 名前引用文☆の数 を多値で返します。
hatena-star.api:hatena-star-add-star ENTRY-OR-PERMALINK RKS &KEY NOMSG CALLBACK FUTURE TOKEN TITLE QUOTE

指定されたエントリに☆をつけます。

実際につけた☆の STAR-INFO を返します。

hatena-star.api:hatena-star-add-comment ENTRY-OR-PERMALINK RKS &KEY CALLBACK FUTURE TITLE BODY

指定された URI にコメントをつけます。 コメントはスターフレンドにしかつけられません。

COMMENT-INFO を返します。

hatena-star.api:hatena-star-deletable-p NAME-OR-STAR &KEY CALLBACK FUTURE

指定したユーザの☆を削除できる場合 t を返します。

基本的には自分の NAME の場合のみ t を返すはずです。 はてなにログインしていない場合は自分の NAME でも nil を返します(たぶん)。

hatena-star.api:hatena-star-delete-star ENTRY-OR-PERMALINK RKS &KEY CALLBACK FUTURE NAME QUOTE STAR

指定したエントリに付いた☆を削除します。

成功した場合は t を、失敗した場合は nil を返します。

例:

;; example.com に付けた自分の☆を一個削除
(hatena-star-delete-star "http://example.com/" *rks*)

;; example.com に "example" を引用して付けた自分の☆を一個削除
(hatena-star-delete-star "http://example.com/" *rks* :quote "foo")

;; example.com に付いている自分の☆を全部削除
(multiple-value-bind (entry rks)
    (hatena-star-get-entry "http://example.com/")
  (dolist (star (hatena-star-entry-stars entry))
    (when (hatena-star-deletable-p star) ; 手抜き。。。deletable-p の結果はキャッシュすべき
      (hatena-star-delete-star entry rks :star star))))
hatena-star.api:hatena-star-future-p OBJ
指定された OBJ が Future オブジェクトなら non-nil を返します。
hatena-star.api:hatena-star-future-completed-p FUTURE
指定された Future オブジェクトのリクエストが完了していたら non-nil を返します。
hatena-star.api:hatena-star-future-value FUTURE &REST OPTIONS

指定された Future オブジェクトから結果を取得します。 リクエストが完了していない場合は完了を待ち合わせます。

引数の詳細は xml-http-requestxhr-future-value を参照してください。

hatena-star.api:hatena-star-version

本ライブラリのバージョンを返します。 バージョンは major.minor.teeny という形式です。

それぞれの番号は必ず 1 桁にするので、以下のように比較することができます

(if (string<= "1.1.0" (hatena-star-version))
    '(1.1.0 以降で有効な処理)
  '(1.1.0 より前のバージョンでの処理))
hatena-star.ui:hatena-star-make-stars-string COUNT &KEY STAR-CHAR INNER INNER-MIN

指定された COUNT 数の☆を文字列で返します。

例:

(hatena-star-make-stars-string 15)
"★★★★★★★★★★★★★★★"
(hatena-star-make-stars-string 16 :star-char #\☆)
"☆14☆"
(hatena-star-make-stars-string 4 :inner-min 5)
"★★★★"
(hatena-star-make-stars-string 5 :inner-min 5)
"★3★"
(hatena-star-make-stars-string 3 :inner t)
"★1★"
hatena-star.ui:hatena-star-stars-to-string ENTRY-OR-STARS &KEY STAR-CHAR
指定された STAR-LIST を☆の文字列にします。
hatena-star.ui:hatena-star-stars-insert ENTRY-OR-STARS &KEY TAG STAR-CHAR COLOR
指定された STAR-LIST を☆の文字列にして現在のバッファに挿入します。

4.9 MACRO

なし。

5 SAMPLE CODE

カーソル下の URL のはてなスター情報をバッファに表示するサンプル。 URL の取得に clickable-uri をトリッキーに使ってます。

(require "clickable-uri")
(require "hatena-star/api")
(use-package :hatena-star.api)

(defun show-hatena-star-entry (entry)
  (when entry
    (macrolet ((puts (fmt &rest args)
                 `(insert (format nil ,fmt ,@args))))
      (with-output-to-temp-buffer ("*Hatena:Star*")
        (puts "☆の数: ~D~%~A~%~%"
              (hatena-star-stars-count entry)
              (hatena-star-entry-uri entry))
        (dolist (star (hatena-star-entry-stars entry))
          (multiple-value-bind (name quote count)
              (hatena-star-star-values star)
            (puts name)
            (when count
              (puts " (~D)" count))
            (when quote
              (indent-to 30)
              (puts " 「~A」" quote))
            (puts "\n")))
        (goto-char (point-min))
        (refresh-screen)))))

(defun show-hatena-star-uri-later (uri)
  (hatena-star-get-entry uri :callback #'show-hatena-star-entry))

(defun show-current-link-hatena-star ()
  (interactive)
  (let ((*clickable-uri-open-command-alist*
         (acons "^https?://" #'show-hatena-star-uri-later nil))
        (*clickable-uri-keep-focus* nil))
    (clickable-uri-open)))

(global-set-key '(#\C-c #\s) 'show-current-link-hatena-star)

6 TODO

7 KNOWN BUGS

8 AUTHOR

みやむこ かつゆき (<URL:mailto:miyamuko@gmail.com>)

9 SEE ALSO

Hatena: はてなスターカウント API とは
<URL:http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%A5%B9%A5%BF%A1%BC%A5%AB%A5%A6%A5%F3%A5%C8API?kid=217860>
何かつまらなかったのでHatenaStar.jsが利用しているAPIを調べてみた。
<URL:http://d.hatena.ne.jp/Yuichirou/20070802#1186070862>
HatenaStar.js
<URL:http://s.hatena.ne.jp/js/HatenaStar.js>

10 COPYRIGHT

hatena-star は MIT/X ライセンスに従って本ソフトウェアを使用、再配布することができます。

See hatena-star/docs/MIT-LICENSE for full license.

11 NEWS

11.1 2008-07-12 / 1.1.1

hatena-star 1.1.1 リリース!

新規機能
非互換を含む変更点
バグ修正
その他

11.2 2008-03-09 / 1.1.0

hatena-star 1.1.0 リリース!

新規機能
非互換を含む変更点
バグ修正
その他

11.3 2008-03-03 / 1.0.3 / ひなまつり

hatena-star 1.0.3 リリース!

新規機能
非互換を含む変更点
バグ修正

11.4 2008-02-24 / 1.0.2

hatena-star 1.0.2 リリース!

新規機能
非互換を含む変更点
バグ修正

11.5 2008-02-23 / 1.0.1

hatena-star 1.0.1 リリース!

新規機能
非互換を含む変更点
バグ修正

11.6 2008-02-17 / 1.0.0

hatena-star 1.0.0 リリース!

新規機能
非互換を含む変更点
バグ修正

11.7 2008-02-11 / 0.1.0 / 建国記念の日

hatena-star 0.1.0 リリース!

このリリースは人柱er 向けプレビューです (ときどき xyzzy がクラッシュするので)。