Документация Python неофициальный перевод

nntplib.md

377 строк · 35.2 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.11/library/nntplib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`nntplib`](https://python-all.ru/3.11/library/nntplib.html#module-nntplib) – клиент протокола NNTP89**Исходный код:** [Lib/nntplib.py](https://python-all.ru/src/3.11/Lib/nntplib.py)1011Устарело с версии 3.11: Модуль [`nntplib`](https://python-all.ru/3.11/library/nntplib.html#module-nntplib) устарел (подробнее см. [**PEP 594**](https://python-all.ru/3.11/library/nntplib.html)).1213---1415Этот модуль определяет класс [`NNTP`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP), реализующий клиентскую часть протокола передачи новостей (Network News Transfer Protocol). Его можно использовать для создания программ чтения новостей, публикации сообщений или автоматической обработки новостей. Он совместим с [**RFC 3977**](https://python-all.ru/3.11/library/nntplib.html), а также с более старыми [**RFC 977**](https://python-all.ru/3.11/library/nntplib.html) и [**RFC 2980**](https://python-all.ru/3.11/library/nntplib.html).1617[Доступность](https://python-all.ru/3.11/library/intro.html#availability): not Emscripten, not WASI.1819Этот модуль не работает или недоступен на платформах WebAssembly `wasm32-emscripten` и `wasm32-wasi`. См. [платформы WebAssembly](https://python-all.ru/3.11/library/intro.html#wasm-availability) для получения дополнительной информации.2021Вот два небольших примера использования. Чтобы вывести статистику по группе новостей и напечатать темы последних 10 статей:2223```python24>>> s = nntplib.NNTP('news.gmane.io')25>>> resp, count, first, last, name = s.group('gmane.comp.python.committers')26>>> print('Group', name, 'has', count, 'articles, range', first, 'to', last)27Group gmane.comp.python.committers has 1096 articles, range 1 to 109628>>> resp, overviews = s.over((last - 9, last))29>>> for id, over in overviews:30...     print(id, nntplib.decode_header(over['subject']))31...321087 Re: Commit privileges for Łukasz Langa331088 Re: 3.2 alpha 2 freeze341089 Re: 3.2 alpha 2 freeze351090 Re: Commit privileges for Łukasz Langa361091 Re: Commit privileges for Łukasz Langa371092 Updated ssh key381093 Re: Updated ssh key391094 Re: Updated ssh key401095 Hello fellow committers!411096 Re: Hello fellow committers!42>>> s.quit()43'205 Bye!'44```4546Чтобы опубликовать статью из двоичного файла (предполагается, что статья содержит корректные заголовки и у вас есть права на публикацию в данной группе новостей):4748```python49>>> s = nntplib.NNTP('news.gmane.io')50>>> f = open('article.txt', 'rb')51>>> s.post(f)52'240 Article posted successfully.'53>>> s.quit()54'205 Bye!'55```5657Сам модуль определяет следующие классы:5859#### `class nntplib.NNTP(host, port=119, user=None, password=None, readermode=None, usenetrc=False[, timeout])`6061Возвращает новый объект [`NNTP`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP), представляющий соединение с NNTP-сервером, работающим на хосте *host*, прослушивающем порт *port*. Для сокетного соединения можно указать необязательный *timeout*. Если указаны необязательные *user* и *password*, или если подходящие учётные данные находятся в `/.netrc` и необязательный флаг *usenetrc* имеет значение true, для идентификации и аутентификации пользователя на сервере используются команды `AUTHINFO USER` и `AUTHINFO PASS`. Если необязательный флаг *readermode* имеет значение true, то перед выполнением аутентификации отправляется команда `mode reader`. Режим чтения (reader mode) иногда необходим, если вы подключаетесь к NNTP-серверу на локальной машине и собираетесь вызывать специфичные для чтения команды, например `group`. Если вы получаете неожиданные [`NNTPPermanentError`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTPPermanentError), возможно, потребуется установить *readermode*. Класс [`NNTP`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP) поддерживает оператор [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with) для безусловного перехвата исключений [`OSError`](https://python-all.ru/3.11/library/exceptions.html#OSError) и закрытия NNTP-соединения по завершении, например:6263```python64>>> from nntplib import NNTP65>>> with NNTP('news.gmane.io') as n:66...     n.group('gmane.comp.python.committers')67... 68('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')69>>>70```7172Вызывает [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `nntplib.connect` с аргументами `self`, `host`, `port`.7374Все команды вызывают [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `nntplib.putline` с аргументами `self` и `line`, где `line` – это байты, которые будут отправлены удалённому хосту.7576Изменено в версии 3.2: *usenetrc* теперь по умолчанию равен `False`.7778Изменено в версии 3.3: Добавлена поддержка оператора [`with`](https://python-all.ru/3.11/reference/compound_stmts.html#with).7980Изменено в версии 3.9: Если параметр *timeout* установлен в ноль, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError), чтобы предотвратить создание неблокирующего сокета.8182#### `class nntplib.NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False[, timeout])`8384Возвращает новый объект [`NNTP_SSL`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP_SSL), представляющий зашифрованное соединение с NNTP-сервером, работающим на хосте *host*, прослушивающем порт *port*. Объекты [`NNTP_SSL`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP_SSL) имеют те же методы, что и объекты [`NNTP`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP). Если *port* опущен, используется порт 563 (NNTPS). *ssl\_context* также необязателен и является объектом [`SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext). Пожалуйста, прочитайте [Соображения безопасности](https://python-all.ru/3.11/library/ssl.html#ssl-security) для ознакомления с лучшими практиками. Все остальные параметры ведут себя так же, как для [`NNTP`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP).8586Обратите внимание, что SSL на порту 563 не рекомендуется согласно [**RFC 4642**](https://python-all.ru/3.11/library/nntplib.html), вместо него следует использовать STARTTLS, как описано ниже. Однако некоторые серверы поддерживают только первый вариант.8788Вызывает [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `nntplib.connect` с аргументами `self`, `host`, `port`.8990Все команды вызывают [событие аудита](https://python-all.ru/3.11/library/sys.html#auditing) `nntplib.putline` с аргументами `self` и `line`, где `line` – это байты, которые будут отправлены удалённому хосту.9192Новое в версии 3.2.9394Изменено в версии 3.4: Теперь класс поддерживает проверку имени хоста с помощью [`ssl.SSLContext.check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname) и *Server Name Indication* (см. [`ssl.HAS_SNI`](https://python-all.ru/3.11/library/ssl.html#ssl.HAS_SNI)).9596Изменено в версии 3.9: Если параметр *timeout* установлен в ноль, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.11/library/exceptions.html#ValueError), чтобы предотвратить создание неблокирующего сокета.9798#### `exception nntplib.NNTPError`99100Производный от стандартного исключения [`Exception`](https://python-all.ru/3.11/library/exceptions.html#Exception), это базовый класс для всех исключений, возбуждаемых модулем [`nntplib`](https://python-all.ru/3.11/library/nntplib.html#module-nntplib). Экземпляры этого класса имеют следующий атрибут:101102#### `response`103104Ответ сервера, если доступен, в виде объекта [`str`](https://python-all.ru/3.11/library/stdtypes.html#str).105106#### `exception nntplib.NNTPReplyError`107108Исключение, возникающее при получении неожиданного ответа от сервера.109110#### `exception nntplib.NNTPTemporaryError`111112Исключение возбуждается, когда получен код ответа в диапазоне 400–499.113114#### `exception nntplib.NNTPPermanentError`115116Исключение возбуждается, когда получен код ответа в диапазоне 500–599.117118#### `exception nntplib.NNTPProtocolError`119120Исключение возбуждается, когда от сервера получен ответ, который не начинается с цифры в диапазоне 1–5.121122#### `exception nntplib.NNTPDataError`123124Исключение возбуждается при наличии ошибки в данных ответа.125126## Объекты NNTP127128В подключённом состоянии объекты [`NNTP`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP) и [`NNTP_SSL`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP_SSL) поддерживают следующие методы и атрибуты.129130### Атрибуты131132#### `NNTP.nntp_version`133134Целое число, представляющее версию протокола NNTP, поддерживаемую сервером. На практике должно быть равно `2` для серверов, заявляющих о соответствии [**RFC 3977**](https://python-all.ru/3.11/library/nntplib.html), и `1` для остальных.135136Новое в версии 3.2.137138#### `NNTP.nntp_implementation`139140Строка с названием и версией программного обеспечения NNTP-сервера или [`None`](https://python-all.ru/3.11/library/constants.html#None), если сервер не предоставил эту информацию.141142Новое в версии 3.2.143144### Методы145146*Ответ*, возвращаемый в качестве первого элемента кортежа результатов почти всех методов, – это ответ сервера: строка, начинающаяся с трёхзначного кода. Если ответ сервера указывает на ошибку, метод возбуждает одно из перечисленных выше исключений.147148Многие из следующих методов принимают необязательный аргумент, передаваемый только по ключу, *file*. Когда аргумент *file* указан, он должен быть либо [файловый объект](https://python-all.ru/3.11/glossary.html#term-file-object), открытым для бинарной записи, либо именем файла на диске для записи. В этом случае метод будет записывать все данные, возвращаемые сервером (за исключением строки ответа и завершающей точки), в файл; любой список строк, кортежей или объектов, который метод обычно возвращает, будет пуст.149150Изменено в версии 3.2: Многие из следующих методов были переработаны и исправлены, что делает их несовместимыми с их аналогами из версии 3.1.151152#### `NNTP.quit()`153154Отправляет команду `QUIT` и закрывает соединение. После вызова этого метода не следует вызывать другие методы объекта NNTP.155156#### `NNTP.getwelcome()`157158Возвращает приветственное сообщение, отправленное сервером в ответ на начальное подключение. (Это сообщение иногда содержит отказ от ответственности или справочную информацию, которая может быть полезна пользователю.)159160#### `NNTP.getcapabilities()`161162Возвращает [**RFC 3977**](https://python-all.ru/3.11/library/nntplib.html) возможности, объявленные сервером, в виде экземпляра [`dict`](https://python-all.ru/3.11/library/stdtypes.html#dict), отображающего имена возможностей в (возможно пустые) списки значений. На устаревших серверах, которые не понимают команду `CAPABILITIES`, вместо этого возвращается пустой словарь.163164```python165>>> s = NNTP('news.gmane.io')166>>> 'POST' in s.getcapabilities()167True168```169170Новое в версии 3.2.171172#### `NNTP.login(user=None, password=None, usenetrc=True)`173174Отправляет команды `AUTHINFO` с именем пользователя и паролем. Если *user* и *password* равны `None`, а *usenetrc* истинно, то по возможности будут использованы учётные данные из `~/.netrc`.175176Если задержка не задана намеренно, вход обычно выполняется во время инициализации объекта [`NNTP`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP), и отдельный вызов этой функции не требуется. Чтобы принудительно отложить аутентификацию, при создании объекта не следует задавать *user* или *password*, а *usenetrc* должно быть установлено в False.177178Новое в версии 3.2.179180#### `NNTP.starttls(context=None)`181182Отправляет команду `STARTTLS`. Это включает шифрование на NNTP-соединении. Аргумент *context* является необязательным и должен быть объектом [`ssl.SSLContext`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext). Рекомендуется ознакомиться с [рекомендациями по безопасности](https://python-all.ru/3.11/library/ssl.html#ssl-security) для соблюдения передовых практик.183184Обратите внимание, что это не может быть выполнено после передачи данных аутентификации, и аутентификация по умолчанию происходит, если это возможно, во время инициализации объекта [`NNTP`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP). Информацию о подавлении этого поведения см. в [`NNTP.login()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.login).185186Новое в версии 3.2.187188Изменено в версии 3.4: Теперь метод поддерживает проверку имени хоста с помощью [`ssl.SSLContext.check_hostname`](https://python-all.ru/3.11/library/ssl.html#ssl.SSLContext.check_hostname) и *Server Name Indication* (см. [`ssl.HAS_SNI`](https://python-all.ru/3.11/library/ssl.html#ssl.HAS_SNI)).189190#### `NNTP.newgroups(date, *, file=None)`191192Отправляет команду `NEWGROUPS`. Аргумент *date* должен быть объектом [`datetime.date`](https://python-all.ru/3.11/library/datetime.html#datetime.date) или [`datetime.datetime`](https://python-all.ru/3.11/library/datetime.html#datetime.datetime). Возвращает пару `(response, groups)`, где *groups* – это список, представляющий группы, появившиеся после указанной даты *date*. Однако если указан *file*, то *groups* будет пуст.193194```python195>>> from datetime import date, timedelta196>>> resp, groups = s.newgroups(date.today() - timedelta(days=3))197>>> len(groups) 19885199>>> groups[0] 200GroupInfo(group='gmane.network.tor.devel', last='4', first='1', flag='m')201```202203#### `NNTP.newnews(group, date, *, file=None)`204205Отправляет команду `NEWNEWS`. Здесь *group* – это имя группы или `'*'`, а *date* имеет то же значение, что и для [`newgroups()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.newgroups). Возвращает пару `(response, articles)`, где *articles* – это список идентификаторов сообщений.206207Эта команда часто отключается администраторами NNTP-серверов.208209#### `NNTP.list(group_pattern=None, *, file=None)`210211Отправляет команду `LIST` или `LIST ACTIVE`. Возвращает пару `(response, list)`, где *list* – это список кортежей, представляющих все группы, доступные на этом NNTP-сервере, опционально соответствующие строке шаблона *group\_pattern*. Каждый кортеж имеет вид `(group, last, first, flag)`, где *group* – имя группы, *last* и *first* – последний и первый номера статей, а *flag* обычно принимает одно из следующих значений:212213- `y`: разрешены локальные сообщения и статьи от внешних серверов.214- `m`: группа модерируется, и все сообщения должны быть одобрены.215- `n`: локальные сообщения запрещены, допускаются только статьи от внешних серверов.216- `j`: статьи от внешних серверов вместо этого помещаются в группу junk.217- `x`: локальные сообщения отсутствуют, а статьи от внешних серверов игнорируются.218- `=foo.bar`: статьи помещаются в группу `foo.bar` вместо этого.219220Если *flag* имеет другое значение, статус группы новостей следует считать неизвестным.221222Эта команда может возвращать очень большие результаты, особенно если *group\_pattern* не указан. Результаты лучше кэшировать в автономном режиме, если только нет реальной необходимости их обновлять.223224Изменено в версии 3.2: был добавлен *group\_pattern*.225226#### `NNTP.descriptions(grouppattern)`227228Отправляет команду `LIST NEWSGROUPS`, где *grouppattern* – это строка wildmat, как указано в [**RFC 3977**](https://python-all.ru/3.11/library/nntplib.html) (она, по сути, аналогична подстановочным строкам оболочки DOS или UNIX). Возвращает пару `(response, descriptions)`, где *descriptions* – это словарь, отображающий имена групп на текстовые описания.229230```python231>>> resp, descs = s.descriptions('gmane.comp.python.*')232>>> len(descs) 233295234>>> descs.popitem() 235('gmane.comp.python.bio.general', 'BioPython discussion list (Moderated)')236```237238#### `NNTP.description(group)`239240Получает описание для одной группы *group*. Если совпадает несколько групп (если ‘group’ – это строка шаблона wildmat), возвращается первое совпадение. Если ни одна группа не совпадает, возвращается пустая строка.241242Этот метод скрывает код ответа от сервера. Если код ответа необходим, используйте [`descriptions()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.descriptions).243244#### `NNTP.group(name)`245246Отправляет команду `GROUP`, где *name* – это имя группы. Группа выбирается в качестве текущей группы, если она существует. Возвращает кортеж `(response, count, first, last, name)`, где *count* – это (предположительное) количество статей в группе, *first* – номер первой статьи в группе, *last* – номер последней статьи в группе, а *name* – это имя группы.247248#### `NNTP.over(message_spec, *, file=None)`249250Отправляет команду `OVER` или команду `XOVER` на устаревших серверах. *message\_spec* может быть либо строкой, представляющей идентификатор сообщения, либо кортежем `(first, last)` чисел, указывающим диапазон статей в текущей группе, либо кортежем `(first, None)`, указывающим диапазон статей, начиная с *first* до последней статьи в текущей группе, либо [`None`](https://python-all.ru/3.11/library/constants.html#None) для выбора текущей статьи в текущей группе.251252Возвращает пару `(response, overviews)`. *overviews* – это список кортежей `(article_number, overview)`, по одному для каждой статьи, выбранной *message\_spec*. Каждый *overview* – это словарь с таким же количеством элементов, но это количество зависит от сервера. Эти элементы являются либо заголовками сообщения (тогда ключ – это имя заголовка в нижнем регистре), либо элементами метаданных (тогда ключ – это имя метаданных с префиксом `":"`). Следующие элементы гарантированно присутствуют по спецификации NNTP:253254- заголовки `subject`, `from`, `date`, `message-id` и `references`255- метаданные `:bytes`: количество байтов в полном сыром сообщении (включая заголовки и тело)256- метаданные `:lines`: количество строк в теле статьи257258Значением каждого элемента является либо строка, либо [`None`](https://python-all.ru/3.11/library/constants.html#None), если он отсутствует.259260Рекомендуется использовать функцию [`decode_header()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.decode_header) для значений заголовков, если они могут содержать символы не из ASCII:261262```python263>>> _, _, first, last, _ = s.group('gmane.comp.python.devel')264>>> resp, overviews = s.over((last, last))265>>> art_num, over = overviews[0]266>>> art_num267117216268>>> list(over.keys())269['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']270>>> over['from']271'=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?= <martin@v.loewis.de>'272>>> nntplib.decode_header(over['from'])273'"Martin v. Löwis" <martin@v.loewis.de>'274```275276Новое в версии 3.2.277278#### `NNTP.help(*, file=None)`279280Отправляет команду `HELP`. Возвращает пару `(response, list)`, где *list* – это список строк справки.281282#### `NNTP.stat(message_spec=None)`283284Отправляет команду `STAT`, где *message\_spec* – это либо идентификатор сообщения (заключённый в `'<'` и `'>'`), либо номер статьи в текущей группе. Если *message\_spec* опущен или равен [`None`](https://python-all.ru/3.11/library/constants.html#None), рассматривается текущая статья в текущей группе. Возвращает тройку `(response, number, id)`, где *number* – это номер статьи, а *id* – идентификатор сообщения.285286```python287>>> _, _, first, last, _ = s.group('gmane.comp.python.devel')288>>> resp, number, message_id = s.stat(first)289>>> number, message_id290(9099, '<20030112190404.GE29873@epoch.metaslash.com>')291```292293#### `NNTP.next()`294295Отправляет команду `NEXT`. Возвращаемое значение такое же, как для [`stat()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.stat).296297#### `NNTP.last()`298299Отправляет команду `LAST`. Возвращаемое значение такое же, как для [`stat()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.stat).300301#### `NNTP.article(message_spec=None, *, file=None)`302303Отправляет команду `ARTICLE`, где *message\_spec* имеет то же значение, что и для [`stat()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.stat). Возвращает кортеж `(response, info)`, где *info* – это [`namedtuple`](https://python-all.ru/3.11/library/collections.html#collections.namedtuple) с тремя атрибутами: *number*, *message\_id* и *lines* (в этом порядке). *number* – номер статьи в группе (или 0, если информация недоступна), *message\_id* – идентификатор сообщения в виде строки, а *lines* – список строк (без завершающих символов новой строки), составляющих сырое сообщение, включая заголовки и тело.304305```python306>>> resp, info = s.article('<20030112190404.GE29873@epoch.metaslash.com>')307>>> info.number3080309>>> info.message_id310'<20030112190404.GE29873@epoch.metaslash.com>'311>>> len(info.lines)31265313>>> info.lines[0]314b'Path: main.gmane.org!not-for-mail'315>>> info.lines[1]316b'From: Neal Norwitz <neal@metaslash.com>'317>>> info.lines[-3:]318[b'There is a patch for 2.3 as well as 2.2.', b'', b'Neal']319```320321#### `NNTP.head(message_spec=None, *, file=None)`322323То же, что и [`article()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.article), но отправляет команду `HEAD`. Возвращаемые *строки* (или записанные в *file*) будут содержать только заголовки сообщения, а не тело.324325#### `NNTP.body(message_spec=None, *, file=None)`326327То же, что и [`article()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.article), но отправляет команду `BODY`. Возвращаемые *строки* (или записанные в *file*) будут содержать только тело сообщения, а не заголовки.328329#### `NNTP.post(data)`330331Post an article using the `POST` command. The *data* argument is either a [file object](https://python-all.ru/3.11/glossary.html#term-file-object) opened for binary reading, or any iterable of bytes objects (representing raw lines of the article to be posted). It should represent a well-formed news article, including the required headers. The [`post()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.post) method automatically escapes lines beginning with `.` and appends the termination line.332333В случае успеха метода возвращается ответ сервера. Если сервер отклоняет отправку, возбуждается исключение [`NNTPReplyError`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTPReplyError).334335#### `NNTP.ihave(message_id, data)`336337Отправляет команду `IHAVE`. *message\_id* – это идентификатор сообщения, отправляемого серверу (заключённый в `'<'` и `'>'`). Параметр *data* и возвращаемое значение такие же, как для [`post()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.post).338339#### `NNTP.date()`340341Возвращает пару `(response, date)`. *date* – это объект [`datetime`](https://python-all.ru/3.11/library/datetime.html#datetime.datetime) , содержащий текущие дату и время сервера.342343#### `NNTP.slave()`344345Отправляет команду `SLAVE`. Возвращает *ответ сервера*.346347#### `NNTP.set_debuglevel(level)`348349Устанавливает уровень отладки экземпляра. Он управляет объёмом выводимых отладочных сообщений. Значение по умолчанию, `0`, не выводит отладочные сообщения. Значение `1` выдаёт умеренное количество отладочной информации, обычно одну строку на запрос или ответ. Значение `2` или больше выводит максимальный объём отладочной информации, регистрируя каждую отправленную и полученную строку соединения (включая текст сообщения).350351Ниже перечислены необязательные расширения NNTP, определённые в [**RFC 2980**](https://python-all.ru/3.11/library/nntplib.html). Некоторые из них заменены более новыми командами в [**RFC 3977**](https://python-all.ru/3.11/library/nntplib.html).352353#### `NNTP.xhdr(hdr, str, *, file=None)`354355Отправляет команду `XHDR`. Аргумент *hdr* – это ключевое слово заголовка, например `'subject'`. Аргумент *str* должен иметь вид `'first-last'`, где *first* и *last* – это номера первой и последней статей для поиска. Возвращает пару `(response, list)`, где *list* – список пар `(id, text)`, где *id* – номер статьи (в виде строки), а *text* – текст запрошенного заголовка для этой статьи. Если указан параметр *file*, то вывод команды `XHDR` сохраняется в файл. Если *file* – строка, метод откроет файл с таким именем, запишет в него и затем закроет. Если *file* – [файловый объект](https://python-all.ru/3.11/glossary.html#term-file-object), то для сохранения строк вывода команды будет вызываться `write()` для него. Если *file* указан, возвращаемый *list* будет пустым списком.356357#### `NNTP.xover(start, end, *, file=None)`358359Отправляет команду `XOVER`. *start* и *end* – это номера статей, определяющие диапазон выбираемых статей. Возвращаемое значение такое же, как для [`over()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.over). Рекомендуется использовать [`over()`](https://python-all.ru/3.11/library/nntplib.html#nntplib.NNTP.over), так как она автоматически применит более новую команду `OVER`, если она доступна.360361## Вспомогательные функции362363Модуль также определяет следующую вспомогательную функцию:364365#### `nntplib.decode_header(header_str)`366367Декодирует значение заголовка, снимая экранирование любых экранированных символов, не входящих в ASCII. *header\_str* должен быть объектом [`str`](https://python-all.ru/3.11/library/stdtypes.html#str). Возвращается значение без экранирования. Рекомендуется использовать эту функцию для отображения некоторых заголовков в удобочитаемом виде:368369```python370>>> decode_header("Some subject")371'Some subject'372>>> decode_header("=?ISO-8859-15?Q?D=E9buter_en_Python?=")373'Débuter en Python'374>>> decode_header("Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=")375'Re: problème de matrice'376```377