До настоящего момента в этой главе мы рассматривали инструменты 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