kindle unlimited検索を作ってみた

# はじめに（なぜ作ったか？）

月額980円で対象電子書籍が読み放題になるkindle unlimited。サービスが発表された当初、私はkindle paperwhite端末しか持っておらず、あまりピンときていなかったのですが、先日iPad（2018年度版）を購入したことをきっかけに電子書籍熱が再発。なかでも感動してしまったのは「ナショナルジオグラフィック 日本版」でした。

- [ナショナルジオグラフィック 日本版](https://www.amazon.co.jp/s/ref=nb_sb_noss?__mk_ja_JP=%E3%82%AB%E3%82%BF%E3%82%AB%E3%83%8A&url=search-alias%3Ddigital-text&field-keywords=%E3%83%8A%E3%82%B7%E3%83%A7%E3%83%8A%E3%83%AB%E3%82%B8%E3%82%AA%E3%82%B0%E3%83%A9%E3%83%95%E3%82%A3%E3%83%83%E3%82%AF+%E6%97%A5%E6%9C%AC)

iPadでみると写真が実に美しい。最新号の１つ前からだいたい半年分くらいの号は「kindle unlimited」マークがついていて、読み放題の対象となっていました。これはすばらしい。さっそく契約し、目についた気になる書籍をダウンロード。他にも、他にも！　と思い、Amazon公式サイトで検索し、本を漁りはじめました。

そして問題にぶち当たりました。

**検索しづらい！**

まずは適当なワードで対象書籍を探してみます。

<img width="1018" alt="phpscience.png" src="https://qiita-image-store.s3.amazonaws.com/0/221909/e1a4f823-4bd0-5970-f0f6-2fe1bc687b8f.png">

上は検索ボックスの左で「kindkeストア」を選択し、キーワード「PHPサイエンス」として検索した結果です。検索結果の左枠に「kindle Unlimited 読み放題」チェックボックスが現れました。ここにチェックをつけると、読み放題対象の本だけに絞り込んで検索できることがわかります。

さて、この画面からキーワードを「手塚治虫」に変えてみましょう。

<img width="1017" alt="tezuka.png" src="https://qiita-image-store.s3.amazonaws.com/0/221909/d3326f19-929a-4211-7f40-6b48a26c27cb.png">

さっきまで「読み放題」の条件で検索していたのに、読み放題対象でない本が現れてしまっています。しかも、左枠で「kindle Unlimited 読み放題」チェックボックスも消えてしまっているではないですか。なぜなのでしょうか。

検索ワードをいくつか試してみると、ワードによって左枠の「読み放題対象タイトル」チェックボックスが出たり出なかったりすることが判明しました。
どういった法則でチェックボックスが出るのか、分かりません。

とはいえ、せっかくサービスを契約したのですから、効率よく無料の本を探したいのです。
そんなわけで、作ってみることにしました。

# 作成の方針（どのように作るか？）

さきほどの検索ワード「PHPサイエンス」検索では無事私の欲しい情報がページに表示されていました。このときのURLは

`https://www.amazon.co.jp/s/s/ref=sr_nr_p_n_feature_nineteen_0?fst=as%3Aoff&rh=n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%2Cp_n_feature_nineteen_browse-bin%3A3169286051&keywords=PHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9&ie=UTF8&qid=1541941124&rnid=3169285051`

でした。
ここにはもしかしたら私が意図しない余計な情報が入っているかもしれません。
ここから「不要かもしれないパラメータ」を削ってみて、ページを確認。動作に問題がないぎりぎりの短いURLを探してみましょう。

# 作業記録
## step1. rnid(パラメータを削る)

`https://www.amazon.co.jp/s/s/ref=sr_nr_p_n_feature_nineteen_0?fst=as%3Aoff&rh=n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%2Cp_n_feature_nineteen_browse-bin%3A3169286051&keywords=PHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9&ie=UTF8&qid=1541941124`

→上記URLをブラウザで開くと、さきほどの検索結果画面と変わっていません。rnidパラメータはつけなくても問題なさそうです。Amazonサイト側の都合からすれば何か不都合があるかもしれませんが、私が検索で使うぶんには問題なさそうでした。

## step2. qid
`https://www.amazon.co.jp/s/s/ref=sr_nr_p_n_feature_nineteen_0?fst=as%3Aoff&rh=n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%2Cp_n_feature_nineteen_browse-bin%3A3169286051&keywords=PHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9&ie=UTF8`

→これもOK。問題なさそうです。

## step3. ie
`https://www.amazon.co.jp/s/s/ref=sr_nr_p_n_feature_nineteen_0?fst=as%3Aoff&rh=n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%2Cp_n_feature_nineteen_browse-bin%3A3169286051&keywords=PHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9`

→OK。ieはおそらく "input encoding"の略でしょう。

## step4. keyword
`https://www.amazon.co.jp/s/s/ref=sr_nr_p_n_feature_nineteen_0?fst=as%3Aoff&rh=n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%2Cp_n_feature_nineteen_browse-bin%3A3169286051`

→OKでした。keywordは検索キーワードを表しているはずなので、検索結果が変わるはずだと予想していましたが、問題なく検索結果が表示されました。

## step5. rh
`https://www.amazon.co.jp/s/s/ref=sr_nr_p_n_feature_nineteen_0?fst=as%3Aoff`

→NG。検索結果が表示されず、Amazonトップページに飛ばされました。
このパラメータについては、後ほど詳しくみてみます。

## step6. fst
`https://www.amazon.co.jp/s/s/ref=sr_nr_p_n_feature_nineteen_0?rh=n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%2Cp_n_feature_nineteen_browse-bin%3A3169286051`

→OK。もしかしたら画面のどこか見つけにくい部分が変わってしまっている可能性もありますが、検索結果エリアは問題なさそうです。

# rhパラメータについて詳しく
さきほど諦めたrhパラメータは

```
n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%2Cp_n_feature_nineteen_browse-bin%3A3169286051
```

これはURLエンコードされています。デコードすると以下のような文字列になります。

```
n:2250738051,k:PHPサイエンス,p_n_feature_nineteen_browse-bin:3169286051
```

上の文字列をよくみると、[n:〜], [k:〜], [p_n_feature_nineteen_browse-bin:〜]の３つの部分に分けられそうなことが予想できます。

これをひとつづつ削ってみましょう。

## step1. p_n_feature_nineteen_browse-bin
デコード後の文字列からp_n_feature_nineteen_browse-bin以降の文字列を削ると

```
n:2250738051,k:PHPサイエンス
```
これをURLエンコードすると

```
n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9
```

上記をrhパラメータの値と置き換えると

`https://www.amazon.co.jp/s/s/ref=sr_nr_p_n_feature_nineteen_0?rh=n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9`


一見いけそうですが、検索結果の件数が変わってしまいました。左枠の「読み放題対象タイトル」チェックボックスが表示されていません。どうやら「p_n_feature_nineteen_browse-bin:3169286051」という文字列が「読み放題対象タイトル」かどうかの制御に使われているようです。

## step2. k

だめ元で k を削ってみましょう。

（デコード後）

```
n:2250738051,p_n_feature_nineteen_browse-bin:3169286051
```

URLエンコードすると

```
n%3A2250738051%2Cp_n_feature_nineteen_browse-bin%3A3169286051
```

rhの値を上記で置き換えて
`https://www.amazon.co.jp/s/s/ref=sr_nr_p_n_feature_nineteen_0?rh=n%3A2250738051%2Cp_n_feature_nineteen_browse-bin%3A3169286051`

やはり予想通り検索キーワード「PHPサイエンス」は消えてしまいました。k:は検索ワードとして必要な文字列のようです。

## step3. n

n を削ってみましょう。デコード後の文字列は

```
k:PHPサイエンス,p_n_feature_nineteen_browse-bin:3169286051
```

URLエンコードすると

```
k%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%2Cp_n_feature_nineteen_browse-bin%3A3169286051
```

URLに当てはめて
`https://www.amazon.co.jp/s/s/ref=sr_nr_p_n_feature_nineteen_0?rh=k%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%2Cp_n_feature_nineteen_browse-bin%3A3169286051`

結果が1列の表示ではなく4列になっていますね。結果件数も変わっています。画面上の検索ワードを入力するテキストボックスの左側エリアは、「kindleストア」ではなく「すべて」に変わりました。

n:2250738051 という文字列が「kindleストアを対象とする検索」という意味を持っているようです。

# s/s/を削る
kindle以外の検索結果URLには s/s/ ではなく、 s/ がひとつしかありません。直感で上記URLから s/ をひとつ抜いても問題ありませんでした。

# refを削る(2021-12-24追記)
@happykorroke さんからのコメントにより、ref=ref=sr_nr_p_n_feature_nineteen_0 もリンク元のリファラーを表しており、削っても問題ないことがわかりました。@happykorroke さん、ありがとうございます！！

# 結果
以上を踏まえて、

- kindleストアで検索
- 「読み放題対象タイトル」にチェック
- 検索キーワード「PHPサイエンス」を含めた検索

の３つの条件を備えた最短のURLは以下になりそうなことが分かりました。

`https://www.amazon.co.jp/s?rh=n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%2Cp_n_feature_nineteen_browse-bin%3A3169286051`

# 成果物

https://yoshihisamurakami.github.io/kindleunlimited-search/

ソースはこちらに置いています。

https://github.com/yoshihisamurakami/kindleunlimited-search

# 蛇足（私のおすすめ)

- [山田 祥寛](https://www.amazon.co.jp/s/ref=sr_nr_p_n_feature_nineteen_0?rh=n%3A2250738051%2Ck%3A%E5%B1%B1%E7%94%B0%20%E7%A5%A5%E5%AF%9B%2Cp_n_feature_nineteen_browse-bin%3A3169286051) (javascript本を多数出版されています。お世話になります。)

- [PHPサイエンス・ワールド新書](https://www.amazon.co.jp/s/ref=sr_nr_p_n_feature_nineteen_0?rh=n%3A2250738051%2Ck%3APHP%E3%82%B5%E3%82%A4%E3%82%A8%E3%83%B3%E3%82%B9%E3%83%BB%E3%83%AF%E3%83%BC%E3%83%AB%E3%83%89%E6%96%B0%E6%9B%B8%2Cp_n_feature_nineteen_browse-bin%3A3169286051)　(もう新作は出版されていないらしいく残念なのですが、サイエンス系の良書が多数出版されています。)

- [光文社新書](https://www.amazon.co.jp/s/ref=sr_nr_p_n_feature_nineteen_0?rh=n%3A2250738051%2Ck%3A%E5%85%89%E6%96%87%E7%A4%BE%E6%96%B0%E6%9B%B8%2Cp_n_feature_nineteen_browse-bin%3A3169286051) (科学系、美術系の読み物に良書が埋もれています)

# 蛇足2(2019年12月メモ)

* この記事を書いた2018年11月時点ではナショナル・ジオグラフィックは読み放題対象となっていましたが、2019年12月時点では数冊を残してあとは読み放題対象から外れてしまいました。残念。。

* 2019年私が読んだ中で特に面白かったのは以下3冊。

 - [こころと脳の相談室名作選集 家の中にストーカーがいます “こころの風邪”などありません、それは“脳の病気”です](https://www.amazon.co.jp/dp/B00HA0WP4M/) （精神科医・林先生のQ&Aサイトから厳選された相談集。怖くて面白がっては不謹慎なような気もしますが、人生なにが起きるか分かりません。来るかもしれない不測の事態に備えて読んでおくとよいかも！）
 - [世界最高の日本文学～こんなにすごい小説があった～](https://www.amazon.co.jp/dp/B00KS3F5DG/) （日本文学の名作短編を12編紹介した一冊。ふだん文学を読む習慣がない方も、騙されたと思ってチラッと覗いてみてはいかがでしょうか。驚きの連続だと思います！）
 - [人体　失敗の進化史](https://www.amazon.co.jp/dp/B00GU4R9IG/) （私はふだんプログラマーの仕事をしていて、ある程度の全体の設計を準備して・またはされた状態のものに開発をすすめますが、人体の作成過程がこんなにもテキトーなものだったのかと、新たな視点が得られます！）

皆さま、よきkindleライフを!