購読者数とブックマーク数のログを記録する
Google Readerも、Fastladderも、とっくの昔に終了しているのに、自分のMacBookの中ではRSS_counter.appが、その購読者数のログを綿々と記録し続けていた。
-
-
- Fastladder:2012/6/1終了
- Google Reader:2013/7/1終了
-
いかん、いかん、何とかせねばならない...。
何を記録すべきか?
- Google ReaderとFastladder無き今、RSS_counter.appにはlivedoor Readerの購読者数しか、カウントする能力がない。
- ところが、livedoor Readerの購読者数は、今年になってからほとんど変化していない。
- Google Readerが終了した頃こそ若干の増加はあったが、現在は数人の増減がある程度で、ほとんど変化なしの状態。
- いったい、Google Readerの購読者はどこへ行ってしまったのか?
- 調べてみると、Feedlyにたくさんの購読者を発見した!
というわけで...
- livedoor Readerに加えて、Feedlyの購読者数もカウントすることにした。
- また、ついでにはてなブックマーク数も記録して、日々の精進に役立てる。
Feedlyの購読者数を取得する
- Feedlyの購読者数は、シンプルなURLで取得できる。
- 例えば、このブログの購読者数は以下のURLが返す。
- 上記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を与えたらその購読者数を返すワンライナーを考える。
- 手順1:feed/http://d.hatena.ne.jp/zariganitosh/rssをURIエンコードして、feed%2Fhttp%3A%2F%2Fd.hatena.ne.jp%2Fzariganitosh%2Frssを返す。
$ URL=http://d.hatena.ne.jp/zariganitosh/ $ echo feed/${URL}rss|nkf -wMQ|tr = % feed%2Fhttp%3A%2F%2Fd%2Ehatena%2Ene%2Ejp%2Fzariganitosh%2Frss
- 手順2:上記結果をhttp://cloud.feedly.com/v3/feeds/に渡して、JSONを取得する。
$ 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":"ザリガニが見ていた...。"}
$ 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
はてなブックマーク合計数を取得する
- はてなブックマークの合計数もシンプルなURLで取得しようとしたのだけど、
- シンプルなGETリクエストでは、個別のURLのブックマーク数しか取得できなかった...。
- どうやら、合計数を取得するにはXML-RPCプロトコルでアクセスする必要があるらしい。
- はてなブックマーク件数取得API - Hatena Developer Center
- XML-RPCのことはよく知らないのだが、上記解説ページのサンプルコードをそのまま使うと、ブックマーク合計数が取得できた。
被ブックマーク合計数取得API
...中略...
はてなブックマーク件数取得API - Hatena Developer Centerサンプルプログラム
...中略...
#!/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";
- 上記スクリプトを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に仕上げる
- Feedlyの購読者数と、はてなブックマークの合計数が取得できるようになったので、これを以前のRSS_counter.appに組み込むのだ。
- Google ReaderとFastladderの購読者数のカウントは不要になったのので、その部分は削除しておいた。
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_log ≠ last_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.1、xxxx.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 |
---|---|
ファイルフォーマット: | アプリケーション |
オプション: | 「ハンドラの実行後に終了しない」チェックあり |