> **Источник:** https://python-all.ru/2.7/library/nntplib.html
>
> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.

---

# 20.11. [`nntplib`](https://python-all.ru/2.7/library/nntplib.html#module-nntplib) – клиент протокола NNTP

**Исходный код:** [Lib/nntplib.py](https://python-all.ru/src/2.7/Lib/nntplib.py)

---

Этот модуль определяет класс [`NNTP`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP), который реализует клиентскую сторону протокола NNTP. Он может использоваться для создания программы чтения новостей или автоматических обработчиков новостей. Для получения дополнительной информации о NNTP (Network News Transfer Protocol, протоколе передачи новостей), см. Internet [**RFC 977**](https://python-all.ru/2.7/library/nntplib.html).

Вот два небольших примера использования. Чтобы вывести статистику по группе новостей и напечатать темы последних 10 статей:

```python
>>> s = NNTP('news.gmane.org')
>>> 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 1071 articles, range 1 to 1071
>>> resp, subs = s.xhdr('subject', first + '-' + last)
>>> for id, sub in subs[-10:]: print id, sub
...
1062 Re: Mercurial Status?
1063 Re: [python-committers]  (Windows) buildbots on 3.x
1064 Re: Mercurial Status?
1065 Re: Mercurial Status?
1066 Python 2.6.6 status
1067 Commit Privileges for Ask Solem
1068 Re: Commit Privileges for Ask Solem
1069 Re: Commit Privileges for Ask Solem
1070 Re: Commit Privileges for Ask Solem
1071 2.6.6 rc 2
>>> s.quit()
'205 Bye!'
```

Чтобы отправить статью из файла (предполагается, что статья имеет корректные заголовки и у вас есть право публиковать сообщения в данной группе новостей):

```python
>>> s = NNTP('news.gmane.org')
>>> f = open('articlefile')
>>> s.post(f)
'240 Article posted successfully.'
>>> s.quit()
'205 Bye!'
```

Сам модуль определяет следующие элементы:

#### `class nntplib.NNTP(host[, port [, user[, password [, readermode] [, usenetrc]]]])`

Возвращает новый экземпляр класса [`NNTP`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP), представляющий подключение к серверу NNTP, работающему на узле *host*, прослушивающему порт *port*. По умолчанию порт *port* – 119. Если указаны необязательные *user* и *password*, или если соответствующие учетные данные присутствуют в `/.netrc` и необязательный флаг *usenetrc* истинен (по умолчанию), то для идентификации и аутентификации пользователя на сервере используются команды `AUTHINFO USER` и `AUTHINFO PASS`. Если необязательный флаг *readermode* истинен, то команда `mode reader` отправляется перед выполнением аутентификации. Режим чтения иногда необходим если вы подключаетесь к серверу NNTP на локальной машине и собираетесь вызывать команды, специфичные для режима чтения, такие как `group`. Если вы получаете неожиданные [`NNTPPermanentError`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTPPermanentError), возможно, вам потребуется установить *readermode*. *readermode* по умолчанию равен `None`. *usenetrc* по умолчанию равен `True`.

Изменено в версии 2.4: добавлен аргумент *usenetrc*.

#### `exception nntplib.NNTPError`

Производный от стандартного исключения [`Exception`](https://python-all.ru/2.7/library/exceptions.html#exceptions.Exception), это базовый класс для всех исключений, вызываемых модулем [`nntplib`](https://python-all.ru/2.7/library/nntplib.html#module-nntplib).

#### `exception nntplib.NNTPReplyError`

Исключение, вызываемое при получении неожиданного ответа от сервера. Для обратной совместимости исключение `error_reply` эквивалентно этому классу.

#### `exception nntplib.NNTPTemporaryError`

Исключение, вызываемое при получении кода ошибки в диапазоне 400–499. Для обратной совместимости исключение `error_temp` эквивалентно этому классу.

#### `exception nntplib.NNTPPermanentError`

Исключение, вызываемое при получении кода ошибки в диапазоне 500–599. Для обратной совместимости исключение `error_perm` эквивалентно этому классу.

#### `exception nntplib.NNTPProtocolError`

Исключение, вызываемое при получении ответа от сервера, который не начинается с цифры в диапазоне 1–5. Для обратной совместимости исключение `error_proto` эквивалентно этому классу.

#### `exception nntplib.NNTPDataError`

Исключение, вызываемое при наличии ошибки в данных ответа. Для обратной совместимости исключение `error_data` эквивалентно этому классу.

## 20.11.1. Объекты NNTP

Экземпляры NNTP имеют следующие методы. *response*, возвращаемый как первый элемент кортежа результатов почти всех методов, – это ответ сервера: строка, начинающаяся с трёхзначного кода. Если ответ сервера указывает на ошибку, метод вызывает одно из перечисленных выше исключений.

#### `NNTP.getwelcome()`

Возвращает приветственное сообщение, отправленное сервером в ответ на начальное подключение. (Это сообщение иногда содержит отказ от ответственности или справочную информацию, которая может быть полезна пользователю.)

#### `NNTP.set_debuglevel(level)`

Устанавливает уровень отладки экземпляра. Он управляет объёмом выводимых отладочных сообщений. Значение по умолчанию, `0`, не выводит отладочные сообщения. Значение `1` выдаёт умеренное количество отладочной информации, обычно одну строку на запрос или ответ. Значение `2` или больше выводит максимальный объём отладочной информации, регистрируя каждую отправленную и полученную строку соединения (включая текст сообщения).

#### `NNTP.newgroups(date, time[, file])`

Отправляет команду `NEWGROUPS`. Аргумент *date* должен быть строкой вида `'yymmdd'`, указывающей дату, а *time* – строкой вида `'hhmmss'`, указывающей время. Возвращает пару `(response, groups)`, где *groups* – это список имен групп, которые появились с указанной даты и времени. Если указан параметр *file*, то вывод команды `NEWGROUPS` сохраняется в файл. Если *file* – строка, то метод откроет файловый объект с этим именем, запишет в него и закроет. Если *file* – файловый объект, то он начнет вызывать `write()` для сохранения строк вывода команды. Если указан *file*, то возвращаемый *list* будет пустым списком.

#### `NNTP.newnews(group, date, time[, file])`

Отправляет команду `NEWNEWS`. Здесь *group* – имя группы или `'*'`, а *date* и *time* имеют то же значение, что и для [`newgroups()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.newgroups). Возвращает пару `(response, articles)`, где *articles* – это список идентификаторов сообщений. Если указан параметр *file*, то вывод команды `NEWNEWS` сохраняется в файл. Если *file* – строка, то метод откроет файловый объект с этим именем, запишет в него и закроет. Если *file* – файловый объект, то он начнет вызывать `write()` для сохранения строк вывода команды. Если указан *file*, то возвращаемый *list* будет пустым списком.

#### `NNTP.list([file])`

Отправляет команду `LIST`. Возвращает пару `(response, list)`, где *list* – список кортежей. Каждый кортеж имеет вид `(group, last, first, flag)`, где *group* – имя группы, *last* и *first* – номера последней и первой статей (в виде строк), а *flag* равен `'y'`, если отправка разрешена, `'n'`, если нет, и `'m'`, если группа модерируется. (Обратите внимание на порядок: *last*, *first*.) Если указан параметр *file*, то вывод команды `LIST` сохраняется в файл. Если *file* – строка, то метод откроет файловый объект с этим именем, запишет в него и закроет. Если *file* – файловый объект, то он начнет вызывать `write()` для сохранения строк вывода команды. Если указан *file*, то возвращаемый *list* будет пустым списком.

#### `NNTP.descriptions(grouppattern)`

Отправляет команду `LIST NEWSGROUPS`, где *grouppattern* – строка wildmat, как указано в RFC2980 (по сути, это то же самое, что строки подстановки DOS или UNIX shell strings). Возвращает пару `(response, list)`, где *list* – список кортежей, содержащих `(name, title)`.

Новое в версии 2.4.

#### `NNTP.description(group)`

Получает описание для одной группы *group*. Если совпадает несколько групп (если ‘group’ – это строка шаблона wildmat), возвращается первое совпадение. Если ни одна группа не совпадает, возвращается пустая строка.

Этот метод скрывает код ответа от сервера. Если код ответа необходим, используйте [`descriptions()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.descriptions).

Новое в версии 2.4.

#### `NNTP.group(name)`

Отправляет команду `GROUP`, где *name* – имя группы. Возвращает кортеж `(response, count, first, last, name)`, где *count* – (приблизительное) количество статей в группе, *first* – номер первой статьи в группе, *last* – номер последней статьи в группе, и *name* – имя группы. Номера возвращаются в виде строк.

#### `NNTP.help([file])`

Отправляет команду `HELP`. Возвращает пару `(response, list)`, где *list* – список строк справки. Если указан параметр *file*, то вывод команды `HELP` сохраняется в файл. Если *file* – строка, то метод откроет файловый объект с этим именем, запишет в него и закроет. Если *file* – файловый объект, то он начнет вызывать `write()` для сохранения строк вывода команды. Если указан *file*, то возвращаемый *list* будет пустым списком.

#### `NNTP.stat(id)`

Отправляет команду `STAT`, где *id* – идентификатор сообщения (заключенный в `'<'` и `'>'`) или номер статьи (в виде строки). Возвращает тройку `(response, number, id)`, где *number* – номер статьи (в виде строки), а *id* – идентификатор сообщения (заключенный в `'<'` и `'>'`).

#### `NNTP.next()`

Отправляет команду `NEXT`. Возвращаемое значение такое же, как для [`stat()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.stat).

#### `NNTP.last()`

Отправляет команду `LAST`. Возвращаемое значение такое же, как для [`stat()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.stat).

#### `NNTP.head(id)`

Отправляет команду `HEAD`, где *id* имеет то же значение, что и для [`stat()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.stat). Возвращает кортеж `(response, number, id, list)`, где первые три элемента те же, что и для [`stat()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.stat), а *list* – список заголовков статьи (неинтерпретированный список строк, без завершающих символов новой строки).

#### `NNTP.body(id[, file])`

Отправляет команду `BODY`, где *id* имеет то же значение, что и для [`stat()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.stat). Если указан параметр *file*, то тело сохраняется в файл. Если *file* – строка, то метод откроет файловый объект с этим именем, запишет в него и закроет. Если *file* – файловый объект, то он начнет вызывать `write()` для сохранения строк тела. Возвращает то же, что и [`head()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.head). Если указан *file*, то возвращаемый *list* будет пустым списком.

#### `NNTP.article(id)`

Отправляет команду `ARTICLE`, где *id* имеет то же значение, что и для [`stat()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.stat). Возвращает то же, что и [`head()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.head).

#### `NNTP.slave()`

Отправляет команду `SLAVE`. Возвращает *ответ сервера*.

#### `NNTP.xhdr(header, string[, file])`

Отправляет команду `XHDR`. Эта команда не определена в RFC, но является распространенным расширением. Аргумент *header* – ключевое слово заголовка, например, `'subject'`. Аргумент *string* должен иметь вид `'first-last'`, где *first* и *last* – номера первой и последней статей для поиска. Возвращает пару `(response, list)`, где *list* – список пар `(id, text)`, где *id* – номер статьи (в виде строки), а *text* – текст запрошенного заголовка для этой статьи. Если указан параметр *file*, то вывод команды `XHDR` сохраняется в файл. Если *file* – строка, то метод откроет файловый объект с этим именем, запишет в него и закроет его. Если *file* – файловый объект, то он начнет вызывать `write()` для сохранения строк вывода команды. Если указан *file*, то возвращаемый *list* будет пустым списком.

#### `NNTP.post(file)`

Отправляет статью с помощью команды `POST`. Аргумент *file* – открытый файловый объект, который читается до конца (EOF) с помощью его метода [`readline()`](https://python-all.ru/2.7/library/stdtypes.html#file.readline). Это должна быть правильно оформленная новостная статья, включающая необходимые заголовки. Метод [`post()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.post) автоматически экранирует строки, начинающиеся с `.`.

#### `NNTP.ihave(id, file)`

Отправляет команду `IHAVE`. *id* – это идентификатор сообщения (заключённый в `'<'` и `'>'`). Если ответ не является ошибкой, обрабатывайте *file* точно так же, как для метода [`post()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.post).

#### `NNTP.date()`

Возвращает тройку `(response, date, time)`, содержащую текущие дату и время в формате, подходящем для методов [`newnews()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.newnews) и [`newgroups()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.newgroups). Это необязательное расширение NNTP, которое может не поддерживаться всеми серверами.

#### `NNTP.xgtitle(name[, file])`

Обрабатывает команду `XGTITLE`, возвращая пару `(response, list)`, где *list* – это список кортежей, содержащих `(name, title)`. Если передан параметр *file*, то вывод команды `XGTITLE` сохраняется в файл. Если *file* – строка, метод откроет файловый объект с таким именем, запишет в него, а затем закроет. Если *file* – файловый объект, то метод начнёт вызывать для него `write()`, сохраняя строки вывода команды. Если *file* передан, то возвращаемый *list* будет пустым списком. Это необязательное расширение NNTP, которое может не поддерживаться всеми серверами.

RFC2980 гласит: «Рекомендуется отказаться от этого расширения». Используйте [`descriptions()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.descriptions) или [`description()`](https://python-all.ru/2.7/library/nntplib.html#nntplib.NNTP.description) вместо него.

#### `NNTP.xover(start, end[, file])`

Возвращает пару `(resp, list)`. *list* – это список кортежей, по одному для каждой статьи в диапазоне, ограниченном номерами статей от *start* до *end*. Каждый кортеж имеет вид `(article number, subject, poster, date, id, references, size, lines)`. Если передан параметр *file*, то вывод команды `XOVER` сохраняется в файл. Если *file* – строка, метод откроет файловый объект с таким именем, запишет в него, а затем закроет. Если *file* – файловый объект, то метод начнёт вызывать для него `write()`, сохраняя строки вывода команды. Если передан *file*, то возвращаемый *list* будет пустым списком. Это необязательное расширение NNTP, которое может не поддерживаться всеми серверами.

#### `NNTP.xpath(id)`

Возвращает пару `(resp, path)`, где *path* – это путь к каталогу статьи с идентификатором сообщения *id*. Это необязательное расширение NNTP, которое может не поддерживаться всеми серверами.

#### `NNTP.quit()`

Отправляет команду `QUIT` и закрывает соединение. После вызова этого метода не следует вызывать другие методы объекта NNTP.
