購読者数とブックマーク数のログを記録する

Google Readerも、Fastladderも、とっくの昔に終了しているのに、自分のMacBookの中ではRSS_counter.appが、その購読者数のログを綿々と記録し続けていた。


いかん、いかん、何とかせねばならない...。

何を記録すべきか?

というわけで...

Feedlyの購読者数を取得する

  • 上記URLが意味するところは、以下のような感じ。
APIのパス http://cloud.feedly.com/v3/feeds/
feed/購読者数を調べたいブログのURL          feed/http://d.hatena.ne.jp/zariganitosh/rss
feed/購読者数を調べたいブログのURL(エスケープ)   feed%2Fhttp%3A%2F%2Fd.hatena.ne.jp%2Fzariganitosh%2Frss
  • そして、上記URLは以下のようなJSONを返した。
{"id":"feed/http://d.hatena.ne.jp/zariganitosh/rss","feedId":"feed/http://d.hatena.ne.jp/zariganitosh/rss","title":"ザリガニが見ていた...。","velocity":1.2,"subscribers":1542,"language":"ja","topics":["iPhone Blog 39","Mac","APPLE","Subscriptions","iPhone"],"website":"http://d.hatena.ne.jp/zariganitosh/","visualUrl":"http://www.st-hatena.com/users/za/zariganitosh/user_p.gif?","description":"ザリガニが見ていた...。"}
ワンライナー作り

以上の仕組みから、URLを与えたらその購読者数を返すワンライナーを考える。

$ URL=http://d.hatena.ne.jp/zariganitosh/
$ echo feed/${URL}rss|nkf -wMQ|tr = %
feed%2Fhttp%3A%2F%2Fd%2Ehatena%2Ene%2Ejp%2Fzariganitosh%2Frss
$ echo feed/${URL}rss|nkf -wMQ|tr = %|xargs -I{} curl --silent http://cloud.feedly.com/v3/feeds/{}
{"id":"feed/http://d.hatena.ne.jp/zariganitosh/rss","feedId":"feed/http://d.hatena.ne.jp/zariganitosh/rss","title":"ザリガニが見ていた...。","velocity":1.2,"subscribers":1542,"language":"ja","topics":["iPhone Blog 39","Mac","APPLE","Subscriptions","iPhone"],"website":"http://d.hatena.ne.jp/zariganitosh/","visualUrl":"http://www.st-hatena.com/users/za/zariganitosh/user_p.gif?","description":"ザリガニが見ていた...。"}
  • 手順3:上記JSONから"subscribers"の値を読み取る。
    • カンマ「,」を行区切り、コロン「:」をフィールド区切りとみなしてawkで処理した。
$ echo feed/${URL}rss|nkf -wMQ|tr = %|xargs -I{} curl --silent http://cloud.feedly.com/v3/feeds/{}|awk -F: -v RS=, '/subscribers/{print $2}'
1542

はてなブックマーク合計数を取得する

  • XML-RPCのことはよく知らないのだが、上記解説ページのサンプルコードをそのまま使うと、ブックマーク合計数が取得できた。

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

...中略...

サンプルプログラム

...中略...

#!/usr/local/bin/perl
use strict;
use warnings;
use XMLRPC::Lite;

my $url = shift or die "usage $0 <url>";
our $EndPoint = 'http://b.hatena.ne.jp/xmlrpc';

my $count = XMLRPC::Lite
    ->proxy($EndPoint)
    ->call('bookmark.getTotalCount', $url)
    ->result;

print $count, "\n";
はてなブックマーク件数取得API - Hatena Developer Center
  • 上記スクリプトをget_all_count.plとして保存して、以下のコマンドで取得できた。
$ perl ~/Desktop/get_all_count.pl http://d.hatena.ne.jp/zariganitosh/
19348
ワンライナー作り
  • 必要最小のモジュールXMLRPC::Liteだけ組み込み、変数の代入は使わず、XMLRPC::Liteの引数に直接指定してみた。
$ URL=http://d.hatena.ne.jp/zariganitosh/
$ perl -mXMLRPC::Lite -e 'print XMLRPC::Lite->proxy("http://b.hatena.ne.jp/xmlrpc")->call("bookmark.getTotalCount", $ARGV[0])->result' $URL
19348

AppleScriptに仕上げる



property rss_url : "" --"http://d.hatena.ne.jp/XXXX/" --購読者数を確認したいURL(最後のrssパスは不要)

on run
init() end run

on idle
main() return 3600
end idle

on reopen
main() tell application "Console" to activate
end reopen




on init() if rss_url = "" then save_rss_url() touch_rss_log() end init

on main() set rss_livedoor to livedoor_reader_count() set rss_feedly to feedly_feeds_count() set rss_total to rss_livedoor + rss_feedly
set hatena_b to hatena_bookmark_total_count() set rss_log to datetime() & "購読者=" & rss_total & " (livedoor=" & rss_livedoor & ", feedly=" & rss_feedly & ") はてなB=" & hatena_b
if rss_loglast_log() then
save_log(rss_log) end if
open_unique_log(log_path()) end main




on livedoor_reader_count() do shell script "curl --silent " & quoted form of ("http://reader.livedoor.com/about/" & rss_url) & "|grep subscriber_count|sed -e 's/[^0-9]//g'|tr \"\\n\" \"+\"|sed -e 's/+$//'|bc"
end livedoor_reader_count

on feedly_feeds_count() --URI encode|nkf -wMQ|tr = %
--URI decode|tr % =|nkf -WwmQ
do shell script "echo feed/" & rss_url & "rss|/usr/local/bin/nkf -wMQ|tr = %|xargs -I{} curl --silent http://cloud.feedly.com/v3/feeds/{}|awk -F: -v RS=, '/subscribers/{print $2}'"
end feedly_feeds_count

on hatena_bookmark_total_count() do shell script "perl -mXMLRPC::Lite -e 'print XMLRPC::Lite->proxy(\"http://b.hatena.ne.jp/xmlrpc\")->call(\"bookmark.getTotalCount\", $ARGV[0])->result' " & rss_url
end hatena_bookmark_total_count

on save_rss_url() activate
display dialog "照会するページのURLを入力してください。" default answer "" with title my name
set rss_url to result's text returned
end save_rss_url

on datetime() do shell script "date '+%Y-%m-%d '"
end datetime

on save_log(info_text) do shell script "echo " & quoted form of (info_text) & " >> " & quoted form of log_path() --1000行を超えたら、ログローテーションする。(xxxx.log > xxxx.log.1xxxx.logには最新の100ログだけ残る)
do shell script "f=" & log_path() & "; if [ `cat \"$f\"|wc -l` -ge 1000 ]; then mv \"$f.1\" \"$f.2\"; mv \"$f\" \"$f.1\"; cat \"$f.1\" | tail -n 100 >\"$f\"; fi;"
end save_log

on last_log() do shell script "tail -n 1 " & quoted form of log_path() end last_log

on log_path() (path to library folder from user domain)'s POSIX path & "Logs/" & log_name(rss_url) end log_path

on log_name(str) do shell script "echo " & quoted form of str & "|tr ':/' '--'"
my name & "-" & result & ".log"
end log_name

on open_rss_log() do shell script "open " & quoted form of log_path() end open_rss_log

on touch_rss_log() do shell script "touch " & quoted form of log_path() end touch_rss_log

on open_unique_log(unix_path) tell application "Console" to launch
delay 0.1
set fname to do shell script "basename " & unix_path --ファイルパスからファイル名を取得する
tell application "System Events"
tell process "Console"
if fname is not in windows's name then
do shell script "open -ga Console " & unix_path --コンソール.appでファイルパスを開く
end if
end tell
end tell
end open_unique_log

  • 上記コードをAppleScriptエディタで開いて、以下の形式で保存する。
名前:         RSS_counter.app
ファイルフォーマット: アプリケーション
オプション:      「ハンドラの実行後に終了しない」チェックあり

使い方

  • GUIスクリプティングを使っているので、アプリケーションにコンピュータの制御を許可する必要がある。
    • システム環境設定 >> セキュリティとプライバシー >> アクセシビリティ >> プライバシーから、RSS_counter.appにコンピュータの制御を許可しておく。
  • RSS_counter.appを起動しておくと、1時間ごとに、購読者数・はてなブックマーク数をログに保存する。
    • ~/Library/Logs/RSS_counter-http---d.hatena.ne.jp-XXXX-.log
  • Dockアイコンをクリックすると、その時点の購読者数・はてなブックマーク数をチェックして、表示する。
  • 前回とのログに変化がなければ、記録しない。


購読者数&ブックマーク数をチェックして、日々精進するのだ。