海の響きを懐かしむ

観たもの聴いたもの読んだものの記録と、日記など

新作のKindle版青空文庫を検索して通知する

Aozora notify

Amazonで、青空文庫Kindle版に、ある特定の著者の新作が追加されたかどうかをチェックして、メールで通知するRubyスクリプトを書いた。プログラミングを久しくやっていなかったのでだいぶリハビリだった。ループの書き方も忘れかけていた。こわい。

何点かつまづいたところについて書いておく。


gemのインストール

Amazonの製品情報を得るには、Amazon Product Advertising APIというものを使えばいいらしい。まずはAPIのサイトからアクセスIDとアクセスキーを取得する。
Rubyだと、amazon-ecsってgemを使うことで、APIを呼び出せる。
amazon-ecsを使ってRuby上でAmazon Product Advertising APIを操作してみた - 平凡なエンジニアの独り言

それから、APIで呼び出した製品情報のURLを、bitlyのAPIを使って短縮するようにした。AmazonAPIと同じように、登録してIDとAPIkeyを取得する。

メールの送信には、今回のためにGmailの別アカウントを作って、送っている。
コマンドラインからgmail経由でメールを送るRubyスクリプト | Futurismo

% sudo gem install amazon-ecs
% sudo gem install mail
% sudo gem install tlsmail


tlsmailを使ったときのエラーの対処

tlsmailのgemを使おうとしたら、SMTP、POP、POPSession、POP3Session、APOPSessionそれぞれにおいてエラーが出て来た。

/Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/smtp.rb:806: warning: already initialized constant Net::SMTPSession
/System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/lib/ruby/2.0.0/net/smtp.rb:1057: warning: previous definition of SMTPSession was here
/Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/pop.rb:687: warning: already initialized constant Net::POP
/Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/pop.rb:687: warning: previous definition of POP was here
/Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/pop.rb:688: warning: already initialized constant Net::POPSession
/Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/pop.rb:688: warning: previous definition of POPSession was here
/Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/pop.rb:689: warning: already initialized constant Net::POP3Session
/Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/pop.rb:689: warning: previous definition of POP3Session was here
/Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/pop.rb:702: warning: already initialized constant Net::APOPSession
/Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/pop.rb:702: warning: previous definition of APOPSession was here


エラー文に書いてある設定ファイル(smtp.rb)をみると、

806 SMTPSession = SMTP

などとなっている。POP、POPSession、POP3Session、APOPSession(pop.rb)も同様。この前の行に、次の様に1行付け足してあげる。
tlsmailのalready initialized constant hoge - ema25の日記

806 __Net.instance_eval {remove_const :SMTPSession} if defined?(SMTPSession)
807 SMTPSession = SMTP
( /Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/smtp.rb)

687 Net.instance_eval {remove_const :POP} if defined?(POP)
688 Net.instance_eval {remove_const :POPSession} if defined?(POPSession)
689 Net.instance_eval {remove_const :POP3Session} if defined?(POP3Session)
690 POP = POP3
691 POPSession = POP3
692 POP3Session = POP3

    • -

705 Net.instance_eval {remove_const :APOPSession} if defined?(APOPSession)
706 APOPSession = APOP
(/Library/Ruby/Gems/2.0.0/gems/tlsmail-0.0.1/lib/net/pop.rb)


UTF-8でのメール送信

次のようにWarningが出た。

Non US-ASCII detected and no charset defined.
Defaulting to UTF-8, set your own if this is incorrect.

こちらのサイトにあるように、charsetを指定することで解決した。
Non US-ASCII detected and no charset defined. Defaulting to UTF-8, set your own if this is incorrect. - komagata
Rubyで"invalid multibyte char (US-ASCII)"とか出てきた - 文系学生のプログラミング入門

# encoding: utf-8

mail.charset = 'utf-8'


新作のKindle青空文庫の取得

結論から言って、Amazon Product Advertising APIを使ってKindle青空文庫の新作を検索することはできなかった。代わりに、Amazonで売っている本で無料かつ新作なものを検索している。なぜできなかったか書く。

まず、amazon/ecsのgemを使った製品の検索は以下のように書ける。

resp = Amazon::Ecs.item_search("夏目漱石", :country => "jp", :response_group => 'Large', :item_page => 1)

この中で、Kindle本を指定するには、こんなふうに書く。

:search_index => 'KindleStore'

次に、日付を指定するには、「2014年5月以降に発売されたもの」というようにする。これには、powerというパラメタを使う。

power => "pubdate
after 05-2014"

しかしAmazonAPIでは、'KindleStore'のパラメタ指定とpowerパラメタがなぜか共存できない感じになっており、試行錯誤の結果「青空文庫=0円」ということから、値段で検索をかけることにした。
Amazon Product Advertising APIでKindle本が扱いづらい - free(your_mind);

:MaximumPrice => 0

という風に。
あとは、取ってきた本のタイトル、発売日、URL(短縮したもの)をメールのbodyに載せて送る。


〜〜〜〜〜

ひとまずの結論

作ってみて、いろいろな作家で検索をかけてみると、どうもKindle版の青空文庫は一年に一度、9月or10月にしか追加されないっぽいことがわかった。

例えば、比較的最近に青空文庫に追加された室生犀星

新規公開作品

上記の青空文庫本家サイトの新作紹介ページを見ると、2014年の4月27日に『玉章』という作品が出ていることがわかる。しかしAmazonで検索すると、2014年の室生犀星Kindle本は存在せず、一番最近のもので昨年2013年の10月22日が最終更新となっている。

%ruby aozora.rb
pubdate:after 02-2013
[info] total_page:2 total_results:18 item_page:1
[info] total_page:2 total_results:18 item_page:2
或る少女の死まで http://amzn.to/1s5jd09 2013-10-22
ゆめの話 http://amzn.to/1s5jcJT 2013-10-22
抒情小曲集 04 抒情小曲集 http://amzn.to/1s5jeRX 2013-10-21
日本の庭 http://amzn.to/1iMzMN2 2013-10-22
性に眼覚める頃 http://amzn.to/1iMzMMU 2013-10-22
幼年時代 http://amzn.to/1iMzOV0 2013-10-22
笛と太鼓 http://amzn.to/1g0Dahs 2013-10-22
人真似鳥 http://amzn.to/1iMzOV2 2013-10-22
冬の庭 http://amzn.to/1iMzOV8 2013-10-22
交友録より http://amzn.to/1iMzMN4 2013-10-21
故郷を辞す http://amzn.to/1g0DcpF 2013-10-22
ザボンの実る木のもとに http://amzn.to/1g0DcpJ 2013-10-22
蒼白き巣窟 http://amzn.to/1g0DcpN 2013-10-22
螽蟖の記 http://amzn.to/1g0DcG3 2013-10-22
洋灯はくらいか明るいか http://amzn.to/1g0DcG7 2013-10-22
名園の落水 http://amzn.to/1g0DcGb 2013-10-22
懸巣 http://amzn.to/1g0DcGd 2013-10-22
芥川の原稿 http://amzn.to/1iMzOV6 2013-10-22

他の作家で検索してみても同じような感じだったので、もしかしたら一年に1回しか役に立たないのかもしれない....。でも、クエリの内容を変えれば本以外でも検索できそうなので、使い道はありそうな気がする。