推文扩展

本节补充了推特的 Tweet updates documentationrepository.

引言

2016年5月24日,推特 宣布 更改回复和URL的处理方式并 发布 了关于支持推特API中这些更改的计划以及描述推特对象和API选项更新的初始技术文档。1 2017年9月26日,推特 开始测试 某些语言的280个字符。2 2017年11月7日,推特 宣布 正在扩大推文的字符限制。3

标准 API 方法

任何返回Status对象的 tweepy.API 方法都接收一个新的 tweet_mode 参数。 该参数的值是 compatextended。它们分别为兼容模式和扩展模式,默认模式(如果没有提供参数)是兼容模式。

兼容模式

默认情况下,使用兼容模式, tweepy.API 方法返回的 Status 对象的 text 属性被截断为 140 个字符。发生此截断时,Status对象的 truncated 属性将为 True ,并且只有完全包含在可用140个字符范围内的实体才会包含在 entities 属性中。 还可以看出,Status 对象的 text 属性被截断,因为它将以省略号字符、空格和缩短的指向 Tweet 的短链为后缀。

扩展模式

使用扩展模式时, tweepy.API 方法返回的 Status 对象的 text 属性被替换为 full_text 属性,这里包含 Tweet 的整个未截断文本。Status 对象的 truncated 属性将为 Falseentities 属性将包含所有实体。此外,Status 对象将有一个 display_text_range 属性,一个由两个 Unicode 代码点索引组成的数组。

流媒体

默认情况下,来自流的状态对象可能包含一个 extended_tweet 属性,该属性表示推文的原始数据。 此属性/字段仅存在于扩展推文。 该字典的 full_text 字段包含完整的、未截断的推文文本,而 entities 字段包含完整的实体集。 如果有扩展实体,extended_entities 字段将包含所有这些。 此外, display_text_range 字段将包含两个 Unicode 代码点索引的数组。

处理转推

当使用带有转推的扩展模式时,状态对象的 full_text 属性可能会用省略号截断,而不是包含转推的全文。 但是,由于(作为转推的 Status 对象的) retweeted_status 属性本身就是 Status 对象,因此可以使用转推状态 Status 的 full_text 属性。

这也同样适用于来自流的转推的 Status 。 来自 extended_tweet 属性的字典包含一个可以用省略号截断的 full_text 字段。 相反,可以使用转推 Status 的 extended_tweet 字段(来自 retweeted_status 字段)。

例子

给定一个现有的 API 对象和 Tweet 的 id,以下代码可用于出书 Tweet 的全文,如果它是 转推,则可以输出转推的全文:

status = api.get_status(id, tweet_mode="extended")
try:
    print(status.retweeted_status.full_text)
except AttributeError:  # Not a Retweet
    print(status.full_text)

如果 status 是转推, status.full_text 可能会被截断。

这个 Status 会被 Stream 输出推文全文。 如果它是转推,则会输出转推原文的全文:

def on_status(self, status):
    if hasattr(status, "retweeted_status"):  # Check if Retweet
        try:
            print(status.retweeted_status.extended_tweet["full_text"])
        except AttributeError:
            print(status.retweeted_status.text)
    else:
        try:
            print(status.extended_tweet["full_text"])
        except AttributeError:
            print(status.text)

如果 status 是转推,它将没有 extended_tweet 属性,并且 status.text 可能会被截断。

脚注

1

https://twittercommunity.com/t/upcoming-changes-to-simplify-replies-and-links-in-tweets/67497

2

https://twittercommunity.com/t/testing-280-characters-for-certain-languages/94126

3

https://twittercommunity.com/t/updating-the-character-limit-and-the-twitter-text-library/96425