NNTP: доступ к телеконференциям

nntp dostup k telekonferenciyam Сценарии на стороне клиента

До настоящего момента в этой главе мы рассматривали инструменты Python для работы с FTP и электронной почтой и попутно познакомились с рядом модулей, используемых на стороне клиента: ftplib, poplib, smtplib, mimetypes, urllib и так далее. Этот набор хорошо представляет библиотечные инструменты Python для передачи и обработки информации в Интернете, но он далеко не полон.

Более или менее полный список модулей Python, связанных с Интернетом, приводится в начале предыдущей главы. Среди прочего Python содержит также вспомогательные библиотеки для поддержки на стороне клиента телеконференций Интернета, Telnet, HTTP, XML-RPC и других стандартных протоколов. Большинство из них аналогично модулям, с которыми мы уже встречались, — они предоставляют объектноориентированный интерфейс, автоматизирующий операции с сокетами и структурами сообщений.

Например, модуль Python nntplib поддерживает интерфейс клиента к протоколу NNTP (Network News Transfer Protocol — протокол передачи новостей по сети), используемый для чтения и передачи статей в телеконференции Usenet в Интернете. Как и другие протоколы, NNTP выполняется поверх сокетов и просто определяет стандартный протокол обмена сообщениями. Как и другие модули, nntplib скрывает большую часть деталей протокола и предоставляет сценариям на языке Python объектно-ориентированный интерфейс.

Мы не станем здесь вдаваться в тонкости протокола, но кратко отметим, что серверы NNTP хранят ряд статей, обычно в плоском файле базы данных. Если знать доменное имя или IP-адрес компьютера, на котором выполняется программа NNTP-сервера, прослушивающая порт NNTP, то можно написать сценарий, получающий или передающий статьи с любого компьютера, на котором установлен Python и имеется соединение с Интернетом. Например, сценарий в примере 13.28 по умолчанию получает и отображает последние 10 статей из телеконференции Python comp. lang.python с сервера NNTP news.rmi.net моего интернет-провайдера.

Пример 13.28. PP4E\Internet\Other\readnews.py

получает и выводит сообщения из телеконференции comp.lang.python с помощью модуля nntplib, который в действительности действует поверх сокетов;

nntplib поддерживает также отправку новых сообщений и так далее;

примечание: после прочтения сообщения не удаляются;

listonly = False

showhdrs = [‘From’, ‘Subject’, ‘Date’, ‘Newsgroups’, ‘Lines’] try:

import sys

servername, groupname, showcount = sys.argv[1:]

showcount = int(showcount)

except:

servername = nntpconfig.servername # присвойте этому

#   параметру имя сервера

groupname = ‘comp.lang.python’ # арг. ком. строки или знач.

#   по умолчанию

showcount = 10 # показать последние showcount сообщ.

#   соединиться с сервером nntp

print(‘Connecting to’, servername, ‘for’, groupname)

from nntplib import NNTP

connection = NNTP(servername)

(reply, count, first, last, name) = connection.group(groupname) print(‘%s has %s articles: %s-%s’ % (name, count, first, last))

#   запросить только заголовки

fetchfrom = str(int(last) (showcount-1))

(reply, subjects) = connection.xhdr(‘subject’, (fetchfrom + ‘-‘ + last))

#   вывести заголовки, получить заголовки+тело

for (id, subj) in subjects: # [-showcount:] для загрузки всех заголовков print(‘Article %s [%s]’ % (id, subj))

if not listonly and input(‘=> Display?’) in [‘y’, ‘Y’]: reply, num, tid, list = connection.head(id) for line in list:

for prefix in showhdrs:

if line[:len(prefix)] == prefix: print(line[:80]) break

if input(‘=> Show body?’) in [‘y’, ‘Y’]:

reply, num, tid, list = connection.body(id) for line in list:

print(line[:80])

print()

print(connection.quit())

Как и при использовании инструментов FTP и электронной почты, этот сценарий создает объект NNTP и вызывает его методы для получения информации телеконференции, а также заголовков и текста статей. Например, метод xhdr загружает выбранные заголовки из указанного диапазона сообщений.

При использовании NNTP-серверов, требующих аутентификацию, вам может также потребоваться передать конструктору NNTP имя пользователя, пароль и, возможно, флаг режима чтения. Более подробную информацию о других параметрах конструктора NNTP и методах объекта вы найдете в руководстве по библиотеке Python.

В интересах экономии места и времени я не буду здесь приводить вывод этого сценария. При запуске он соединяется с сервером и выводит строку с темой каждой статьи, останавливаясь для запроса, следует ли получить и показать информационные строки заголовка статьи (только заголовки, перечисленные в переменной showhdrs) и текст тела. Этот сценарий можно использовать и другим способом, явно передавая ему в командной строке имя сервера, название телеконференции и количество отображаемых сообщений. Потрудившись еще немного, можно было бы превратить этот сценарий в полноценный интерфейс новостей. Например, можно было бы посылать из сценария Python новые статьи с помощью следующего программного кода (предполагается присутствие в локальном файле надлежащих строк заголовков NNTP):

#  для отправки выполните следующее

#  (но только если действительно хотите отправить сообщение!) connection = NNTP(servername)

localfile = open(‘filename‘) # в файле содержатся правильные заголовки connection.post(localfile) # послать текст в телеконференцию connection.quit()

Можно также добавить к этому сценарию графический интерфейс на основе tkinter, чтобы облегчить работу с ним, но это расширение мы добавим к списку упражнений для самостоятельного решения (смотрите также в конце следующей главы предлагаемые расширения к интерфейсу PyMailGui — электронная почта и телеконференции имеют похожую структуру).

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий