Cookieの使い方

mzp2007-02-16

id:mzp:20070214:1171465153の続き。RubyのNet::HTTPでのクッキーの扱い方。

クッキーの受信

クッキは、Set-Cookie:というフィールドに書かれている。
ただし、複数のSet-Cookieフィールドが存在することが普通なので、Net::HTTP#get_fieldsを使って配列の形で取得する。

require 'net/http'

Net::HTTP.start('www.tohoho-web.com'){|http|
  response, = http.get '/cgi/wwwcook.cgi'
  p response.get_fields('Set-Cookie')
}

実行例:

["KAISUU=2; expires=Tue, 1-Jan-2030 00:00:00 GMT;", "HIZUKE=2007%2F02%2F16%2021%3A46%3A08; expires=Tue, 1-Jan-2030 00:00:00 GMT;"]

ただし、この状態でクッキーは

KAISUU=2; expires=Tue, 1-Jan-2030 00:00:00 GMT;

という形をしているので使いづらい。そこで、KAISUU=2の部分だけを取り出して、ハッシュに格納しておく。

require 'net/http'

cookie = {}
Net::HTTP.start('www.tohoho-web.com'){|http|
  response, = http.get '/cgi/wwwcook.cgi'

  response.get_fields('Set-Cookie').each{|str|
    k,v = str[0...str.index(';')].split('=')
    cookie[k] = v
  }
}
p cookie

実行結果:

{"HIZUKE"=>"2007%2F02%2F16%2021%3A47%3A51", "KAISUU"=>"2"}

クッキーの送信

送信するには、Cookieヘッダとして

HIZUKE=2007%2F02%2F16%2021%3A47%3A51;KAISUU=2

を送信してやればいい。

cookie={'HIZUKE'=>'2007%2F02%2F16%2021%3A47%3A51'
        'KAISUU'=>2}
Net::HTTP.start('www.tohoho-web.com'){|http|
  response, = http.get '/cgi/wwwcook.cgi',{'Cookie'=>cookie.map{|k,v|
      "#{k}=#{v}"
    }.join(';')}
  print response.body
}

Livedoor Clipメモ

ログイン

http://member.livedoor.com/login/indexにユーザー名(livedoor_id)とパスワード(password)をPOSTするとログインできる。
このときに設定されるクッキーを使うことでログイン済みと見なされるので、クッキーを保存しておく必要がある。

成功すると302によってリダイレクトされ、失敗すると200によってエラーページが表示される。

Postkeyの取得

ブックマークを追加するにはpostkeyが必要になる。
このpostkeyは、ログインした状態でhttp://clip.livedoor.com/clip/add?link=http://example.com&title=exampleにアクセスすると得られるHTMLに書いてある。

<input type="hidden" name="postkey" value="xxxxxxxxxx">

追加

http://clip.livedoor.com/clip/addにパラメータをPOSTすることでブックマークを追加することができる。これはGETだとうまくいかない。
成功すると302が帰ってくる。

パラメータ名 意味
postkey(必須) postkey
link(必須) ブックマークするURL
title(必須) ブックマークに対するタイトル
tags タグ。スペースによって区切る
notes コメント

hatena2livedoor

はてなブックマークLivedoor Clipでバックアップするようにしました。

はてながメンテ中で、非常に困ったことが二回ぐらいあったので。

で、これをやるために簡単なスクリプトを書きました。なにかの参考になるようでしたら、どうぞ。そのうち、もうちょっと賢くするかもしんない。