Rozszerzone Tweety

Te informacje uzupełniają Dokumentację aktualizacji tweetów Twittera.

Wprowadzenie

On May 24, 2016, Twitter announced changes to the way that replies and URLs are handled and published plans around support for these changes in the Twitter API and initial technical documentation describing the updates to Tweet objects and API options.[1] On September 26, 2017, Twitter started testing 280 characters for certain languages,[2] and on November 7, 2017, announced that the character limit was being expanded for Tweets in languages where cramming was an issue.[3]

Standardowe metody API

Każda metoda tweepy API, która zwraca obiekt Status akceptuje nowy parametr tweet_mode. Poprawne wartości dla tego parametru to compat oraz extened, które dają odpowiednio tryb kompatybilności oraz tryb rozszerzony. Domyślny tryb (gdy nie ma podanego parametru) to tryb kompatybilności.

Tryb kompatybilności

Domyślnie, używając trybu kompatybilności, atrybut text obiektu Status zwrócony przez metody tweepy API jest obcięty do 140 znaków, tak jak jest to wymagane. Gdy zachodzi obcinanie, atrybut truncated obiektu Status jest True i tylko jednostki, które są całkowicie zawarte w dostępnych 140 znakach będa zawarte w atrybucie entities. Zostanie także zaobserwowane to, że atrybut ``text` obiektu Satus jest obcięty, ponieważ będzie on zakończony elipsą, spacją oraz skróconym permamentnym URL do tweeta.

Tryb rozszerzony

Używając trybu rozszerzonego, atrybut text obiektu Status zwrócony przez metody tweepy API jest zastąpiony przez atrybut full_text, który zawiera cały, nieobcięty tekst tweeta. Atrybut truncated obiektu Status jest False a atrybut entities zawiera wszystkie jednostki. Dodatkowo, obiekt Status będzie posiadał atrybut display_text_range, szyk dwóch indeksów wskaźników kodu Unicode, które identyfikują włączny start i wyłączny koniec wyświetlanej zawartości tweeta.

Przesyłanie strumieniowe

Domyśnie, obiekty Status ze strumieni mogą zawierać atrybut extended_tweet reprezentujący równowartość pól w nieprzetworzonych danych/właściwych danych dla tweeta. Ten atrybut/pole będzie istnieć tylko dla rozszerzonych tweeetów zawierających słownik podpól. Podpole/klucz full_text tego słownika będzie zawierać pełny, nieobcięty tekst tweeta a podpole/klucz entities będzie zawierać pełny zbiór jednostek. Jeżeli pojawią się rozszerzone jednostki to podpole/klucz extended_entities będzie zawierać pełen ich zbiór. Dodatkowo, podpole/klucz display_text_range będzie zawierać szyk dwóch indeksów wskaźników kodu Unicode, które identyfikują włączny start i wyłączny koniec wyświetlanej zawartości tweeta.

Obsługa retweetów

Używając rozszerzonego trybu dla retweetów, atrybut full_text obiektu Status może być skrócony poprzez elipsę zamiast zawierania całości tekstu retweeta. Jednakże, ponieważ atrybut retweeted_status (dla obiektu Status, który jest retweetem) jest sam w sobie obiektem Statusu, to atrybut full_text dla obiektu Status retweeta, może być użyty zamiennie.

Działa to podobnie dla obiektu/danych właściwych, które są retweetami ze strumieni. Słownik od atrybutu/pola extended_tweet zawiera podpole/klucz full_text, który może być obcięty elipsą. Zamiast tego może być użyty atrybut/pole extended_tweet Statusu retweeta (od atrybutu/pola retweeted_status).

Przykłady

Posiadając istniejący obiekt tweepy.API oraz id dla tweeta, można wyświetlić cały tekst tweeeta lub jeżeli jest to retweet, cały tekst retweetowanego tweeta:

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

Jeżeli status to retweet to status.full_text może być obcięty.

Ten odbiornik zdarzeń dla StreamListener wyświetla pełny tekst tweeta, lub jeżeli jest to retweet, pełny tekst retweetowanego tweeta:

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)

Jeżeli status to retweet to nie będzie on posiadał atrybutu extended_tweeet a status.text moze być obcięty.

Przypisy

[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