Merge pull request #4 from Zert/master

Add ability to query extended tweets
master
stockbsd 2021-04-19 11:45:42 +08:00 zatwierdzone przez GitHub
commit 8e389124ce
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 4AEE18F83AFDEB23
2 zmienionych plików z 15 dodań i 12 usunięć

Wyświetl plik

@ -1,4 +1,4 @@
from .downloader import Downloader from .downloader import Downloader
from .threaded_aio_dlder import AioDownloader from .threaded_aio_dlder import AioDownloader
version = "0.2.0" version = "0.2.1"

Wyświetl plik

@ -55,12 +55,12 @@ class Downloader:
raise RuntimeError("Bearer TokenNot Fetched") raise RuntimeError("Bearer TokenNot Fetched")
def download_media_of_tweet(self, tid, save_dest, size="large", include_video=False, def download_media_of_tweet(self, tid, save_dest, size="large", include_video=False,
include_photo=True): include_photo=True, is_extended=False, goto_quoted=False):
''' ''' ''' '''
save_dest = ensure_dir(save_dest) save_dest = ensure_dir(save_dest)
tweet = self.get_tweet(tid) tweet = self.get_tweet(tid, is_extended)
self.process_tweet(tweet, save_dest, size, include_video, include_photo) self.process_tweet(tweet, save_dest, size, include_video, include_photo, goto_quoted)
def download_media_of_user(self, user, save_dest, size="large", limit=3200, rts=False, def download_media_of_user(self, user, save_dest, size="large", limit=3200, rts=False,
include_video=False, include_photo=True, since_id=0): include_video=False, include_photo=True, since_id=0):
@ -165,35 +165,38 @@ class Downloader:
return self.api_fetch_tweets(apiurl, payload, start, count, rts, since_id) return self.api_fetch_tweets(apiurl, payload, start, count, rts, since_id)
def get_tweet(self, id): def get_tweet(self, tid, is_extended=False):
"""Download single tweet """Download single tweet
Args: Args:
id: Tweet ID. tid: Tweet ID.
is_extended: extended tweet mode
""" """
bearer_token = self.bearer_token bearer_token = self.bearer_token
url = "https://api.twitter.com/1.1/statuses/show.json" url = "https://api.twitter.com/1.1/statuses/show.json"
headers = {"Authorization": f"Bearer {bearer_token}"} headers = {"Authorization": f"Bearer {bearer_token}"}
payload = {"id": id, "include_entities": "true"} payload = {"id": tid, "include_entities": "true"}
if is_extended:
self.log.info("Extended mode")
payload["tweet_mode"] = "extended"
# get the request # get the request
r = requests.get(url, headers=headers, params=payload) r = requests.get(url, headers=headers, params=payload)
# check the response # check the response
if r.status_code == 200: if r.status_code == 200:
tweet = r.json() tweet = r.json()
self.log.info(f"Got tweet with id {id} of user @{tweet['user']['name']}") self.log.info(f"Got tweet with id {tid} of user @{tweet['user']['name']}")
return tweet return tweet
else: else:
self.log.error(f"{url} error, code was {r.status_code}") self.log.error(f"{url} error, code was {r.status_code}")
return None return None
def process_tweet(self, tweet, save_dest, size="large", include_video=False, include_photo=True): def process_tweet(self, tweet, save_dest, size="large", include_video=False, include_photo=True, goto_quoted=False):
if 'retweeted_status' in tweet: if 'retweeted_status' in tweet:
tweet = tweet['retweeted_status'] tweet = tweet['retweeted_status']
self.log.debug('this is a retweet, turn to orignal tweet') self.log.debug('this is a retweet, turn to orignal tweet')
elif ("quoted_status" in tweet): elif ("quoted_status" in tweet) and goto_quoted:
tweet = tweet['quoted_status'] tweet = tweet['quoted_status']
self.log.debug('this is a quoted tweet, turn to orignal tweet') self.log.debug('this is a quoted tweet, turn to orignal tweet')
@ -214,7 +217,7 @@ class Downloader:
extended = tweet.get("extended_entities") extended = tweet.get("extended_entities")
if not extended: if not extended:
return [] return []
rv = [] rv = []
if "media" in extended: if "media" in extended:
for x in extended["media"]: for x in extended["media"]: