RubyでPocketに登録した記事をアーカイブする

pocketの記事をアーカイブするアプリをrubyで書こうとしたら、意外と良いサンプルなどがなかったのでまとめておく。

pocket developer apiを使うには、アカウントからアプリを登録しaccess tokenを発行して貰う必要がある。
これについてはすでにいろいろなところで、ここでは割愛する。

また、アーカイブするためにはpocket上に登録された記事のitem_idが必要になる。
これは、別途APIから取得するか、webアプリ上で記事をクリックした際にURLにくっついているのでメモしておく。

実際の実装は以下のようになる。

require 'json'
require 'net/https'

CONSUMER_KEY = 'YOUR_CONSUMER_KEY'
ACCESS_TOKEN = 'YOUR_ACCESS_TOKEN'

headers = {
  'Content-Type' => 'application/json;charset=UTF-8',
  'X-Accept' => 'application/json'
}

params = {
  actions:
    [{
      action: 'archive',
      item_id: 'item_id'.to_i
    }].to_json,
  consumer_key: CONSUMER_KEY,
  access_token: ACCESS_TOKEN
}

req = Net::HTTP::Post.new('/v3/send', initheader = headers)
req.set_form_data params

http = Net::HTTP.new('getpocket.com', 443)
http.use_ssl = true

res = http.request req

raise 'error: cannot get response.' unless res.is_a?(Net::HTTPOK)
puts 'done'

通信に関してはnet/httpモジュールを使っているが、特に難しいことはしていないと思う。
公式のドキュメントにも書いてあるように、https://getpocket.com/v3/sendにリクエストを送ることで、記事に変更を加えることができる。
変更を加える内容は、パラメータにactionsというリストを持たせてそこで指定する。

今回の実装で一番困ったのはactionsのリストの中身をどうするかということ。
結果的にHashをjson文字列に変換することで可能だったが、rubyに慣れていないのとpocketのapiが返してくれるエラーメッセージが何も情報を持っていないので結構苦労した。

最近ではpocketに登録している内容をランダムに選んで配信してくれるサービスが軒並み閉鎖しているらしい。
こういったサービスは結構便利だったのでショックである。
登録・選択・更新の機能についてはAPIが公開されているので、自分で実装できる人は自分でアプリを書くことをおすすめする。

参考