Открытый uri и cookie Ruby

На основе ответа перекати-поля я сделал сценарий, который использует поиски способности для предложения пакетов, которые рекомендуют недостающий пакет.

Это однако не дает то же, полный список как синаптическое. Никакая идея, почему.

Образец сценария

#!/usr/bin/php
<?php

$list = shell_exec("aptitude search '?broken-reverse-recommends(?installed)'");
preg_match_all("|^.{4}(.*) - (.*)$|mU", $list, $matches);

foreach ($matches[1] as $prog) {
    $prog = trim($prog);
    echo "$prog:\n";
    $missing = shell_exec("aptitude search '?installed?broken-recommends($prog)'");
    preg_match_all("|^.{4}(.*) - (.*)$|mU", $missing, $mismatch);
    foreach ($mismatch[1] as $missoft) {
        echo "\tRecommended by: ".trim($missoft)."\n";
    }
}

произвел

ecryptfs-utils:
    Recommended by: adduser
firefox:
    Recommended by: xubuntu-desktop
    Recommended by: xul-ext-ubufox
firefox-gnome-support:
    Recommended by: xubuntu-desktop
libatm1:
    Recommended by: iproute
23
задан dlamblin 2 September 2009 в 00:50
поделиться

4 ответа

Я думал, что кто-то просто узнает, но я думаю, что с open-uri это обычно не делается. Вот уродливая версия, которая не проверяет конфиденциальность, истечение срока, правильный домен или правильный путь:

h1 = open("http://www.w3.org/")
h2 = open("http://www.w3.org/People/Berners-Lee/",
          "Cookie" => h1.meta['set-cookie'].split('; ',2)[0])

Да, это работает. Нет, это не красиво, не полностью соответствует рекомендациям и не обрабатывает несколько файлов cookie (как есть).

Ясно, что HTTP - очень простой протокол, а open-uri позволяет вам самое большее этого. Думаю, что мне действительно нужно было знать, так это как получить cookie из запроса h1 , чтобы его можно было передать в запрос h2 (эту часть я уже знал и показал). Удивительно то, как много людей хотели ответить, сказав мне не использовать open-uri , и только один из них показал, как получить набор cookie в одном запросе, передаваемый в следующий запрос.

30
ответ дан 29 November 2019 в 01:35
поделиться

Вам нужно добавить заголовок «Cookie».

Я не уверен, может ли open-uri сделать это или нет, но это можно сделать с помощью Net :: HTTP.

# Create a new connection object.
conn = Net::HTTP.new(site, port)

# Get the response when we login, to set the cookie.
# body is the encoded arguments to log in.
resp, data = conn.post(login_path, body, {})
cookie = resp.response['set-cookie']

# Headers need to be in a hash.
headers = { "Cookie" => cookie }

# On a get, we don't need a body.
resp, data = conn.get(path, headers)
13
ответ дан 29 November 2019 в 01:35
поделиться

В зависимости от того, чего вы пытаетесь достичь, проверьте webrat . Я знаю, что он обычно используется для тестирования, но он также может попадать на живые сайты и делает много того же, что и ваш веб-браузер, например, сохраняет файлы cookie между запросами и отслеживает перенаправления.

2
ответ дан 29 November 2019 в 01:35
поделиться

вам придется свернуть поддержку собственных файлов cookie, проанализировав мета-заголовки при чтении и добавив заголовок cookie при отправке запроса, если вы используете open-uri. Рассмотрите возможность использования httpclient http://raa.ruby-lang.org/project/httpclient/ или чего-то вроде Mechanize вместо http://mechanize.rubyforge.org/ , поскольку у них есть cookie встроенная поддержка.

1
ответ дан 29 November 2019 в 01:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: