На основе ответа перекати-поля я сделал сценарий, который использует поиски способности для предложения пакетов, которые рекомендуют недостающий пакет.
Это однако не дает то же, полный список как синаптическое. Никакая идея, почему.
#!/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
Я думал, что кто-то просто узнает, но я думаю, что с 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 в одном запросе, передаваемый в следующий запрос.
Вам нужно добавить заголовок «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)
В зависимости от того, чего вы пытаетесь достичь, проверьте webrat . Я знаю, что он обычно используется для тестирования, но он также может попадать на живые сайты и делает много того же, что и ваш веб-браузер, например, сохраняет файлы cookie между запросами и отслеживает перенаправления.
вам придется свернуть поддержку собственных файлов cookie, проанализировав мета-заголовки при чтении и добавив заголовок cookie при отправке запроса, если вы используете open-uri. Рассмотрите возможность использования httpclient http://raa.ruby-lang.org/project/httpclient/ или чего-то вроде Mechanize вместо http://mechanize.rubyforge.org/ , поскольку у них есть cookie встроенная поддержка.