nntplib
— Клиент протокола NNTP¶
Исходный код: Lib/nntplib.py
Модуль определяет класс NNTP
, реализующий клиентскую сторону
Сетевого протокола передачи новостей (Network News Transfer Protocol). Он может быть
использован для реализации
читателя новостей, постеров или автоматизированных новостных процессоров.
Совместим с 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 верен, командыAUTHINFO USER
иAUTHINFO PASS
- используемый, чтобы опознать и подтвердить подлинность пользователя к серверу. Если необязательный флаг readermode имеет значение true, то перед выполнением аутентификации отправляется командаmode reader
. Режим читателя иногда необходим, если вы соединяетесь с сервером сППН на машине локальная и намереваетесь назвать определенные для читателя команды, такие какgroup
. Если вы получаете непредвиденныйNNTPPermanentError
s, возможно, вам потребуется установить readermode. КлассNNTP
поддерживаетwith
инструкция для безусловного использования исключенийOSError
и закрытия соединения NNTP по завершении, например:>>> from nntplib import NNTP >>> with NNTP('news.gmane.io') as n: ... n.group('gmane.comp.python.committers') ... # doctest: +SKIP ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') >>>
Raises an auditing event
nntplib.connect
with argumentsself
,host
,port
.Все команды поднимут auditing event
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-on-563 не поощряется на RFC 4642, в пользу STARTTLS, как описано ниже. Однако некоторые серверы поддерживают только первые.
Raises an auditing event
nntplib.connect
with argumentsself
,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
поддерживают следующие методы и
атрибуты.
Признаки¶
Методы¶
response, который является возвращенный как первым предметом в кортеже возвращает почти всех методов, является ответом сервера: строка, начинающийся с код с тремя цифрами. Если ответ сервера указывает на ошибку, метод вызывает одно из вышеуказанных исключений.
Многие из следующих методов принимают необязательный аргумент только ключевой 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) # doctest: +SKIP 85 >>> groups[0] # doctest: +SKIP 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 - wildmat строка, как указано в RFC 3977 (по сути, она совпадает с подстановочным знаком оболочки DOS или UNIX строки). Возвращает пара(response, descriptions)
, где descriptions - словарь, сопоставляющий имена групп текстовым описаниям.>>> resp, descs = s.descriptions('gmane.comp.python.*') >>> len(descs) # doctest: +SKIP 295 >>> descs.popitem() # doctest: +SKIP ('gmane.comp.python.bio.general', 'BioPython discussion list (Moderated)')
-
NNTP.
description
(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.
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
. lines возвращенный (или записанный в file) будет содержать только заголовки сообщений, а не тело.
-
NNTP.
body
(message_spec=None, *, file=None)¶ То же, что и
article()
, но отправляет командуBODY
. lines возвращенный (или записанный в file) будет содержать только текст сообщения, а не заголовки.
-
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'