Rubyで自分のKindleのハイライト箇所をランダムでつぶやくbotを作った

  • 31
    いいね
  • 2
    コメント
この記事は最終更新日から1年以上が経過しています。

お正月の成果物です。



自分がKindleで過去にハイライトした部分をランダムにつぶやく自分用botです。
今のところMacで動かしてますがRaspberry Piで動かす予定です。Ruby 2.2.4で動きました。

1. kindle-highlightsというgemが必要です

$ gem install kindle-highlights

2. ログイン情報はDotenvを使って切り出しましょう

$ gem install dotenv

.env
MAIL_ADDRESS = "【kindle.amazon.co.jpに登録してるアドレス】"
PASSWORD = "【パスワード】" 

(@riocampos さん、ありがとうございます!)

3. kindle-highlightを使ってハイライトをとってくるコードを書きます

適当なディレクトリに以下を保存。

scrape.rb
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ファイルと同じディレクトリに保存。

tweet.rb
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)追記

取得したハイライトデータを使って、自分のサイトの背景を作ってみました。
スクリーンショット 2016-02-20 15.53.07.png
sngazm.info

家に置いてあるラズパイのcronで週に1日スクレイピングコードを走らせて、取得したデータをjson形式で保存して、FTPで自動アップロードするようにしてます。

サイトではJSでそのデータを取ってきて、ランダムに表示させています。色もランダムでつけてかわいくしました。