LINUX.ORG.RU

проигнорировать basic http auth

 , ,


0

1

Дня доброго, господа.
Собственно средствами mechanize необходимо забрать сорц странички, но последний сразу выбрасывает ошибку и убивает весь скрипт.
На запрашиваемой страничке - http авторизация.

Что имеем:

    require 'mechanize'

    agent = Mechanize.new        
    page = agent.get("https://#{ip}/")

error:
/home/lord/.gem/ruby/1.9.1/gems/mechanize-2.4/lib/mechanize/http/agent.rb:682:in `response_authenticate': 401 => Net::HTTPUnauthorized for https://82.144.208.6/cgi-bin/welcome.cgi -- no credentials found, provide some with #add_auth -- available realms: r722 (Mechanize::UnauthorizedError)
from /home/lord/.gem/ruby/1.9.1/gems/mechanize-2.4/lib/mechanize/http/agent.rb:288:in `fetch'
from /home/lord/.gem/ruby/1.9.1/gems/mechanize-2.4/lib/mechanize.rb:407:in `get'
from /home/lord/ruby/ruby_backup/backup-done.ru:35:in `block (2 levels) in <main>'

если забирать curl"ом:
curl -ssl -k https://$ip/
------------------------------------
<html>
<head>
  <title>401 Unauthorized</title>
</head>
<body bgcolor="ffffff">
  <h2>401 Unauthorized<h2>
  <p>
  Authorization required for the URL.
</body>
</html>
Или же может подскажите внятный метод проигнорировать ошибку, и просигнализировать об этом, не заваливая скрипт.
Сам эту, казалось бы, тривиальную проблему - решить не смог.
Заранее спасибо.

Что-то очень знакомое. Помоему сталкивался с таким, когда кодил что-то напитоне. Если не ошибаюсь, там нужно было обработать ошибку, полученная страница при этом складывалась куда-то и ее можно было вытащить. После обеда погуглю, если вопрос не решится.

winlook38 ★★
()
Ответ на: комментарий от Spirit_of_Stallman

Извини, руби не знаю, поэтому могу что-то не то написать, но глянь вот эту ссылочку:
http://mechanize.rubyforge.org/Mechanize.html#method-i-basic_auth

Приведенный там код

agent = Mechanize.new
uri = URI 'http://example/invalid_content_length'

begin
  page = agent.get uri
rescue Mechanize::ResponseReadError => e
  page = e.force_parse
end

уж очень смахивает на то, что у меня получилось на питоне.

winlook38 ★★
()
Ответ на: комментарий от winlook38

Конкретно эту конструкцию уже пробовал - она, к сожалению, ничего не меняет в результатах. Заваливается всё как и раньше, и ошибку оно не откладывает.
А на питоне вы тоже mechanize пользовали? Если да, можно было бы увидеть ваш сорс решения?

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

Нет, не Mechanize

import sys, urllib2

try:
    print urllib2.urlopen(sys.argv[1])
except urllib2.HTTPError, e:
    print e.read()

winlook38 ★★
()
Ответ на: комментарий от Spirit_of_Stallman

Так, на сколько я понял, тебе нужна не конкретно эта конструкция.
Я думаю, в конструкции Mechanize::ResponseReadError тебе нужно заменить ResponseReadError на что-то другое.

winlook38 ★★
()
Ответ на: комментарий от winlook38

Вот это да... еще раз подтверждаю себе что долго не спать - ни разу себя не окупает, полученное время - трачу на решение боков в следствии полученной невнимательности.

Попробуй UnauthorizedError.

Спасибо большое, то что нужно, в упор не видел этого.


На светлое будущее тех, кто столкнётся с этим же, можно пользовать:

        agent = Mechanize.new
        agent.read_timeout = 10
        
        begin
            page = agent.get("https://#{ip}/")
        rescue Mechanize::UnauthorizedError => error
            page = error
        end
При чём с заметкой, что хоть в доках и указывают force_parse - его пользовать не нужно, ибо вываливает его в 1.9.3 падает в конфуз На выходе, после удачного редиректа ошибки получим что-то по типу:
>>puts page
401 => Net::HTTPUnauthorized for https://0.0.0.0/-- no credentials found, provide some with #add_auth -- available realms: HI
TTTT

Товарищ winlook38 - еще раз сасибо

Spirit_of_Stallman ★★★
() автор топика
Ответ на: комментарий от Spirit_of_Stallman

Поправлю немного.

При чём с заметкой, что хоть в доках и указывают force_parse - его пользовать не нужно

В документации приводится пример другой ошибки. Если посмотреть описание этой ошибки, то там как раз будет описан метод force_parse(). Для разным ошибок доступны разные атрибуты и методы.

winlook38 ★★
()
Ответ на: комментарий от Spirit_of_Stallman

Давно хотел попробовать руби, да повода все не было. Так что мы квиты. Кстати, что-то по сравнению с питоном он какой-то страшный и непонятный. Может быть дело привычки, конечно.

winlook38 ★★
()
Ответ на: комментарий от winlook38

Я сам на него только перехожу.
Сотрудники говорят что он страшен и нечитабелен, если смотреть со стороны.
Мой же взгляд, после нескольких лет баша - он просто верх красоты.
Как сам язык - тоже очень понравился. Вот именно то, что я всегда искал. Питон юзал недели 4ре (по две на 2.х и 3.х) - некоторые моменты оказались не по-душе.
ЗЫ: си-шарпер, увидев баш-скрипт на over 400 строк - теряет сознание :)))

Spirit_of_Stallman ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.