diff --git a/docs/configuration.rst b/docs/configuration.rst index 38d60eee..58e76ba6 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -6554,6 +6554,23 @@ Description Logout and retry as guest when access to another user's Tweets is blocked. +extractor.twitter.metadata-user +------------------------------- +Type + ``bool`` +Default + ``false`` +Description + Extract additional metadata for user accounts (``author``, ``user``) + + * ``based_in`` + * ``location_accurate`` + * ``name_changes`` + * ``source`` +Note + This requires 1 additional HTTP request per user. + + extractor.twitter.pinned ------------------------ Type diff --git a/docs/gallery-dl.conf b/docs/gallery-dl.conf index 3ff04e4f..4bb1184a 100644 --- a/docs/gallery-dl.conf +++ b/docs/gallery-dl.conf @@ -881,6 +881,7 @@ "limit" : 50, "locked" : "abort", "logout" : true, + "metadata-user": false, "pinned" : false, "quoted" : false, "ratelimit" : "wait", diff --git a/gallery_dl/extractor/twitter.py b/gallery_dl/extractor/twitter.py index ad393a3f..69fa44e9 100644 --- a/gallery_dl/extractor/twitter.py +++ b/gallery_dl/extractor/twitter.py @@ -572,6 +572,15 @@ class TwitterExtractor(Extractor): url = entities["url"]["urls"][0] udata["url"] = url.get("expanded_url") or url.get("url") + if self.config("metadata-user", False) and ( + about := self.api.user_about_account( + udata["name"]).get("about_profile")): + udata["source"] = about.get("source") + udata["based_in"] = about.get("account_based_in") + udata["location_accurate"] = about.get("location_accurate") + udata["name_changes"] = (d := about.get( + "username_changes")) and d.get("count") or 0 + return udata def _assign_user(self, user): @@ -1692,6 +1701,13 @@ class TwitterAPI(): } return self._call(endpoint, params)["data"]["user"]["result"] + @memcache(keyarg=1) + def user_about_account(self, screen_name): + endpoint = "/graphql/zs_jFPFT78rBpXv9Z3U2YQ/AboutAccountQuery" + params = {"variables": self._json_dumps({"screenName": screen_name})} + return (self._call(endpoint, params) + ["data"]["user_result_by_screen_name"]["result"]) + def _user_id_by_screen_name(self, screen_name): user = () try: