お正月の成果物です。
自分がKindleで過去にハイライトした部分をランダムにつぶやく自分用botです。 今のところMacで動かしてますがRaspberry Piで動かす予定です。Ruby 2.2.4で動きました。だが、一九八〇年代のパンク現象に特有だったのは、こうしたバンドが演奏以外の活動を行っていたことだ。 - MAKERS_21世紀の産業革命が始まる (Japanese Edition) by クリス・ アンダーソン,
— 読んだ文字bot (@sngazm_read) 2016, 1月 3
1. kindle-highlightsというgemが必要です
$ gem install kindle-highlights
2. ログイン情報はDotenvを使って切り出しましょう
$ gem install dotenv
MAIL_ADDRESS = "【kindle.amazon.co.jpに登録してるアドレス】"
PASSWORD = "【パスワード】"
(@riocampos さん、ありがとうございます!)
3. kindle-highlightを使ってハイライトをとってくるコードを書きます
適当なディレクトリに以下を保存。
require 'kindle_highlights'
require 'dotenv'
Dotenv.load
class JpKindleHighlights < KindleHighlights::Client
# gemの定数のURLを上書き
KindleHighlights::KINDLE_LOGIN_PAGE = "http://kindle.amazon.co.jp/login"
def highlights_for(asin)
page = @mechanize_agent.get("https://kindle.amazon.co.jp/your_highlights_and_notes/#{asin}")
# 全ハイライトを配列として取得
bookArray = []
title = page.search("span.title").text
author = page.search("span.author").text.strip
highlight = page.search("span.highlight")
highlight.each do |element|
highlight_text = element.text.strip
bookArray << "#{highlight_text} - #{title} #{author}"
end
bookArray
end
end
kindle = JpKindleHighlights.new(ENV["MAIL_ADDRESS"], ENV["PASSWORD"])
# 持ってる本のASINを全部とってきて、それ使ってハイライトの配列をとってくる
allHighlights = []
kindle.books.each_key do |asin|
allHighlights += kindle.highlights_for(asin)
end
# 配列から改行区切りのハイライトファイル作る
File.open('allHighlightsList.txt','w') do |file|
allHighlights.each do |text|
file.puts("#{text}\n")
end
end
下記コマンドで、同じディレクトリにハイライト内容が全部入ったallHighlightsList.txtっていうファイルが生成されたら勝ち。
$ ruby scrape.rb
(定数を上書きしてるよみたいな警告が出るけどスルー)
(kindle.amazon.co.jpにワッとアクセスすることになるので、やりすぎるとamazonに怒られる可能性があります。怒られてないけど。一応自己責任で)
それを使ってツイートします
4. Twitterに投稿するコードを書きます
以下の最高な記事を参考に、Developerに登録したりgem入れたりします。
Rubyで書いたTwitterのbotをRaspberry Piで動かす - DesignAssembler
こんな感じで書いて、.txtファイルと同じディレクトリに保存。
require 'twitter'
client = Twitter::REST::Client.new do |config|
config.consumer_key = <consumer_key>
config.consumer_secret = <consumer_secret>
config.access_token = <access_token>
config.access_token_secret = <access_token_secret>
end
s=[]
File.open("./allHighlightsList.txt","r") do |l|
l.each_line do |line|
s.push(line)
end
end
choice = s.sample.scan(/.{1,140}/m)
choice.each do |tweet|
client.update(tweet)
end
大体は参考記事と同じですが、140文字ごとに切り分ける処理を加えています。
$ ruby tweet.rb
これでtwitterに投稿されたら勝ち。
あとは参考記事と同じ感じでcronに仕込めば定期的に動くはず。
scrape.rbのほうも、月に1回ぐらいのペースで動かすようにすると完全自動化できて素敵ですね。
scrape.rbの説明
kindle-highlights使えない問題
kindle-highlightsという素敵なライブラリはkindle.amazon.comにログインして、自分の持ってる本の一覧をスクレイピングして取得してくれる。ASINコードを渡すと自分のハイライトをとってきてくれる機能もあるらしい。
しかし、kindle.amazon.com仕様で作られているので、co.jpに書き換えてあげる必要がある。そうすると.comの方にはハイライト部分を渡してくれるAmazonのAPIがあるのに.co.jpの方にはない。なのでRubyの入門記事を見ながら頑張って自分でスクレイピングのコードを書いた。
Ruby初心者が2日がかりで作りました。動けばオッケー!という感じで書いたので、「ここもっときれいに書けるよ!」とか「そもそもこういう書き方はよくない」みたいなのがあったらご教授ください。
作った理由はこちら
自分のKindleのハイライト箇所をランダムでつぶやくbotを作ったわけ | trtm
(2015/2/20)追記
取得したハイライトデータを使って、自分のサイトの背景を作ってみました。
sngazm.info
家に置いてあるラズパイのcronで週に1日スクレイピングコードを走らせて、取得したデータをjson形式で保存して、FTPで自動アップロードするようにしてます。
サイトではJSでそのデータを取ってきて、ランダムに表示させています。色もランダムでつけてかわいくしました。