nntplib
— Клиент протокола NNTP¶
Исходный код: Lib/nntplib.py
Этот модуль определяет класс NNTP
, который реализует клиентскую часть сетевого протокола передачи новостей. Его можно использовать для реализации программы чтения новостей, плаката или автоматизированной обработки новостей. Он совместим с RFC 3977, а также с более старыми версиями RFC 977 и RFC 2980.
Availability: это не Emscripten, это был не я.
Этот модуль не работает или недоступен на платформах WebAssembly wasm32-emscripten
и wasm32-wasi
. Дополнительную информацию смотрите в разделе Платформы веб-сборки.
Вот два небольших примера того, как это можно использовать. Чтобы вывести некоторую статистику о группе новостей и напечатать темы последних 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. Для сокетного соединения может быть указан необязательный тайм-аут. Если указаны необязательные пользователь и пароль или если в/.netrc
присутствуют подходящие учетные данные, а необязательный флаг usenetrc имеет значение true, для идентификации и аутентификации используются командыAUTHINFO USER
иAUTHINFO PASS
. пользователя к серверу. Если необязательный флаг readermode имеет значение true, то перед выполнением аутентификации отправляется командаmode reader
. Режим чтения иногда необходим, если вы подключаетесь к серверу NNTP на локальном компьютере и собираетесь вызывать команды, специфичные для чтения, такие как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') ... ('211 1755 1 1755 gmane.comp.python.committers', 1755, 1, 1755, 'gmane.comp.python.committers') >>>
Создает auditing event
nntplib.connect
с аргументамиself
,host
,port
.Создает auditing event
nntplib.putline
с аргументамиself
,line
.Изменено в версии 3.2: usenetrc теперь имеет значение
False
по умолчанию.Изменено в версии 3.3: Была добавлена поддержка инструкции
with
.Изменено в версии 3.9: Если для параметра timeout установлено значение, равное нулю, он выдаст значение
ValueError
, чтобы предотвратить создание неблокирующего сокета.
- 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, как описано ниже. Однако некоторые серверы поддерживают только первый вариант.
Создает auditing event
nntplib.connect
с аргументамиself
,host
,port
.Создает auditing event
nntplib.putline
с аргументамиself
,line
.Добавлено в версии 3.2.
Изменено в версии 3.4: Класс теперь поддерживает проверку имени хоста с помощью
ssl.SSLContext.check_hostname
и Указание имени сервера (см.ssl.HAS_SNI
).Изменено в версии 3.9: Если для параметра timeout установлено значение, равное нулю, он выдаст значение
ValueError
, чтобы предотвратить создание неблокирующего сокета.
- exception nntplib.NNTPError¶
Производный от стандартного exception
Exception
, этот класс является базовым для всех исключений, создаваемых модулемnntplib
. Экземпляры этого класса имеют следующий атрибут:
- 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, он должен быть либо file object, открытым для двоичной записи, либо именем файла на диске, в который будет выполнена запись. Затем метод запишет все данные, возвращенные сервером (за исключением строки ответа и конечной точки), в файл; любой список строк, кортежей или объектов, которые обычно возвращает метод, будет пустым.
Изменено в версии 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
, и отдельный вызов этой функции не требуется. Чтобы принудительно отложить аутентификацию, вы не должны указывать пользователя или пароль при создании объекта, а должны установить для usenetrc значение False.Добавлено в версии 3.2.
- NNTP.starttls(context=None)¶
Отправьте команду
STARTTLS
. Это позволит включить шифрование в NNTP-соединении. Аргумент context необязателен и должен бытьssl.SSLContext
object. Пожалуйста, ознакомьтесь с Соображения безопасности для получения рекомендаций.Обратите внимание, что это может быть сделано не после передачи аутентификационной информации, и аутентификация выполняется по умолчанию, если это возможно, во время инициализации объекта
NNTP
. Информацию о том, как подавить это поведение, смотрите в разделеNNTP.login()
.Добавлено в версии 3.2.
Изменено в версии 3.4: Метод теперь поддерживает проверку имени хоста с помощью
ssl.SSLContext.check_hostname
и Указание имени сервера (см.ssl.HAS_SNI
).
- NNTP.newgroups(date, *, file=None)¶
Отправьте команду
NEWGROUPS
. Аргументом date должен быть объектdatetime.date
илиdatetime.datetime
. Возвращает пару(response, groups)
, где groups - это список, представляющий группы, которые являются новыми с указанной даты. Если указан файл, то 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)
, где описания - это словарь, отображающий названия групп в текстовые описания.>>> 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)
набором цифр, указывающим диапазон статей, начиная с первой и заканчивая последней статьей в текущей группе. текущую группу илиNone
, чтобы выбрать текущую статью в текущей группе.Возвращает пару
(response, overviews)
. обзоры - это список(article_number, overview)
кортежей, по одному для каждой статьи, выбранной с помощью message_spec. Каждый обзор представляет собой словарь с одинаковым количеством элементов, но это количество зависит от сервера. Эти элементы являются либо заголовками сообщений (в этом случае ключом является имя заголовка, написанное строчными буквами), либо элементами метаданных (в этом случае ключом является имя метаданных, перед которым ставится":"
). Согласно спецификации 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
. Возвращаемые строки (или записываемые в файл) будут содержать только заголовки сообщений, а не текст.
- NNTP.body(message_spec=None, *, file=None)¶
Аналогично
article()
, но отправляет командуBODY
. Возвращаемые строки (или записываемые в файл) будут содержать только текст сообщения, а не заголовки.
- NNTP.post(data)¶
Опубликуйте статью, используя команду
POST
. Аргументом data является либо file object, открытый для двоичного чтения, либо любой итерируемый объект bytes (представляющий необработанные строки статьи, которую нужно опубликовать). Это должна быть хорошо оформленная новостная статья, включающая обязательные заголовки. Методpost()
автоматически экранирует строки, начинающиеся с.
, и добавляет завершающую строку.Если метод выполняется успешно, возвращается ответ сервера. Если сервер отказывает в публикации, генерируется сообщение
NNTPReplyError
.
- NNTP.ihave(message_id, data)¶
Отправьте команду
IHAVE
. message_id - это идентификатор сообщения, которое нужно отправить на сервер (заключенный в'<'
и'>'
). Параметр data и возвращаемое значение такие же, как и дляpost()
.
- NNTP.date()¶
Возвращает пару
(response, date)
. date - это объектdatetime
, содержащий текущую дату и время сервера.
- NNTP.slave()¶
Отправьте команду
SLAVE
. Верните ответ сервера.
- 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 является file object, то для него будет запущен вызовwrite()
, чтобы сохранить строки вывода команды. Если указан file, то возвращаемый list будет пустым списком.
- NNTP.xover(start, end, *, file=None)¶
Отправьте команду
XOVER
. начало и конец - это номера статей, ограничивающие диапазон статей для выбора. Возвращаемое значение такое же, как и дляover()
. Рекомендуется использоватьover()
вместо этого, так как при этом автоматически будет использоваться более новая командаOVER
, если она доступна.
Функции полезности¶
Модуль также определяет следующую полезную функцию:
- 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'