2018年以降の記事はGitHub Pagesに移行しました

Read it LaterをRubyで取得する

ブラウザからログインせずともRILを見たい! 追加したい! ということで。

前準備

  • はじめにapikeyを取得するためにhttp://readitlaterlist.com/api/signup/にアクセスします。*1
  • 必須項目(AppNameとContact Email)を記入し、Generate API Keyします。
  • 取得したapikeyを取っておきます。

記事をGetする

以下のパラメータを生成し、URLのおしりに?AAA=BBB&CCC=DDD...形式でくっつけてhttps://readitlaterlist.com/v2/getに送ります。*2パラメータは他にもあるけど、とりあえずこれだけあれば取得はできます。

apikey(必須) 今生成したapikey
username(必須) Read It Laterのアカウント
password(必須) パスワード
format レスポンスのフォーマット。jsonかxmlが選択できる。デフォルトはjson

パスワードが丸見えなのでショルダーハックとかされるとアレですが…。

ソースコード

ここまでをRubyで書いてみました。jsonの解析はTwitterから取得したツイートを解析したときと同じようにsimplejsonparserを使用させていただきました。

require 'uri'
require 'net/http'
# http://rubyforge.org/snippet/detail.php?type=snippet&id=148
require 'simplejsonparser'
require 'pp'

# RIL取得用のURL
url = "https://readitlaterlist.com/v2/get"

# アカウント名とパスワード
username = "kk_Ataka"
password = PASSWORD
# apikey
apikey = APIKEY
# format json or xml
format = "json"

# パラメータ作成
param = "username=#{username}&password=#{password}&apikey=#{apikey}&format=#{format}"

# GETする
uri = URI.parse(url)
proxy_class = Net::HTTP::Proxy(ARGV[0], 8080)
http = proxy_class.new(uri.host)
http.start do |http|
        res = http.get(uri.path + "?#{param}")
        if res.code == "200" then
                json = res.body
                # jsonparseでparseしてもらう
                jsonparse = JsonParser.new.parse(json)

                pp jsonparse
        else
                print "#{res.code}\n"
        end
end

すると、こんな感じに返ってきます。

json形式では、こんなフォーマットで返ってくるみたい。

{
  "status":"1", // 1=normal, 2=no changes since your provided 'since'
  "since":"1245626956', // timestamp of this response
  "list":{
   "93817":{
    "item_id":"93817" // unique id identifying the url
    "url":"http://url.com",
    "title":"Page Title",
    "time_updated":"1245626956", // time the item was last added/changed
    "time_added":"1245626956", // time item was added to list
    "tags":"comma,seperated,list",
    "state":"0", // 0=unread, 1=read
   },
...

http://readitlaterlist.com/api/docs/#get

さしあたり、欲しいのはlist内のurl,titleくらいなんだけど、これどうやって取得するんだろう。うまい方法が思い浮かばなかったので、一旦listのkeyを全部取得してkey分forを回すというあまりイケてない方法に。parse以降をこう変えました。

                # jsonparseでparseしてもらう
                jsonparse = JsonParser.new.parse(json)
                
				# listのキーを取得
                keys = jsonparse["list"].keys
                for i in 0..keys.length-1
                        print_url = jsonparse["list"][keys[i]]["url"]
                        print_title = jsonparse["list"][keys[i]]["title"]

                        print "#{print_title}#{print_url}\n"
                end

すると表示は、

おお、ニコニコ動画! 次はAddをやりたい。むしろそっちが目的!

*1:ReadItLaterのアカウントを持っていない場合は、あらかじめ作っておきます。

*2:順不同でもよい