Ctrl
+
D
一键收藏

NNTP协议客户端

nntplib

源代码: Lib/nntplib.py


此模块定义类 NNTP 它实现了网络新闻传输协议的客户端。它可以用来实现新闻阅读器或海报,或者自动化的新闻处理器。它与 RFC 3977 和老的一样 RFC 977RFC 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密码 是否提供,或是否有合适的证书 /.netrc 和可选标志 美国国际电报调用公司 是真的 AUTHINFO USERAUTHINFO PASS 命令用于识别用户并对服务器进行身份验证。如果可选标志 读数模式 是真的,那么 mode reader 在执行身份验证之前发送命令。如果连接到本地计算机上的NNTP服务器并打算调用特定于读卡器的命令,例如 group .如果你感到意外 NNTPPermanentError S,您可能需要设置 读数模式 . 这个 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 带着论据 selfhostport .

提出一个 auditing event nntplib.putline 带着论据 selfline .

在 3.2 版更改: 美国国际电报调用公司 现在是 False 默认情况下。

在 3.3 版更改: 支持 with 语句已添加。

在 3.9 版更改: 如果 超时 参数设置为零,它将引发 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 .

请注意,根据 RFC 4642 ,以支持如下所述的starttls。但是,有些服务器只支持前者。

提出一个 auditing event nntplib.connect 带着论据 selfhostport .

提出一个 auditing event nntplib.putline 带着论据 selfline .

3.2 新版功能.

在 3.4 版更改: 类现在支持主机名检查 ssl.SSLContext.check_hostname服务器名称指示 (见 ssl.HAS_SNI

在 3.9 版更改: 如果 超时 参数设置为零,它将引发 ValueError 以防止创建非阻塞套接字。

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对象

当连接时, NNTPNNTP_SSL 对象支持以下方法和属性。

属性

NNTP.nntp_version

表示服务器支持的NNTP协议版本的整数。实际上,这应该是 2 服务器广告 RFC 3977 依从性 1 对其他人来说。

3.2 新版功能.

NNTP.nntp_implementation

描述NNTP服务器的软件名称和版本的字符串,或 None 如果服务器未公布。

3.2 新版功能.

方法

这个 响应 在几乎所有方法的返回元组中,返回的第一项是服务器的响应:一个以三位代码开头的字符串。如果服务器的响应指示错误,则该方法将引发上述异常之一。

以下许多方法都采用可选的仅关键字参数 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密码None美国国际电报调用公司 是真的,凭据来自 ~/.netrc 如果可能,将使用。

除非故意延迟,否则登录通常在 NNTP 对象初始化和单独调用此函数是不必要的。要强制延迟身份验证,不能设置 user密码 创建对象时,必须设置 美国国际电报调用公司 错了。

3.2 新版功能.

NNTP.starttls(context=None)

发送一个 STARTTLS 命令。这将在NNTP连接上启用加密。这个 context 参数是可选的,应为 ssl.SSLContext 对象。请阅读 安全注意事项 最佳实践。

请注意,在传输身份验证信息后可能无法执行此操作,并且在 NNTP 对象初始化。见 NNTP.login() 有关禁止此行为的信息。

3.2 新版功能.

在 3.4 版更改: 该方法现在支持主机名检查 ssl.SSLContext.check_hostname服务器名称指示 (见 ssl.HAS_SNI

NNTP.newgroups(date, *, file=None)

发送一个 NEWGROUPS 命令。这个 date 参数应为 datetime.datedatetime.datetime 对象。退回一对 (response, groups) 在哪里? group 是表示自给定的 date .如果 file 但是,提供了 group 将为空。

>>>
>>> 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) 在哪里? 文章 是消息ID的列表。

NNTP服务器管理员经常禁用此命令。

NNTP.list(group_pattern=None, *, file=None)

发送一个 LISTLIST ACTIVE 命令。退回一对 (response, list) 在哪里? list 是表示此NNTP服务器上所有可用组的元组列表,可以选择匹配模式字符串 group_pattern . 每个元组都有这样的形式 (group, last, first, flag) 在哪里 group 是组名, last第一 是最后和第一个文章编号,以及 flag 通常采用以下值之一:

  • y :允许来自对等方的本地日志和文章。

  • m :该组已被审核,所有过账都必须经过批准。

  • n :不允许本地发布,只允许来自对等方的文章。

  • j :来自对等方的文章将被归档到垃圾邮件组中。

  • x :不忽略本地日志和来自对等方的文章。

  • =foo.bar :物品归档在 foo.bar 改为分组。

如果 flag 有另一个值,则新闻组的状态应视为未知。

此命令可以返回非常大的结果,特别是在 group_pattern 未指定。最好离线缓存结果,除非您确实需要刷新它们。

在 3.2 版更改: group_pattern 加入。

NNTP.descriptions(grouppattern)

发送一个 LIST NEWSGROUPS 命令,在哪里 组模式 是在中指定的Wildmat字符串 RFC 3977 (基本上与DOS或Unix Shell通配符字符串相同)。退回一对 (response, descriptions) 在哪里 description 是将组名映射到文本描述的字典。

>>>
>>> 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”是真正的wildmat字符串),则返回第一个匹配。如果没有匹配的组,则返回空字符串。

这将从服务器中删除响应代码。如果需要响应代码,请使用 descriptions() .

NNTP.group(name)

发送一个 GROUP 命令,在哪里 name 是组名。如果当前组存在,则选择该组作为当前组。返回元组 (response, count, first, last, name) 在哪里? 计数 是组中文章的(估计)数量, 第一 是组中的第一个商品编号, last 是组中的最后一个文章编号,并且 name 是组名。

NNTP.over(message_spec, *, file=None)

发送一个 OVER 命令,或 XOVER 旧服务器上的命令。 message_spec 可以是表示消息ID的字符串,也可以是 (first, last) 表示当前组中项目范围的数字元组,或 (first, None) 元组,指示从开始的一系列项目 第一 到当前组中的最后一篇文章,或 None 选择当前组中的当前文章。

退回一对 (response, overviews) . 概览 是一个列表 (article_number, overview) 元组,每一篇文章一个 message_spec . 各 概述 是一个项目数相同的字典,但此数字取决于服务器。这些项要么是消息头(键是小写的头名称),要么是元数据项(键是在元数据名称前面加上 ":" )NNTP规范保证提供以下项目:

  • 这个 subjectfromdatemessage-idreferences 报头

  • 这个 :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 是消息ID(包含在 '<''>' )或当前组中的文章编号。如果 message_spec 被省略或 None ,考虑当前组中的当前文章。返回三倍 (response, number, id) 在哪里? 是物品编号和 id 是消息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.next()

发送一个 NEXT 命令。作为回报 stat() .

NNTP.last()

发送一个 LAST 命令。作为回报 stat() .

NNTP.article(message_spec=None, *, file=None)

发送一个 ARTICLE 命令,在哪里 message_spec 含义与 stat() . 返回元组 (response, info) 在哪里? info 是一个 namedtuple 有三个属性 message_id线 (按顺序)。 是组中的文章编号(如果信息不可用,则为0), message_id 作为字符串的消息ID,以及 线 包含原始消息(包括头和正文)的行列表(不终止换行)。

>>>
>>> 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 命令。这个 线 退回(或写信给 file )只包含邮件头,而不包含正文。

NNTP.body(message_spec=None, *, file=None)

等同于 article() 但发送一个 BODY 命令。这个 线 退回(或写信给 file )只包含邮件正文,不包含邮件头。

NNTP.post(data)

使用 POST command. The data argument is either a 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() method automatically escapes lines beginning with . 并附加终止线。

如果方法成功,则返回服务器的响应。如果服务器拒绝发布,则 NNTPReplyError 提高了。

NNTP.ihave(message_id, data)

发送一个 IHAVE 命令。 message_id 是要发送到服务器的消息的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 参数是一个header关键字,例如 'subject' . 这个 str 参数的形式应为 'first-last' 在哪里? 第一last 是要搜索的第一个和最后一个文章编号。退回一对 (response, list) 在哪里 list 是对的列表 (id, text) 在哪里 id 是商品编号(作为字符串),并且 text 是该文章请求的标题的文本。如果 file 提供参数,然后 XHDR 命令存储在文件中。如果 file 是一个字符串,然后该方法将打开具有该名称的文件,写入该文件,然后关闭该文件。如果 file 是一个 file object ,然后它将开始调用 write() 存储命令输出的行。如果 file 提供,然后返回 list 是空列表。

NNTP.xover(start, end, *, file=None)

发送一个 XOVER 命令。 开始end 是界定要选择的文章范围的文章编号。返回值与for相同 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'
Ctrl
+
D
一键收藏