I wanna be a Hateb Starというサービスを作りました。

1年以上前の記事です。役に立たないかもしれません。

I wanna be a Hateb Starというはてなブックマークで獲得したスターのランキングをサイトを作成しました。

ブコメでも質問があったので、いくつか技術的な解説をしておきます。

サイト名

“はてブスター”という言葉から一番始めに思いついたのがVip Star平井堅のPop Starでした。
スターを獲得してキラキラのはてブスターを目指して下さい。

フロントエンド

デザインをするのが面倒だったので、Bootstrapを使いました。正直デフォルトのBootstrapのデザインは微妙かなと思うのですが、とりあえずそれなりのUIを作るには便利です。

またデータバインドや機能面はAngularJSを使っています。ソート機能、フィルター機能も組み込みやすいので、大量のデータを並べるようなサイトには便利です。書きたいコードに集中できるのは楽しいです。

バックエンド

さくらインターネットのスタンダードプランで動いています。(震え声)
なのでバックエンドはPHPとMySQLです。サイトへのアクセス毎にブックマークしたユーザーを取得してキューに保存し、cronで更新用のPHPを叩いているだけです。

ユーザー認証について

はてブはしたいけど、ランキングには載りたくない人は非公開でブクマするか、メタブか何かして頂ければと。

当初、真面目にOAuthを使って認証させることを考えていました。ただ認証情報を保存したり何やかんやするのが面倒だったので、ページにはてブしたユーザーという雑なだけと確実な認証方法にしました。
http://b.hatena.ne.jp/entry/jsonlite/?url=http://hatebstar.mgzl.jp/
ここを見て集計対象のアカウントを探しています。
はてブ数が5000くらいに増えてくると一度に取得できなくなるのでその時はまた考えます。

問題点としては、少しJSONの更新が遅い点でしょうか。3分くらいは古い内容を参照してしまっている気がします。

上記のAPIを使えばどのURLでもブックマークしたユーザー一覧を取得できるので、強制的にランキングに参加させることもできるのですが、非人道的なのでやりません。

はてブで獲得した合計スター数の取得

はてブで獲得したスターの合計は
http://s.hatena.ne.jp/blog.json?uri=http://b.hatena.ne.jp/megazalrock/
ここからに取得することができます。

これはブログについた総スター数を取得するAPIなのですが、はてブのユーザーページを投げることで、はてブについた総スター数を取得することができます。スターのユーザーページで表示されるものと同じですね。

こいつを(sleepを挟みつつ)ループでチクチク取得しているだけです。

スコアについて

スコアは現状は黃スター数に各色のスターに適当な係数を掛けて足したものを利用しています。
要するに総スター数が同じでもカラースターの多いユーザーが上位になります。
計算式は下記です。

黄 + 緑 * 2 + 赤 * 3 + 青 * 4 + 紫 * 5

カラースターの倍率はもっと上げてもいいかもしれませんね。

現在ランキングに登録されているデータからスター全体に対するカラースターの割合をざっと割り出したところ

色   0.609%
緑   0.455%
赤   0.131%
青   0.021%
紫   0.002%

でした。

本当に作りたかったもの

実はもっと機能を盛りだくさんに開発しようと思っていました。

具体的にはユーザーごとのランキングとは別に、ブックマークごとのランキングを作りたかったです。ただ、ブックマーク1つ1つの情報を保存する必要があるため、サーバー負荷が半端無いので諦めました。
ブックマークごとのランキングが見られると、どんな傾向のブコメがスターを獲得しやすいかが見えて面白いかなとは思うので、何か別の方策を考えたいです。
自分のブックマークごとのランキングもはてなスターのサービスから見ることができないので、見られたら楽しそうではあります。

またスコアの計算方法ももっと複雑な物を考えていました。
現状の仕様では、基本的にスター数で比較しているだけなので、所謂”スター爆撃”を受けたり自分でスターをつけまくったりすれば、ランキング上位に入ることは簡単です。(そんなことをして何が楽しいのというのもありますが。)
なので、獲得スター数よりも、スターを付けたユーザー数を重視する計算式を考えていました。
しかしこれもブックマークごとのスター数を取得し保存する必要があるので、諦めました。

はてなへの要望

このサイトが生産している情報は適当に計算したスコア以外、殆どありません。

取得しているデータは全てはてなのAPIから取得していて、ユーザーごとのスター数等は、上記のJSONで返ってくる値そのままです。もしブックマークごとのランキングを取得する場合は、ブックマークを全て保存しておく必要があり、(ユーザー数によりますが)APIを何千回も叩かなければいけません。

  • 獲得したスターからURLの逆引き(今はURLごとのスター数しか取得できない)
  • 自分がスターを付けた対象URLの取得(現状方法はない)

この2つができれば、夢が広がりんぐですが、はてな自身でも保存していないのかもしれません。
理論上、全てのブックマークを精査すればAPIからでも生成できますが、それは全てのはてブを保存することに他ならないので、サードパーティでは実現は難しいでしょう。

何かいいアイディアが思いついたら実装するかもしれません。

はてなスター自体のUIもどうにかして下さい。

作った感想

14時間くらいで一気に作りました。ちょっと色々あってアレだったのですが、ストレス解消になって楽しかったです。
ソースやリポジトリの整理をしたら、OSSとしてgithubにでも上げようかと思います。

今後

サーバー負荷が怖いので、暫くは様子見しますが、

  • フロントエンド
    • ユーザーのアイコン表示
    • UI周りの調整
  • バックエンド
    • ランキングデータのキャッシュ
    • ランクアップ・ダウンの表示
    • 期間内のスター獲得数の表示

などなどやりたいことはまだあるので、頑張りたいです。