推特開發者之 tweepy庫輸出省略號解決方法

tweepy庫輸出twitter全文,而不是省略號

在使用tweepy庫的時候可能有的人會遇到一個問題,明明已經使用了擴展模式,爲什麼打印出來的full_text還是有省略號?像下面這樣:
在這裏插入圖片描述

說明:

標準API方法
任何tweepy.API返回Status對象的方法都接受一個新 tweet_mode參數。此參數的有效值爲compat和 extended,分別提供兼容模式和擴展模式。默認模式(如果未提供任何參數)是兼容模式。

  • 兼容模式
    默認情況下,使用兼容模式,根據需要text將tweepy.API方法返回的Status對象的屬性截斷爲140個字符。發生這種截斷時,truncatedStatus對象的屬性將爲True,並且僅完全包含在可用140個字符範圍內的實體將包括在該entities屬性中。還可以看出,textStatus對象的屬性被截斷了,因爲該屬性的後綴是省略號,空格和到Tweet的縮短的永久鏈接。

  • 擴展模式
    使用擴展模式時,方法text返回的Status對象的屬性將 tweepy.API替換爲一個full_text屬性,該屬性包含Tweet的整個未截斷文本。該truncated狀態對象的屬性會False和entities屬性將包含所有的實體。此外,Status對象將具有一個 display_text_range屬性,即兩個Unicode代碼點索引的數組,用於標識Tweet可顯示內容的包含性開始和排除性結束。


  • 默認情況下,流中的Status對象可能包含一個extended_tweet 屬性,該屬性表示Tweet的原始數據/有效負載中的等效字段。該屬性/字段僅適用於包含子字段字典的擴展推文。該full_text詞典的entities 子字段/關鍵字將包含Tweet的完整,未截斷的文本,並且子字段/關鍵字將包含完整的實體集。如果存在擴展實體,則extended_entities子字段/鍵將包含這些實體的完整集合。此外,display_text_range子字段/關鍵字將包含兩個Unicode代碼點索引的數組,用於標識Tweet可顯示內容的包含性開始和排除性結束。

  • 辦理轉推
    當將擴展模式與Retweet一起使用時,full_textStatus對象的屬性可能會用省略號字符截斷,而不是包含Retweet的全文。但是,由於 retweeted_status(作爲Retweet的Status對象的)full_text屬性本身就是一個Status對象,因此可以改用Retweeted Status對象的屬性。

這同樣適用於狀態對象/有效負載,它們是來自流的轉推。來自extended_tweet屬性/字段的詞典包含一個full_text子字段/鍵,該 子字段/鍵可能會被省略號省略。而是可以使用extended_tweet“轉發狀態”的retweeted_status屬性/字段(來自屬性/字段)。

例子
給定現有tweepy.API對象並id用於Tweet,以下內容可用於打印Tweet的全文,或者如果是Retweet,則打印Retweeted 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是Retweet,則status.full_text可能會被截斷。

此狀態事件處理程序用於StreamListener打印Tweet的全文,或者如果是Retweet,則打印Retweeted Tweet的全文:

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是Retweet,則它將沒有extended_tweet屬性,並且status.text可能被截斷。
--------------------------------------------------------------------------------------------------------------------------------
所以可以寫一個on_status函數,

def on_status(status):
    if hasattr(status, "retweeted_status"):  # Check if Retweet
        try:
            print(tweet.created_at, "->", status.retweeted_status.full_text)
        except AttributeError:
            print(tweet.created_at, "->", status.retweeted_status.text)
    else:
        try:
            print(tweet.created_at, "->", status.full_text)
        except AttributeError:
            print(tweet.created_at, "->", status.text)


public_tweets = api.user_timeline(id='LeoDiCaprio', count=100, tweet_mode='extended')
for tweet in public_tweets:
    print("--------------")
    print(tweet.created_at, "->", tweet.full_text)
    on_status(status=tweet)

效果對比:
在這裏插入圖片描述
在這裏插入圖片描述
就可以打印出全文了。
詳細內容可參考:Extended Tweets

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章