Подтвердить что ты не робот

Как реализовать поддержку файлов cookie в ruby ​​net/http?

Я хочу добавить поддержку cookie в класс ruby, используя net/http для просмотра веб-страниц. Файлы cookie должны храниться в файле, чтобы выжить после завершения script. Конечно, я могу прочитать спецификации и написать какой-то обработчик, использовать какой-то формат cookie.txt и т.д., Но, похоже, это означает изобретать колесо. Есть ли лучший способ выполнить эту задачу? Может быть, какой-то класс cooie jar для ухода за куки?

4b9b3361

Ответ 1

Взято из DZone Snippets

http = Net::HTTP.new('profil.wp.pl', 443)
http.use_ssl = true
path = '/login.html'

# GET request -> so the host can set his cookies
resp, data = http.get(path, nil)
cookie = resp.response['set-cookie'].split('; ')[0]


# POST request -> logging in
data = 'serwis=wp.pl&url=profil.html&tryLogin=1&countTest=1&logowaniessl=1&login_username=blah&login_password=blah'
headers = {
  'Cookie' => cookie,
  'Referer' => 'http://profil.wp.pl/login.html',
  'Content-Type' => 'application/x-www-form-urlencoded'
}

resp, data = http.post(path, data, headers)


# Output on the screen -> we should get either a 302 redirect (after a successful login) or an error page
puts 'Code = ' + resp.code
puts 'Message = ' + resp.message
resp.each {|key, val| puts key + ' = ' + val}
puts data

Обновление

#To save the cookies, you can use PStore
cookies = PStore.new("cookies.pstore")

# Save the cookie  
cookies.transaction do
  cookies[:some_identifier] = cookie
end

# Retrieve the cookie back
cookies.transaction do
  cookie = cookies[:some_identifier] 
end

Ответ 2

Принятый ответ не будет работать, если ваш сервер вернется и ожидает несколько файлов cookie. Это может произойти, например, если сервер возвращает набор файлов cookie FedAuth [n]. Если это повлияет на вас, вам может понадобиться вместо этого использовать что-то в следующих строках:

http = Net::HTTP.new('https://example.com', 443)
http.use_ssl = true
path1 = '/index.html'
path2 = '/index2.html'

# make a request to get the server cookies
response = http.get(path)
if (response.code == '200')
    all_cookies = response.get_fields('set-cookie')
    cookies_array = Array.new
    all_cookies.each { | cookie |
        cookies_array.push(cookie.split('; ')[0])
    }
    cookies = cookies_array.join('; ')

    # now make a request using the cookies
    response = http.get(path2, { 'Cookie' => cookies })
end

Ответ 3

Принятый ответ не работает. Вам нужно получить доступ к внутреннему представлению заголовка ответа, где значения множественного набора cookie хранятся отдельно, а затем удалить все после первой точки с запятой из этой строки и объединить их вместе. Вот код, который работает

r = http.get(path)
cookie = {'Cookie'=>r.to_hash['set-cookie'].collect{|ea|ea[/^.*?;/]}.join}
r = http.get(next_path,cookie)

Ответ 4

Используйте http-cookie, который реализует RFS-совместимый синтаксический анализ и рендеринг, плюс банку.

Грубый пример, который происходит после перенаправления после входа:

require 'uri'
require 'net/http'
require 'http-cookie'

uri = URI('...')
jar = HTTP::CookieJar.new

Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == 'https') do |http|
  req = Net::HTTP::Post.new uri
  req.form_data = { ... }
  res = http.request req
  res.get_fields('Set-Cookie').each do |value|
    jar.parse(value, req.uri)
  end

  fail unless res.code == '302'

  req = Net::HTTP::Get.new(uri + res['Location'])
  req['Cookie'] = HTTP::Cookie.cookie_value(jar.cookies(uri))
  res = http.request req
end

Зачем? Поскольку ответы, приведенные выше, невероятно недостаточны и плоские, не работают во многих сценариях, связанных с RFC (это случилось со мной), поэтому полагаться на сам lib, используя только то, что нужно, является бесконечно более надежным, если вы хотите обрабатывать более одного конкретного случая.

Ответ 5

Я использовал Curb и Mechanize для аналогичного проекта. Просто включите поддержку cookies и сохраните файлы cookie в temp cookiejar... Если вы используете встроенную сеть /http или пакеты без поддержки cookie, вам нужно будет написать свою собственную обработку файлов cookie.

Ответ 6

Вы можете отправлять куки файлы cookie с помощью заголовков.

Вы можете сохранить заголовок в любой структуре сохранения. Будь то какая-то база данных или файлы.