🔙 Back to Top

Sat Feb 25 2017

booklog から新刊情報を受け取る

なんかそういうサービスが始まってた (2012年に).

たぶんそうだろうなと思ってたけど登録する作業が面倒くさそう

キーワードを自分で一個ずつぽちぽち入れて 🔍 クリックして 登録 する. ひたすら面倒な作業だ.

キーワードはタイトルとか著者が使える. どうせなら今まで読んだことのある本の著者を全て登録したい.

このフォームからだと 50件を超えた時点で「登録は50件までです」とでる. が、直接登録するAPIを叩いたところ 50 を超えて登録できた (web からは 50 件しか確認できないが、いくつか削除すると新しいキーワード登録が確認できるので、表示されてないだけで全て登録できてるのだと推測する).

自分の本棚から著者名を全て引っ張ってくる

for i in $(seq 0 30); do
    curl "http://booklog.jp/users/${YOUR-USER-ID}/all?category_id=all&status=all&sort=sort_desc&rank=all&tag=&page=$i&keyword=&reviewed=&quoted=&json=true" |
    jq -r '.books[].item.author'
done | sort -u >out

URL にある ${YOUR-USER-ID} は本棚の持ち主のアカウントID. ログインに使うID と同じ.

page キーワードに渡す数字は 0 スタートでこれを増やしていけば全て取得できる. 手抜きして、多めに、ここでは 30 まで取得しておく. 大きすぎる数字を指定しても 404 になるのではなくて book フィールドが空配列のものが返ってくるのでちゃんとチェックしようと思えば出来る.

あ、雑誌を登録してると、著者として出版社が登録されてる. 出版社で新刊情報がくるのはやばそうだから消しておこ. て思ったけど web からだと 50 件しか見れなくて直接削除できないから予め out ファイルから消しとく必要がありそう.

キーワード登録

当たり前だけどここはログイン状態じゃないと叩けないので、ブラウザで一回実際にリクエストしたときのを cURL 形式でコピーみたいなやつを使うといける.

さっきの out を読む.

while read author; do
    curl 'http://booklog.jp/setting/keyword' -H 'Host: booklog.jp' -H 'User-Agent: Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0' -H 'Accept: */*' -H 'Accept-Language: ja,en-US;q=0.7,en;q=0.3' --compressed -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' -H 'X-Requested-With: XMLHttpRequest' -H 'Referer: http://booklog.jp/setting/keyword' -H 'Cookie: __utma=XXXXXXXXX.YYYYYYYYYY.ZZZZZZZZZZ.1486399568.1488025359.TT; __utmz=207290752.1486399359.39.2.utmcsr=t.co|utmccn=(referral)|utmcmd=referral|utmcct=/4RSb7pMdW7; PHPSESSID=XXXXXX6r37qkkkko86kkkkkkkk; __utmb=207290752.12.10.1488025568; __utmc=207290752; bid=M3o7BjEUxy9TY2ZU2Wp7N1ZW901Ws4k6HfjrlhdW6Z4cyXOH5Rd2LeBO8TityFv5OjauDxdQ5D4HbajejTk0VGv5vxjjApQ%2BuKYDY19uWhY%3D; __utmt=1; __utmli=search_keyword_button' -H 'Connection: keep-alive' \
    --data 'action=post_keyword&genre=0' \
    --data "keyword=$author" | jq .
    sleep 0.5
done < out

この API はそれなりにシビアなので sleep 0.5 を挟んでる. ちゃんとリクエストできていれば

{
  "code": "200",
  "message": "キーワードを追加しました"
}

{
  "code": "500",
  "message": "登録済みのキーワードです"
}

のどちらかが返ってくる.

できた!

今見えたけど「一迅社」が登録されてる. 新刊情報が沢山来ちゃいそう.