Чтение онлайн

на главную - закладки

Жанры

Программирование на языке Ruby
Шрифт:

# может стоять любой допустимый адрес.

#

def send_mail(head, body)

 smtp = Net::SMTP.new

 smtp.start(Params::SMTP_SERVER)

 smtp.ready(Params::MAIL_SENDER, Params::MAILING_LIST) do |a|

a.write head

a.write "#{Params::LOOP_FLAG}\r\n"

a.write "\r\n"

a.write body

 end

end

##

#
Запоминаем идентификатор последнего прочитанного из конференции

# сообщения.

begin

 last_news = File.open(Params::LAST_NEWS_FILE) {|f| f.read}.to_i

rescue

 last_news = nil

end

##

# Соединяемся с новостным сервером и получаем номера сообщений

# из конференции comp.lang.ruby.

#

nntp = NNTPIО.new(Params::NEWS_SERVER)

raise "Failed to connect" unless nntp.connect

count, first, last = nntp.set_group(Params::NEWSGROUP)

##

# Если номер последнего сообщения не был запомнен раньше,

# сделаем это сейчас.

if not last_news

 last_news = last

end

##

# Перейти к последнему прочитанному ранее сообщению

# и попытаться получить следующие за ним. Это может привести

# к исключению, если сообщения с указанным номером

# не существует, но мы не обращаем на это внимания.

begin

 nntp.set_stat(last_news)

rescue

end

##

# Читаем все имеющиеся сообщения и отправляем каждое

# в список рассылки.

new_last = last_news

begin

 loop do

nntp.set_next

head = ""

body = ""

new_last, = nntp.get_head do |line|

head << line

end

# He
посылать сообщения, которые программа mail2news

# уже отправляла в конференцию ранее (иначе зациклимся).

next if head =~ %r{^X-rubymirror:}

nntp.get_body do |line|

body << line

end

send_mail(head, body)

 end

rescue

end

##

#И записать в файл новую отметку.

File.open(Params::LAST_NEWS_FILE, "w") do |f|

 f.puts new_last

end unless new_last == last_news

18.2.8. Получение Web-страницы с известным URL

Пусть нам нужно получить HTML-документ из Web. Возможно, вы хотите проверить контрольную сумму и узнать, не изменился ли документ, чтобы послать автоматическое уведомление. А быть может, вы пишете собственный браузер — тогда это первый шаг на пути длиной в тысячу километров.

require "net/http"

begin

 h = Net::HTTP.new("www.marsdrive.com", 80) # MarsDrive Consortium

 resp, data = h.get("/index.html", nil)

rescue => err

 puts "Ошибка: #{err}"

 exit

end

puts "Получено #{data.split.size} строк, #{data.size} байтов"

# Обработать...

Сначала мы создаем объект класса HTTP, указывая доменное имя и номер порта сервера (обычно используется порт 80). Затем выполняется операция

get
, которая возвращает ответ по протоколу HTTP и вместе с ним строку данных. В примере выше мы не проверяем ответ, но если возникла ошибка, то перехватываем ее и выходим.

Если мы благополучно миновали предложение

rescue
, то можем ожидать, что содержимое страницы находится в строке
data
. Мы можем обработать ее как сочтем нужным.

Что может пойти не так, какие ошибки мы перехватываем? Несколько. Может не существовать или быть недоступным сервер с указанным именем; указанный адрес может быть перенаправлен на другую страницу (эту ситуацию мы не обрабатываем); может быть возвращена пресловутая ошибка 404 (указанный документ не найден). Обработку подобных ошибок мы оставляем вам.

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

Поделиться:
Популярные книги

Утопия

Чайлд Линкольн
151. Книга-загадка, книга-бестселлер
Детективы:
триллеры
8.00
рейтинг книги
Утопия

Москва. Путь к империи

Торопцев Александр Петрович
Научно-образовательная:
история
5.00
рейтинг книги
Москва. Путь к империи

Неудержимый. Книга II

Боярский Андрей
2. Неудержимый
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Неудержимый. Книга II

Большой Сочи. История Кавказа

Андреев Александр Радьевич
Приключения:
путешествия и география
5.00
рейтинг книги
Большой Сочи. История Кавказа

Ночная музыка

Мойес Джоджо
Любовные романы:
современные любовные романы
8.64
рейтинг книги
Ночная музыка

Синяя Птица. (Трилогия)

Самойлова Елена Александровна
Синяя Птица
Фантастика:
юмористическая фантастика
9.14
рейтинг книги
Синяя Птица. (Трилогия)

Рэдволл

Джейкс Брайан
1. Рэдволл
Детские:
сказки
7.00
рейтинг книги
Рэдволл

Такая разная любовь

Пембертон Маргарет
Любовные романы:
современные любовные романы
7.33
рейтинг книги
Такая разная любовь

Замуж за принца

Блэквелл Элизабет
Любовные романы:
исторические любовные романы
8.53
рейтинг книги
Замуж за принца

Кысь. Зверотур. Рассказы

Толстая Татьяна Никитична
Проза:
проза прочее
5.00
рейтинг книги
Кысь. Зверотур. Рассказы

Обратная сторона пути

Панкеева Оксана Петровна
11. Хроники странного королевства
Фантастика:
фэнтези
9.55
рейтинг книги
Обратная сторона пути

АН (цикл 11 книг)

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
героическая фантастика
попаданцы
аниме
5.75
рейтинг книги
АН (цикл 11 книг)

Дым и зеркала

Хафф Таня
2. Дымовая трилогия
Фантастика:
фэнтези
ужасы и мистика
8.42
рейтинг книги
Дым и зеркала

Чудо купальской ночи

Алюшина Татьяна Александровна
Любовные романы:
современные любовные романы
7.87
рейтинг книги
Чудо купальской ночи