Как передать куки с одной страницы на другую, используя curl в Ruby? - PullRequest
1 голос
/ 02 февраля 2011

Я делаю видео сканер в рубине. Там я должен зайти на страницу, включив куки и загрузив страницы. Для этого я использую библиотеку CURL в ruby. Я могу успешно войти в систему, но я не могу загрузить страницы внутри этого с помощью curl. Как я могу это исправить или загрузить страницы в противном случае?

Мой код

curl = Curl::Easy.new(1st url)
curl.follow_location = true
curl.enable_cookies = true
curl.cookiefile = "cookie.txt"
curl.cookiejar = "cookie.txt"
curl.http_post(1st url,field)

curl.perform
curl = Curl::Easy.perform(2nd url)
curl.follow_location = true
curl.enable_cookies = true
curl.cookiefile = "cookie.txt"
curl.cookiejar = "cookie.txt"
curl.http_get

code = curl.body_str

Ответы [ 3 ]

3 голосов
/ 18 апреля 2011

То, что я видел при написании моего собственного аналогичного сценария "post-then-get", - это то, что ruby ​​/ Curb (я использую версию 0.7.15 с ruby ​​1.8), кажется, игнорирует поля cookiejar / cookiefile в Curl :: Легкий объект. Если я установлю одно из этих полей и http_post успешно завершится, файл cookiejar или cookiefile не будет создан. Кроме того, curl.cookies по-прежнему будет нулевым после вашего curl.http_post, однако файлы cookie установлены в объекте curl. Обещаю:)

Я думаю, что ты ошибаешься здесь:

curl = Curl::Easy.perform(2nd url)

В документации обуздания говорится, что это создает новый объект. Этот новый объект не имеет ни одного из ваших существующих файлов cookie. Если вы измените свой код так, чтобы он выглядел следующим образом, я считаю, что он должен работать. Я также удалил curl.perform для первого url, так как curl.http_post уже неявно выполняет "execute". В основном вы дважды заходили на http_post перед тем, как попробовать http_get.

curl = Curl::Easy.new(1st url)
curl.follow_location = true
curl.enable_cookies = true
curl.http_post(1st url,field)

curl.url = 2nd url
curl.http_get

code = curl.body_str

Если это все еще не работает для вас, вы можете проверить, устанавливается ли cookie, добавив

curl.verbose = true

до

curl.http_post

Ваш объект Curl :: Easy будет сбрасывать все заголовки, которые он получает в ответе от сервера на $ stdout, и где-то там вы должны увидеть строку, сообщающую, что он добавил / установил cookie. У меня сейчас нет примера вывода, но я постараюсь опубликовать продолжение вскоре.

0 голосов
/ 02 февраля 2011

HTTPClient автоматически включает файлы cookie, как и Механизация .

Из документов HTTPClient:

clnt = HTTPClient.new
clnt.get_content(url1) # receives Cookies.
clnt.get_content(url2) # sends Cookies if needed.

Опубликовать форму тоже просто:

body = { 'keyword' => 'ruby', 'lang' => 'en' }
res = clnt.post(uri, body)
0 голосов
/ 02 февраля 2011

Механизация делает подобные вещи действительно простыми (помимо прочего, она будет хранить файлы cookie).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...