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

お正月の成果物です。
<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">だが、一九八〇年代のパンク現象に特有だったのは、こうしたバンドが演奏以外の活動を行っていたことだ。 - MAKERS_21世紀の産業革命が始まる (Japanese Edition) by クリス・ アンダーソン,</p>&mdash; 読んだ文字bot (@sngazm_read) <a href="https://twitter.com/sngazm_read/status/683671464579448832">2016, 1月 3</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
自分がKindleで過去にハイライトした部分をランダムにつぶやく自分用botです。
今のところMacで動かしてますがRaspberry Piで動かす予定です。Ruby 2.2.4で動きました。

### 1. [kindle-highlights](https://github.com/speric/kindle-highlights)というgemが必要です
`$ gem install kindle-highlights`

### 2. ログイン情報は[Dotenv](https://github.com/bkeepers/dotenv)を使って切り出しましょう
`$ gem install dotenv`

```rb:.env
MAIL_ADDRESS = "【kindle.amazon.co.jpに登録してるアドレス】"
PASSWORD = "【パスワード】" 
```
(@riocampos さん、ありがとうございます！)

### 3. kindle-highlightを使ってハイライトをとってくるコードを書きます  
適当なディレクトリに以下を保存。  


```rb: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](http://hyottokoaloha.hatenablog.com/entry/2015/04/24/151913)

こんな感じで書いて、.txtファイルと同じディレクトリに保存。

```rb: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](http://kindle.amazon.com)にログインして、自分の持ってる本の一覧をスクレイピングして取得してくれる。ASINコードを渡すと自分のハイライトをとってきてくれる機能もあるらしい。

しかし、kindle.amazon.com仕様で作られているので、co.jpに書き換えてあげる必要がある。そうすると.comの方にはハイライト部分を渡してくれるAmazonのAPIがあるのに.co.jpの方にはない。なのでRubyの入門記事を見ながら頑張って自分でスクレイピングのコードを書いた。

Ruby初心者が2日がかりで作りました。動けばオッケー！という感じで書いたので、「ここもっときれいに書けるよ！」とか「そもそもこういう書き方はよくない」みたいなのがあったらご教授ください。

作った理由はこちら
[自分のKindleのハイライト箇所をランダムでつぶやくbotを作ったわけ | trtm](http://sngazm.info/blog/?p=175161947)

### (2015/2/20)追記
取得したハイライトデータを使って、自分のサイトの背景を作ってみました。
![スクリーンショット 2016-02-20 15.53.07.png](https://qiita-image-store.s3.amazonaws.com/0/27258/7019fc6d-7de6-f419-6ed2-40e486683dcd.png)
[sngazm.info](http://sngazm.info)

家に置いてあるラズパイのcronで週に1日スクレイピングコードを走らせて、取得したデータをjson形式で保存して、FTPで自動アップロードするようにしてます。  
サイトではJSでそのデータを取ってきて、ランダムに表示させています。色もランダムでつけてかわいくしました。