nntplib — Клиент протокола NNTP
Исходный код: Lib/nntplib.py
Этот модуль определяет класс NNTP, который реализует клиентскую сторону Протокола передачи новостей по сети (NNTP). Его можно использовать для реализации новостного читателя или рассыльщика, или автоматизированных обработчиков новостей. Он совместим с RFC 3977, а также со старыми RFC 977 и RFC 2980.
Вот два небольших примера его использования. Для отображения некоторых статистических данных о новостной группе и вывода заголовков последних 10 статей:
>>> s = nntplib.NNTP('news.gmane.io')
>>> resp, count, first, last, name = s.group('gmane.comp.python.committers')
>>> print('Group', name, 'has', count, 'articles, range', first, 'to', last)
Group gmane.comp.python.committers has 1096 articles, range 1 to 1096
>>> resp, overviews = s.over((last - 9, last))
>>> for id, over in overviews:
... print(id, nntplib.decode_header(over['subject']))
...
1087 Re: Commit privileges for Łukasz Langa
1088 Re: 3.2 alpha 2 freeze
1089 Re: 3.2 alpha 2 freeze
1090 Re: Commit privileges for Łukasz Langa
1091 Re: Commit privileges for Łukasz Langa
1092 Updated ssh key
1093 Re: Updated ssh key
1094 Re: Updated ssh key
1095 Hello fellow committers!
1096 Re: Hello fellow committers!
>>> s.quit()
'205 Bye!'
Для отправки статьи из двоичного файла (предполагается, что у статьи есть корректные заголовки и у вас есть право на отправку в определённую новостную группу):
>>> s = nntplib.NNTP('news.gmane.io')
>>> f = open('article.txt', 'rb')
>>> s.post(f)
'240 Article posted successfully.'
>>> s.quit()
'205 Bye!'
Сам модуль определяет следующие классы:
-
class nntplib.NNTP(host, port=119, user=None, password=None, readermode=None, usenetrc=False[, timeout]) -
Возвращает новый объект
NNTP, представляющий подключение к серверу NNTP, работающему на хосте host, прослушивающем порт port. Для подключения к сокету можно указать необязательное значение timeout. Если предоставлены необязательные user и password или подходящие учетные данные присутствуют в/.netrcи необязательный флаг usenetrc имеет значение true, то используются командыAUTHINFO USERиAUTHINFO PASSдля идентификации и аутентификации пользователя на сервере. Если необязательный флаг readermode имеет значение true, то перед аутентификацией отправляется командаmode reader. Режим чтения иногда необходим, если вы подключаетесь к серверу NNTP на локальной машине и планируете вызывать команды, специфичные для чтения, такие какgroup. Если вы получаете неожиданныеNNTPPermanentError, вам может потребоваться установить readermode. КлассNNTPподдерживает операторwithдля безусловного перехвата исключенийOSErrorи закрытия подключения к NNTP по завершении, например:>>> from nntplib import NNTP >>> with NNTP('news.gmane.io') as n: ... n.group('gmane.comp.python.committers') ... ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') >>>Вызывает событие аудита аудита
nntplib.connectс аргументамиself,host,port.Все команды вызовут событие аудита аудита
nntplib.putlineс аргументамиselfиline, гдеline— байты, которые будут отправлены удалённому хосту.Изменено в версии 3.2: usenetrc теперь
Falseпо умолчанию.Изменено в версии 3.3: Была добавлена поддержка оператора
with.
-
class nntplib.NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False[, timeout]) -
Возвращает новый объект
NNTP_SSL, представляющий зашифрованное подключение к серверу NNTP, работающему на хосте host, прослушивающем порт port. ОбъектыNNTP_SSLимеют те же методы, что и объектыNNTP. Если port опущен, используется порт 563 (NNTPS). ssl_context также является необязательным и представляет собой объектSSLContext. Для получения наилучшей практики прочитайте Рекомендации по безопасности. Все остальные параметры ведут себя так же, как дляNNTP.Обратите внимание, что SSL-на-563 не рекомендуется в соответствии с RFC 4642 в пользу STARTTLS, как описано ниже. Однако некоторые серверы поддерживают только первый вариант.
Вызывает событие аудита аудита
nntplib.connectс аргументамиself,host,port.Все команды вызовут событие аудита аудита
nntplib.putlineс аргументамиselfиline, гдеline— байты, которые будут отправлены удалённому хосту.Добавлено в версии 3.2.
Изменено в версии 3.4: Класс теперь поддерживает проверку имени хоста с помощью
ssl.SSLContext.check_hostnameи Server Name Indication (см.ssl.HAS_SNI).
-
exception nntplib.NNTPError -
Производный от стандартного исключения
Exception, это базовый класс для всех исключений, генерируемых модулемnntplib. У экземпляров этого класса есть следующий атрибут:-
response -
Ответ сервера, если доступен, в виде объекта
str.
-
-
exception nntplib.NNTPReplyError -
Исключение, генерируемое при получении неожиданного ответа от сервера.
-
exception nntplib.NNTPTemporaryError -
Исключение, генерируемое при получении кода ответа в диапазоне 400–499.
-
exception nntplib.NNTPPermanentError -
Исключение, генерируемое при получении кода ответа в диапазоне 500–599.
-
exception nntplib.NNTPProtocolError -
Исключение, генерируемое при получении ответа от сервера, который не начинается с цифры в диапазоне 1–5.
-
exception nntplib.NNTPDataError -
Исключение, генерируемое при ошибке в данных ответа.
Объекты NNTP
После подключения объекты NNTP и NNTP_SSL поддерживают следующие методы и атрибуты.
Атрибуты
-
NNTP.nntp_version -
Целое число, представляющее версию протокола NNTP, поддерживаемую сервером. На практике это должно быть
2для серверов, заявляющих о соответствии RFC 3977, и1для других.Добавлено в версии 3.2.
-
NNTP.nntp_implementation -
Строка, описывающая имя и версию программного обеспечения сервера NNTP или
None, если не указано сервером.Добавлено в версии 3.2.
Методы
Ответ, возвращаемый в качестве первого элемента кортежа возвращаемых значений почти всех методов, — это ответ сервера: строка, начинающаяся с трёхзначного кода. Если ответ сервера указывает на ошибку, метод поднимает одно из вышеперечисленных исключений.
Многие из следующих методов принимают необязательный ключевой аргумент file. При передаче аргумента file он должен быть либо объектом файла, открытым для двоичного записи, либо именем файла на диске, в который необходимо записать данные. Метод затем запишет любые данные, возвращённые сервером (кроме строки ответа и завершающей точки), в файл; любой список строк, кортежей или объектов, которые обычно возвращает метод, будет пустым.
Изменено в версии 3.2: Многие из следующих методов были переработаны и исправлены, что делает их несовместимыми со своими аналогами из версии 3.1.
-
NNTP.quit() -
Отправляет команду
QUITи закрывает соединение. После вызова этого метода другие методы объекта NNTP вызывать не следует.
-
NNTP.getwelcome() -
Возвращает сообщение приветствия, отправленное сервером в ответ на первоначальное подключение. (Это сообщение иногда содержит отказные оговорки или справочную информацию, которая может быть полезна пользователю.)
-
NNTP.getcapabilities() -
Возвращает возможности сервера, объявленные согласно RFC 3977, как экземпляр
dict, сопоставляющий имена возможностей с (возможно пустыми) списками значений. На устаревших серверах, которые не понимают командуCAPABILITIES, возвращается пустой словарь.>>> s = NNTP('news.gmane.io') >>> 'POST' in s.getcapabilities() TrueДобавлен в версии 3.2.
-
NNTP.login(user=None, password=None, usenetrc=True) -
Отправляет команды
AUTHINFOс именем пользователя и паролем. Если user и password являютсяNoneи usenetrc имеет значение True, данные для входа из~/.netrcбудут использованы, если это возможно.Если не задерживать специально, вход обычно выполняется во время инициализации объекта
NNTP, и отдельное вызов этой функции не требуется. Чтобы заставить аутентификацию отложить, вы не должны устанавливать user или password при создании объекта и должны установить usenetrc в False.Добавлен в версии 3.2.
-
NNTP.starttls(context=None) -
Отправляет команду
STARTTLS. Это включит шифрование в соединении NNTP. Аргумент context является необязательным и должен быть объектомssl.SSLContext. Пожалуйста, прочитайте Рекомендации по безопасности для получения рекомендаций.Обратите внимание, что это не может быть выполнено после передачи информации об аутентификации, и аутентификация по умолчанию выполняется, если возможно, при инициализации объекта
NNTP. См.NNTP.login()для получения информации о подавлении этого поведения.Добавлен в версии 3.2.
Изменено в версии 3.4: Метод теперь поддерживает проверку имени хоста с помощью
ssl.SSLContext.check_hostnameи Server Name Indication (см.ssl.HAS_SNI).
-
NNTP.newgroups(date, *, file=None) -
Отправляет команду
NEWGROUPS. Аргумент date должен быть объектомdatetime.dateилиdatetime.datetime. Возвращает пару(response, groups), где groups — список, представляющий группы, которые появились с указанной даты date. Однако, если предоставлен file, то groups будет пустым.>>> from datetime import date, timedelta >>> resp, groups = s.newgroups(date.today() - timedelta(days=3)) >>> len(groups) 85 >>> groups[0] GroupInfo(group='gmane.network.tor.devel', last='4', first='1', flag='m')
-
NNTP.newnews(group, date, *, file=None) -
Отправляет команду
NEWNEWS. Здесь group — имя группы или'*', а date имеет то же значение, что и дляnewgroups(). Возвращает пару(response, articles), где articles — список идентификаторов сообщений.Эта команда часто отключена администраторами серверов NNTP.
-
NNTP.list(group_pattern=None, *, file=None) -
Отправляет команду
LISTилиLIST ACTIVE. Возвращает пару(response, list), где list — список кортежей, представляющих все доступные группы на этом сервере NNTP, необязательно соответствующие шаблону строки group_pattern. Каждый кортеж имеет вид(group, last, first, flag), где group — имя группы, last и first — номера последнего и первого сообщения, а flag обычно принимает одно из этих значений:-
y: Разрешены локальные публикации и статьи от коллег. -
m: Группа модерируется, и все публикации должны быть одобрены. -
n: Не разрешены локальные публикации, только статьи от коллег. -
j: Статьи от коллег помещаются в папку спама вместо этого. -
x: Не разрешены локальные публикации, и статьи от коллег игнорируются. -
=foo.bar: Статьи помещаются в группуfoo.barвместо этого.
Если flag имеет другое значение, то состояние новостной группы следует считать неизвестным.
Эта команда может возвращать очень большие результаты, особенно если group_pattern не указан. Лучше кешировать результаты автономно, если вам не нужно их обновлять.
Изменено в версии 3.2: Добавлен аргумент group_pattern.
-
-
NNTP.descriptions(grouppattern) -
Отправляет команду
LIST NEWSGROUPS, где grouppattern — строка с подстановкой, как указано в RFC 3977 (в сущности, такая же, как у подстановочных символов в DOS или UNIX). Возвращает пару(response, descriptions), где descriptions — словарь, сопоставляющий имена групп с текстовыми описаниями.>>> resp, descs = s.descriptions('gmane.comp.python.*') >>> len(descs) 295 >>> descs.popitem() ('gmane.comp.python.bio.general', 'BioPython discussion list (Moderated)')
-
NNTP.description(group) -
Получает описание для отдельной группы group. Если соответствует несколько групп (если «group» — строка с подстановкой), возвращает первую. Если ни одной группы не найдено, возвращает пустую строку.
Это скрывает код ответа от сервера. Если нужен код ответа, используйте
descriptions().
-
NNTP.group(name) -
Отправляет команду
GROUP, где name — имя группы. Группа выбирается как текущая, если она существует. Возвращает кортеж(response, count, first, last, name), где count — (приблизительное) количество статей в группе, first — номер первой статьи в группе, last — номер последней статьи в группе, а name — имя группы.
-
NNTP.over(message_spec, *, file=None) -
Отправляет команду
OVERили командуXOVERна устаревших серверах. message_spec может быть либо строкой, представляющей идентификатор сообщения, либо кортежем(first, last)чисел, указывающим диапазон статей в текущей группе, или кортежем(first, None)чисел, указывающим диапазон статей, начинающийся с first до последней статьи в текущей группе, илиNoneдля выбора текущей статьи в текущей группе.Возвращает пару
(response, overviews). overviews — список кортежей(article_number, overview), по одному на каждую статью, выбранную message_spec. Каждый overview — словарь с тем же количеством элементов, но это число зависит от сервера. Эти элементы — либо заголовки сообщений (ключ — тогда строка заголовка в нижнем регистре), либо метаданные (ключ — тогда имя метаданных, предваряемое":"). Следующие элементы гарантированно присутствуют по спецификации NNTP:- заголовки
subject,from,date,message-idиreferences - метаданные
:bytes: количество байтов во всей исходной статье (включая заголовки и тело) - метаданные
:lines: количество строк в теле статьи
Значение каждого элемента — либо строка, либо
None, если элемент отсутствует.Рекомендуется использовать функцию
decode_header()для значений заголовков, если они могут содержать не-ASCII символы:>>> _, _, first, last, _ = s.group('gmane.comp.python.devel') >>> resp, overviews = s.over((last, last)) >>> art_num, over = overviews[0] >>> art_num 117216 >>> list(over.keys()) ['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject'] >>> over['from'] '=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?= <martin@v.loewis.de>' >>> nntplib.decode_header(over['from']) '"Martin v. Löwis" <martin@v.loewis.de>'Добавлен в версии 3.2.
- заголовки
-
NNTP.help(*, file=None) -
Отправляет команду
HELP. Возвращает пару(response, list), где list — список строк справки.
-
NNTP.stat(message_spec=None) -
Отправить команду
STAT, где message_spec — это либо идентификатор сообщения (включённый в'<'и'>') или номер статьи в текущей группе. Если message_spec опущено или равноNone, рассматривается текущая статья в текущей группе. Возвращает тройку(response, number, id), где number — номер статьи, а id — идентификатор сообщения.>>> _, _, first, last, _ = s.group('gmane.comp.python.devel') >>> resp, number, message_id = s.stat(first) >>> number, message_id (9099, '<20030112190404.GE29873@epoch.metaslash.com>')
-
NNTP.next() -
Отправить команду
NEXT. Возвращает результат, как дляstat().
-
NNTP.last() -
Отправить команду
LAST. Возвращает результат, как дляstat().
-
NNTP.article(message_spec=None, *, file=None) -
Отправить команду
ARTICLE, где message_spec имеет то же значение, что и дляstat(). Возвращает кортеж(response, info), где info —namedtupleс тремя атрибутами number, message_id и lines (в этом порядке). number — номер статьи в группе (или 0, если информация недоступна), message_id — идентификатор сообщения в виде строки, а lines — список строк (без завершающих символов новой строки), составляющих исходное сообщение, включая заголовки и тело.>>> resp, info = s.article('<20030112190404.GE29873@epoch.metaslash.com>') >>> info.number 0 >>> info.message_id '<20030112190404.GE29873@epoch.metaslash.com>' >>> len(info.lines) 65 >>> info.lines[0] b'Path: main.gmane.org!not-for-mail' >>> info.lines[1] b'From: Neal Norwitz <neal@metaslash.com>' >>> info.lines[-3:] [b'There is a patch for 2.3 as well as 2.2.', b'', b'Neal']
-
NNTP.head(message_spec=None, *, file=None) -
То же, что и
article(), но отправляет командуHEAD. Возвращаемые (или записываемые в file) lines будут содержать только заголовки сообщения, а не тело.
-
NNTP.body(message_spec=None, *, file=None) -
То же, что и
article(), но отправляет командуBODY. Возвращаемые (или записываемые в file) lines будут содержать только тело сообщения, а не заголовки.
-
NNTP.post(data) -
Опубликовать статью с помощью команды
POST. Аргумент data — это либо открытый для двоичного чтения объект файла, либо любой итерируемый набор байтовых объектов (представляющих исходные строки публикуемой статьи). Он должен представлять собой правильно сформированную новостную статью, включая необходимые заголовки. Методpost()автоматически экранирует строки, начинающиеся с., и добавляет завершающую строку.Если метод выполняется успешно, возвращается ответ сервера. Если сервер отказывается от публикации, возникает
NNTPReplyError.
-
NNTP.ihave(message_id, data) -
Отправить команду
IHAVE. message_id — это идентификатор сообщения, которое нужно отправить серверу (включённый в'<'и'>'). Параметр data и возвращаемое значение такие же, как дляpost().
-
NNTP.date() -
Возвращает пару
(response, date). date — объектdatetime, содержащий текущую дату и время сервера.
-
NNTP.slave() -
Отправить команду
SLAVE. Возвращает response сервера.
-
NNTP.set_debuglevel(level) -
Установить уровень отладки экземпляра. Это контролирует объём выводимых данных отладки. По умолчанию,
0, вывод отладки не производится. Значение1создаёт умеренный объём вывода отладки, как правило, одна строка на запрос или ответ. Значение2или выше производит максимальный объём вывода отладки, регистрируя каждую отправленную и полученную строку по подключению (включая текст сообщения).
Следующие функции являются необязательными расширениями NNTP, определёнными в RFC 2980. Некоторые из них были заменены новыми командами в RFC 3977.
-
NNTP.xhdr(hdr, str, *, file=None) -
Отправить команду
XHDR. Аргумент hdr — это ключевое слово заголовка, например'subject'. Аргумент str должен иметь вид'first-last', где first и last — номера первой и последней статей для поиска. Возвращает пару(response, list), где list — список пар(id, text), где id — номер статьи (в виде строки), а text — текст запрошенного заголовка для этой статьи. Если параметр file указан, то вывод командыXHDRсохраняется в файле. Если file — строка, метод откроет файл с этим именем, запишет в него, а затем закроет. Если file — объект файла, то будет вызыватьсяwrite()для записи строк вывода команды. Если file указан, то возвращаемый list будет пустым списком.
-
NNTP.xover(start, end, *, file=None) -
Отправить команду
XOVER. start и end — номера статей, определяющие диапазон выбираемых статей. Возвращаемое значение такое же, как дляover(). Рекомендуется использоватьover(), так как он автоматически будет использовать новую командуOVERесли она доступна.
-
NNTP.xpath(id) -
Возвращает пару
(resp, path), где path — путь к каталогу статьи с идентификатором сообщения id. В большинстве случаев это расширение не включено администраторами NNTP-сервера.Устарело начиная с версии 3.3: Расширение XPATH не активно используется.
Функции-помощники
В модуле также определена следующая функция-помощник:
-
nntplib.decode_header(header_str) -
Декодировать значение заголовка, удаляя экранирование любых экранированных символов, не являющихся ASCII. header_str должен быть объектом
str. Возвращается неэкранированное значение. Рекомендуется использовать эту функцию для отображения некоторых заголовков в удобочитаемой форме:>>> decode_header("Some subject") 'Some subject' >>> decode_header("=?ISO-8859-15?Q?D=E9buter_en_Python?=") 'Débuter en Python' >>> decode_header("Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=") 'Re: problème de matrice'
© 2001–2022 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.8/library/nntplib.html