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

nntplib.md

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

1> **Источник:** https://python-all.ru/3.10/library/nntplib.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# [`nntplib`](https://python-all.ru/3.10/library/nntplib.html#module-nntplib) – клиент протокола NNTP89**Исходный код:** [Lib/nntplib.py](https://python-all.ru/src/3.10/Lib/nntplib.py)1011Устарело с версии 3.11: Модуль [`nntplib`](https://python-all.ru/3.10/library/nntplib.html#module-nntplib) устарел (подробнее см. [**PEP 594**](https://python-all.ru/3.10/library/nntplib.html)).1213---1415Этот модуль определяет класс [`NNTP`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP), реализующий клиентскую часть протокола передачи новостей (Network News Transfer Protocol). Его можно использовать для создания программ чтения новостей, публикации сообщений или автоматической обработки новостей. Он совместим с [**RFC 3977**](https://python-all.ru/3.10/library/nntplib.html), а также с более старыми [**RFC 977**](https://python-all.ru/3.10/library/nntplib.html) и [**RFC 2980**](https://python-all.ru/3.10/library/nntplib.html).1617Вот два небольших примера использования. Чтобы вывести статистику по группе новостей и напечатать темы последних 10 статей:1819```python20>>> s = nntplib.NNTP('news.gmane.io')21>>> resp, count, first, last, name = s.group('gmane.comp.python.committers')22>>> print('Group', name, 'has', count, 'articles, range', first, 'to', last)23Group gmane.comp.python.committers has 1096 articles, range 1 to 109624>>> resp, overviews = s.over((last - 9, last))25>>> for id, over in overviews:26...     print(id, nntplib.decode_header(over['subject']))27...281087 Re: Commit privileges for Łukasz Langa291088 Re: 3.2 alpha 2 freeze301089 Re: 3.2 alpha 2 freeze311090 Re: Commit privileges for Łukasz Langa321091 Re: Commit privileges for Łukasz Langa331092 Updated ssh key341093 Re: Updated ssh key351094 Re: Updated ssh key361095 Hello fellow committers!371096 Re: Hello fellow committers!38>>> s.quit()39'205 Bye!'40```4142Чтобы опубликовать статью из двоичного файла (предполагается, что статья содержит корректные заголовки и у вас есть права на публикацию в данной группе новостей):4344```python45>>> s = nntplib.NNTP('news.gmane.io')46>>> f = open('article.txt', 'rb')47>>> s.post(f)48'240 Article posted successfully.'49>>> s.quit()50'205 Bye!'51```5253Сам модуль определяет следующие классы:5455#### `class nntplib.NNTP(host, port=119, user=None, password=None, readermode=None, usenetrc=False[, timeout])`5657Возвращает новый объект [`NNTP`](https://python-all.ru/3.10/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.10/library/nntplib.html#nntplib.NNTPPermanentError), возможно, потребуется установить *readermode*. Класс [`NNTP`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP) поддерживает оператор [`with`](https://python-all.ru/3.10/reference/compound_stmts.html#with) для безусловного перехвата исключений [`OSError`](https://python-all.ru/3.10/library/exceptions.html#OSError) и закрытия NNTP-соединения по завершении, например:5859```python60>>> from nntplib import NNTP61>>> with NNTP('news.gmane.io') as n:62...     n.group('gmane.comp.python.committers')63... 64('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers')65>>>66```6768Вызывает [событие аудита](https://python-all.ru/3.10/library/sys.html#auditing) `nntplib.connect` с аргументами `self`, `host`, `port`.6970Все команды вызывают [событие аудита](https://python-all.ru/3.10/library/sys.html#auditing) `nntplib.putline` с аргументами `self` и `line`, где `line` – это байты, которые будут отправлены удалённому хосту.7172Изменено в версии 3.2: *usenetrc* теперь по умолчанию равен `False`.7374Изменено в версии 3.3: Добавлена поддержка оператора [`with`](https://python-all.ru/3.10/reference/compound_stmts.html#with).7576Изменено в версии 3.9: Если параметр *timeout* установлен в ноль, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError), чтобы предотвратить создание неблокирующего сокета.7778#### `class nntplib.NNTP_SSL(host, port=563, user=None, password=None, ssl_context=None, readermode=None, usenetrc=False[, timeout])`7980Возвращает новый объект [`NNTP_SSL`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP_SSL), представляющий зашифрованное соединение с NNTP-сервером, работающим на хосте *host*, прослушивающем порт *port*. Объекты [`NNTP_SSL`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP_SSL) имеют те же методы, что и объекты [`NNTP`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP). Если *port* опущен, используется порт 563 (NNTPS). *ssl\_context* также необязателен и является объектом [`SSLContext`](https://python-all.ru/3.10/library/ssl.html#ssl.SSLContext). Пожалуйста, прочитайте [Соображения безопасности](https://python-all.ru/3.10/library/ssl.html#ssl-security) для ознакомления с лучшими практиками. Все остальные параметры ведут себя так же, как для [`NNTP`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP).8182Обратите внимание, что SSL на порту 563 не рекомендуется согласно [**RFC 4642**](https://python-all.ru/3.10/library/nntplib.html), вместо него следует использовать STARTTLS, как описано ниже. Однако некоторые серверы поддерживают только первый вариант.8384Вызывает [событие аудита](https://python-all.ru/3.10/library/sys.html#auditing) `nntplib.connect` с аргументами `self`, `host`, `port`.8586Все команды вызывают [событие аудита](https://python-all.ru/3.10/library/sys.html#auditing) `nntplib.putline` с аргументами `self` и `line`, где `line` – это байты, которые будут отправлены удалённому хосту.8788Новое в версии 3.2.8990Изменено в версии 3.4: Теперь класс поддерживает проверку имени хоста с помощью [`ssl.SSLContext.check_hostname`](https://python-all.ru/3.10/library/ssl.html#ssl.SSLContext.check_hostname) и *Server Name Indication* (см. [`ssl.HAS_SNI`](https://python-all.ru/3.10/library/ssl.html#ssl.HAS_SNI)).9192Изменено в версии 3.9: Если параметр *timeout* установлен в ноль, будет возбуждено исключение [`ValueError`](https://python-all.ru/3.10/library/exceptions.html#ValueError), чтобы предотвратить создание неблокирующего сокета.9394#### `exception nntplib.NNTPError`9596Производный от стандартного исключения [`Exception`](https://python-all.ru/3.10/library/exceptions.html#Exception), это базовый класс для всех исключений, возбуждаемых модулем [`nntplib`](https://python-all.ru/3.10/library/nntplib.html#module-nntplib). Экземпляры этого класса имеют следующий атрибут:9798#### `response`99100Ответ сервера, если доступен, в виде объекта [`str`](https://python-all.ru/3.10/library/stdtypes.html#str).101102#### `exception nntplib.NNTPReplyError`103104Исключение, возникающее при получении неожиданного ответа от сервера.105106#### `exception nntplib.NNTPTemporaryError`107108Исключение возбуждается, когда получен код ответа в диапазоне 400–499.109110#### `exception nntplib.NNTPPermanentError`111112Исключение возбуждается, когда получен код ответа в диапазоне 500–599.113114#### `exception nntplib.NNTPProtocolError`115116Исключение возбуждается, когда от сервера получен ответ, который не начинается с цифры в диапазоне 1–5.117118#### `exception nntplib.NNTPDataError`119120Исключение возбуждается при наличии ошибки в данных ответа.121122## Объекты NNTP123124В подключённом состоянии объекты [`NNTP`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP) и [`NNTP_SSL`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP_SSL) поддерживают следующие методы и атрибуты.125126### Атрибуты127128#### `NNTP.nntp_version`129130Целое число, представляющее версию протокола NNTP, поддерживаемую сервером. На практике должно быть равно `2` для серверов, заявляющих о соответствии [**RFC 3977**](https://python-all.ru/3.10/library/nntplib.html), и `1` для остальных.131132Новое в версии 3.2.133134#### `NNTP.nntp_implementation`135136Строка с названием и версией программного обеспечения NNTP-сервера или [`None`](https://python-all.ru/3.10/library/constants.html#None), если сервер не предоставил эту информацию.137138Новое в версии 3.2.139140### Методы141142*Ответ*, возвращаемый в качестве первого элемента кортежа результатов почти всех методов, – это ответ сервера: строка, начинающаяся с трёхзначного кода. Если ответ сервера указывает на ошибку, метод возбуждает одно из перечисленных выше исключений.143144Многие из следующих методов принимают необязательный аргумент, передаваемый только по ключу, *file*. Когда аргумент *file* указан, он должен быть либо [файловый объект](https://python-all.ru/3.10/glossary.html#term-file-object), открытым для бинарной записи, либо именем файла на диске для записи. В этом случае метод будет записывать все данные, возвращаемые сервером (за исключением строки ответа и завершающей точки), в файл; любой список строк, кортежей или объектов, который метод обычно возвращает, будет пуст.145146Изменено в версии 3.2: Многие из следующих методов были переработаны и исправлены, что делает их несовместимыми с их аналогами из версии 3.1.147148#### `NNTP.quit()`149150Отправляет команду `QUIT` и закрывает соединение. После вызова этого метода не следует вызывать другие методы объекта NNTP.151152#### `NNTP.getwelcome()`153154Возвращает приветственное сообщение, отправленное сервером в ответ на начальное подключение. (Это сообщение иногда содержит отказ от ответственности или справочную информацию, которая может быть полезна пользователю.)155156#### `NNTP.getcapabilities()`157158Возвращает [**RFC 3977**](https://python-all.ru/3.10/library/nntplib.html) возможности, объявленные сервером, в виде экземпляра [`dict`](https://python-all.ru/3.10/library/stdtypes.html#dict), отображающего имена возможностей в (возможно пустые) списки значений. На устаревших серверах, которые не понимают команду `CAPABILITIES`, вместо этого возвращается пустой словарь.159160```python161>>> s = NNTP('news.gmane.io')162>>> 'POST' in s.getcapabilities()163True164```165166Новое в версии 3.2.167168#### `NNTP.login(user=None, password=None, usenetrc=True)`169170Отправляет команды `AUTHINFO` с именем пользователя и паролем. Если *user* и *password* равны `None`, а *usenetrc* истинно, то по возможности будут использованы учётные данные из `~/.netrc`.171172Если задержка не задана намеренно, вход обычно выполняется во время инициализации объекта [`NNTP`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP), и отдельный вызов этой функции не требуется. Чтобы принудительно отложить аутентификацию, при создании объекта не следует задавать *user* или *password*, а *usenetrc* должно быть установлено в False.173174Новое в версии 3.2.175176#### `NNTP.starttls(context=None)`177178Отправляет команду `STARTTLS`. Это включает шифрование на NNTP-соединении. Аргумент *context* является необязательным и должен быть объектом [`ssl.SSLContext`](https://python-all.ru/3.10/library/ssl.html#ssl.SSLContext). Рекомендуется ознакомиться с [рекомендациями по безопасности](https://python-all.ru/3.10/library/ssl.html#ssl-security) для соблюдения передовых практик.179180Обратите внимание, что это не может быть выполнено после передачи данных аутентификации, и аутентификация по умолчанию происходит, если это возможно, во время инициализации объекта [`NNTP`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP). Информацию о подавлении этого поведения см. в [`NNTP.login()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.login).181182Новое в версии 3.2.183184Изменено в версии 3.4: Теперь метод поддерживает проверку имени хоста с помощью [`ssl.SSLContext.check_hostname`](https://python-all.ru/3.10/library/ssl.html#ssl.SSLContext.check_hostname) и *Server Name Indication* (см. [`ssl.HAS_SNI`](https://python-all.ru/3.10/library/ssl.html#ssl.HAS_SNI)).185186#### `NNTP.newgroups(date, *, file=None)`187188Отправляет команду `NEWGROUPS`. Аргумент *date* должен быть объектом [`datetime.date`](https://python-all.ru/3.10/library/datetime.html#datetime.date) или [`datetime.datetime`](https://python-all.ru/3.10/library/datetime.html#datetime.datetime). Возвращает пару `(response, groups)`, где *groups* – это список, представляющий группы, появившиеся после указанной даты *date*. Однако если указан *file*, то *groups* будет пуст.189190```python191>>> from datetime import date, timedelta192>>> resp, groups = s.newgroups(date.today() - timedelta(days=3))193>>> len(groups) 19485195>>> groups[0] 196GroupInfo(group='gmane.network.tor.devel', last='4', first='1', flag='m')197```198199#### `NNTP.newnews(group, date, *, file=None)`200201Отправляет команду `NEWNEWS`. Здесь *group* – это имя группы или `'*'`, а *date* имеет то же значение, что и для [`newgroups()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.newgroups). Возвращает пару `(response, articles)`, где *articles* – это список идентификаторов сообщений.202203Эта команда часто отключается администраторами NNTP-серверов.204205#### `NNTP.list(group_pattern=None, *, file=None)`206207Отправляет команду `LIST` или `LIST ACTIVE`. Возвращает пару `(response, list)`, где *list* – это список кортежей, представляющих все группы, доступные на этом NNTP-сервере, опционально соответствующие строке шаблона *group\_pattern*. Каждый кортеж имеет вид `(group, last, first, flag)`, где *group* – имя группы, *last* и *first* – последний и первый номера статей, а *flag* обычно принимает одно из следующих значений:208209- `y`: разрешены локальные сообщения и статьи от внешних серверов.210- `m`: группа модерируется, и все сообщения должны быть одобрены.211- `n`: локальные сообщения запрещены, допускаются только статьи от внешних серверов.212- `j`: статьи от внешних серверов вместо этого помещаются в группу junk.213- `x`: локальные сообщения отсутствуют, а статьи от внешних серверов игнорируются.214- `=foo.bar`: статьи помещаются в группу `foo.bar` вместо этого.215216Если *flag* имеет другое значение, статус группы новостей следует считать неизвестным.217218Эта команда может возвращать очень большие результаты, особенно если *group\_pattern* не указан. Результаты лучше кэшировать в автономном режиме, если только нет реальной необходимости их обновлять.219220Изменено в версии 3.2: был добавлен *group\_pattern*.221222#### `NNTP.descriptions(grouppattern)`223224Отправляет команду `LIST NEWSGROUPS`, где *grouppattern* – это строка wildmat, как указано в [**RFC 3977**](https://python-all.ru/3.10/library/nntplib.html) (она, по сути, аналогична подстановочным строкам оболочки DOS или UNIX). Возвращает пару `(response, descriptions)`, где *descriptions* – это словарь, отображающий имена групп на текстовые описания.225226```python227>>> resp, descs = s.descriptions('gmane.comp.python.*')228>>> len(descs) 229295230>>> descs.popitem() 231('gmane.comp.python.bio.general', 'BioPython discussion list (Moderated)')232```233234#### `NNTP.description(group)`235236Получает описание для одной группы *group*. Если совпадает несколько групп (если ‘group’ – это строка шаблона wildmat), возвращается первое совпадение. Если ни одна группа не совпадает, возвращается пустая строка.237238Этот метод скрывает код ответа от сервера. Если код ответа необходим, используйте [`descriptions()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.descriptions).239240#### `NNTP.group(name)`241242Отправляет команду `GROUP`, где *name* – это имя группы. Группа выбирается в качестве текущей группы, если она существует. Возвращает кортеж `(response, count, first, last, name)`, где *count* – это (предположительное) количество статей в группе, *first* – номер первой статьи в группе, *last* – номер последней статьи в группе, а *name* – это имя группы.243244#### `NNTP.over(message_spec, *, file=None)`245246Отправляет команду `OVER` или команду `XOVER` на устаревших серверах. *message\_spec* может быть либо строкой, представляющей идентификатор сообщения, либо кортежем `(first, last)` чисел, указывающим диапазон статей в текущей группе, либо кортежем `(first, None)`, указывающим диапазон статей, начиная с *first* до последней статьи в текущей группе, либо [`None`](https://python-all.ru/3.10/library/constants.html#None) для выбора текущей статьи в текущей группе.247248Возвращает пару `(response, overviews)`. *overviews* – это список кортежей `(article_number, overview)`, по одному для каждой статьи, выбранной *message\_spec*. Каждый *overview* – это словарь с таким же количеством элементов, но это количество зависит от сервера. Эти элементы являются либо заголовками сообщения (тогда ключ – это имя заголовка в нижнем регистре), либо элементами метаданных (тогда ключ – это имя метаданных с префиксом `":"`). Следующие элементы гарантированно присутствуют по спецификации NNTP:249250- заголовки `subject`, `from`, `date`, `message-id` и `references`251- метаданные `:bytes`: количество байтов в полном сыром сообщении (включая заголовки и тело)252- метаданные `:lines`: количество строк в теле статьи253254Значением каждого элемента является либо строка, либо [`None`](https://python-all.ru/3.10/library/constants.html#None), если он отсутствует.255256Рекомендуется использовать функцию [`decode_header()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.decode_header) для значений заголовков, если они могут содержать символы не из ASCII:257258```python259>>> _, _, first, last, _ = s.group('gmane.comp.python.devel')260>>> resp, overviews = s.over((last, last))261>>> art_num, over = overviews[0]262>>> art_num263117216264>>> list(over.keys())265['xref', 'from', ':lines', ':bytes', 'references', 'date', 'message-id', 'subject']266>>> over['from']267'=?UTF-8?B?Ik1hcnRpbiB2LiBMw7Z3aXMi?= <martin@v.loewis.de>'268>>> nntplib.decode_header(over['from'])269'"Martin v. Löwis" <martin@v.loewis.de>'270```271272Новое в версии 3.2.273274#### `NNTP.help(*, file=None)`275276Отправляет команду `HELP`. Возвращает пару `(response, list)`, где *list* – это список строк справки.277278#### `NNTP.stat(message_spec=None)`279280Отправляет команду `STAT`, где *message\_spec* – это либо идентификатор сообщения (заключённый в `'<'` и `'>'`), либо номер статьи в текущей группе. Если *message\_spec* опущен или равен [`None`](https://python-all.ru/3.10/library/constants.html#None), рассматривается текущая статья в текущей группе. Возвращает тройку `(response, number, id)`, где *number* – это номер статьи, а *id* – идентификатор сообщения.281282```python283>>> _, _, first, last, _ = s.group('gmane.comp.python.devel')284>>> resp, number, message_id = s.stat(first)285>>> number, message_id286(9099, '<20030112190404.GE29873@epoch.metaslash.com>')287```288289#### `NNTP.next()`290291Отправляет команду `NEXT`. Возвращаемое значение такое же, как для [`stat()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.stat).292293#### `NNTP.last()`294295Отправляет команду `LAST`. Возвращаемое значение такое же, как для [`stat()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.stat).296297#### `NNTP.article(message_spec=None, *, file=None)`298299Отправляет команду `ARTICLE`, где *message\_spec* имеет то же значение, что и для [`stat()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.stat). Возвращает кортеж `(response, info)`, где *info* – это [`namedtuple`](https://python-all.ru/3.10/library/collections.html#collections.namedtuple) с тремя атрибутами: *number*, *message\_id* и *lines* (в этом порядке). *number* – номер статьи в группе (или 0, если информация недоступна), *message\_id* – идентификатор сообщения в виде строки, а *lines* – список строк (без завершающих символов новой строки), составляющих сырое сообщение, включая заголовки и тело.300301```python302>>> resp, info = s.article('<20030112190404.GE29873@epoch.metaslash.com>')303>>> info.number3040305>>> info.message_id306'<20030112190404.GE29873@epoch.metaslash.com>'307>>> len(info.lines)30865309>>> info.lines[0]310b'Path: main.gmane.org!not-for-mail'311>>> info.lines[1]312b'From: Neal Norwitz <neal@metaslash.com>'313>>> info.lines[-3:]314[b'There is a patch for 2.3 as well as 2.2.', b'', b'Neal']315```316317#### `NNTP.head(message_spec=None, *, file=None)`318319То же, что и [`article()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.article), но отправляет команду `HEAD`. Возвращаемые *строки* (или записанные в *file*) будут содержать только заголовки сообщения, а не тело.320321#### `NNTP.body(message_spec=None, *, file=None)`322323То же, что и [`article()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.article), но отправляет команду `BODY`. Возвращаемые *строки* (или записанные в *file*) будут содержать только тело сообщения, а не заголовки.324325#### `NNTP.post(data)`326327Post an article using the `POST` command. The *data* argument is either a [file object](https://python-all.ru/3.10/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.10/library/nntplib.html#nntplib.NNTP.post) method automatically escapes lines beginning with `.` and appends the termination line.328329В случае успеха метода возвращается ответ сервера. Если сервер отклоняет отправку, возбуждается исключение [`NNTPReplyError`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTPReplyError).330331#### `NNTP.ihave(message_id, data)`332333Отправляет команду `IHAVE`. *message\_id* – это идентификатор сообщения, отправляемого серверу (заключённый в `'<'` и `'>'`). Параметр *data* и возвращаемое значение такие же, как для [`post()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.post).334335#### `NNTP.date()`336337Возвращает пару `(response, date)`. *date* – это объект [`datetime`](https://python-all.ru/3.10/library/datetime.html#datetime.datetime) , содержащий текущие дату и время сервера.338339#### `NNTP.slave()`340341Отправляет команду `SLAVE`. Возвращает *ответ сервера*.342343#### `NNTP.set_debuglevel(level)`344345Устанавливает уровень отладки экземпляра. Он управляет объёмом выводимых отладочных сообщений. Значение по умолчанию, `0`, не выводит отладочные сообщения. Значение `1` выдаёт умеренное количество отладочной информации, обычно одну строку на запрос или ответ. Значение `2` или больше выводит максимальный объём отладочной информации, регистрируя каждую отправленную и полученную строку соединения (включая текст сообщения).346347Ниже перечислены необязательные расширения NNTP, определённые в [**RFC 2980**](https://python-all.ru/3.10/library/nntplib.html). Некоторые из них заменены более новыми командами в [**RFC 3977**](https://python-all.ru/3.10/library/nntplib.html).348349#### `NNTP.xhdr(hdr, str, *, file=None)`350351Отправляет команду `XHDR`. Аргумент *hdr* – это ключевое слово заголовка, например `'subject'`. Аргумент *str* должен иметь вид `'first-last'`, где *first* и *last* – это номера первой и последней статей для поиска. Возвращает пару `(response, list)`, где *list* – список пар `(id, text)`, где *id* – номер статьи (в виде строки), а *text* – текст запрошенного заголовка для этой статьи. Если указан параметр *file*, то вывод команды `XHDR` сохраняется в файл. Если *file* – строка, метод откроет файл с таким именем, запишет в него и затем закроет. Если *file* – [файловый объект](https://python-all.ru/3.10/glossary.html#term-file-object), то для сохранения строк вывода команды будет вызываться `write()` для него. Если *file* указан, возвращаемый *list* будет пустым списком.352353#### `NNTP.xover(start, end, *, file=None)`354355Отправляет команду `XOVER`. *start* и *end* – это номера статей, определяющие диапазон выбираемых статей. Возвращаемое значение такое же, как для [`over()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.over). Рекомендуется использовать [`over()`](https://python-all.ru/3.10/library/nntplib.html#nntplib.NNTP.over), так как она автоматически применит более новую команду `OVER`, если она доступна.356357## Вспомогательные функции358359Модуль также определяет следующую вспомогательную функцию:360361#### `nntplib.decode_header(header_str)`362363Декодирует значение заголовка, снимая экранирование любых экранированных символов, не входящих в ASCII. *header\_str* должен быть объектом [`str`](https://python-all.ru/3.10/library/stdtypes.html#str). Возвращается значение без экранирования. Рекомендуется использовать эту функцию для отображения некоторых заголовков в удобочитаемом виде:364365```python366>>> decode_header("Some subject")367'Some subject'368>>> decode_header("=?ISO-8859-15?Q?D=E9buter_en_Python?=")369'Débuter en Python'370>>> decode_header("Re: =?UTF-8?B?cHJvYmzDqG1lIGRlIG1hdHJpY2U=?=")371'Re: problème de matrice'372```373