nntplib
源代码: Lib/nntplib.py
此模块定义类 NNTP
它实现了网络新闻传输协议的客户端。它可以用来实现新闻阅读器或海报,或者自动化的新闻处理器。它与 RFC 3977 和老的一样 RFC 977 和 RFC 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 USER
和AUTHINFO 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
带着论据self
,host
,port
.提出一个 auditing event
nntplib.putline
带着论据self
,line
.在 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
带着论据self
,host
,port
.提出一个 auditing event
nntplib.putline
带着论据self
,line
.3.2 新版功能.
在 3.4 版更改: 类现在支持主机名检查
ssl.SSLContext.check_hostname
和 服务器名称指示 (见ssl.HAS_SNI
)在 3.9 版更改: 如果 超时 参数设置为零,它将引发
ValueError
以防止创建非阻塞套接字。
- exception nntplib.NNTPError
从标准异常派生
Exception
,这是由nntplib
模块。此类的实例具有以下属性:- response
服务器的响应(如果可用),作为
str
对象。
NNTP对象
当连接时, NNTP
和 NNTP_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.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.date
或datetime.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)
发送一个
LIST
或LIST 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规范保证提供以下项目:这个
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.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. Thepost()
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.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 是空列表。
效用函数
该模块还定义了以下实用程序功能:
- 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'