Module TikTokApi.tiktokuser

Expand source code
import requests


class TikTokUser:
    def __init__(self, user_cookie, debug=False, proxy=None):
        """A TikTok User Class. Represents a single user that is logged in.

        :param user_cookie: The cookies from a signed in session of TikTok.
         Sign into TikTok.com and run document.cookie in the javascript console
        and then copy the string and place it into this parameter.
        """
        self.cookies = user_cookie
        self.debug = debug
        self.proxy = proxy

    def get_insights(self, videoID, username=None, proxy=None) -> dict:
        """Get insights/analytics for a video.

        :param videoID: The TikTok ID to look up the insights for.
        """
        api_url = "https://api.tiktok.com/aweme/v1/data/insighs/?tz_offset=-25200&aid=1233&carrier_region=US"
        if username is not None:
            referrer = "https://www.tiktok.com/@" + username + "/video/" + videoID
        else:
            referrer = "https://www.tiktok.com/"
        insights = [
            "video_info",
            "video_page_percent",
            "video_region_percent",
            "video_total_duration",
            "video_per_duration",
        ]
        # Note: this list of parameters has to be in exactly this order with exactly this format
        # or else you will get "Invalid parameters"

        def build_insight(insight, videoID):
            return '{"insigh_type":"' + insight + '","aweme_id":"' + videoID + '"}'

        insight_string = ",".join([build_insight(i, videoID) for i in insights])
        insight_string = (
            insight_string
            + ',{"insigh_type": "user_info"}'
            + ',{"insigh_type":"video_uv","aweme_id":"'
            + videoID
            + '"}'
            + ',{"insigh_type":"vv_history","days":8}'
            + ',{"insigh_type":"follower_num_history","days":9}'
            + ',{"insigh_type":"follower_num"}'
            + ',{"insigh_type":"user_info"}'
        )
        r = requests.post(
            api_url,
            headers={
                "accept": "*/*",
                "accept-language": "en-US,en;q=0.9",
                "content-type": "application/x-www-form-urlencoded",
                "sec-fetch-dest": "empty",
                "sec-fetch-mode": "cors",
                "sec-fetch-site": "same-site",
                "referrer": referrer,
                "referrerPolicy": "no-referrer-when-downgrade",
                "method": "POST",
                "mode": "cors",
                "credentials": "include",
            },
            data="type_requests=[" + insight_string + "]",
            proxies=self.__format_proxy(proxy),
            cookies=self.__cookies_to_json(self.cookies),
        )
        try:
            return r.json()
        except Exception:
            if debug:
                print(f"Failed converting following to JSON\n{r.text}")
            raise Exception("Invalid Response (from TikTok)")

    #
    # PRIVATE METHODS
    #
    def __format_proxy(self, proxy) -> dict:
        """
        Formats the proxy object
        """
        if proxy is not None:
            return {"http": proxy, "https": proxy}
        else:
            return None

    def __cookies_to_json(self, cookie_string) -> dict:
        """
        Turns a cookie string into a dict for
        use in the requests module
        """
        if isinstance(cookie_string, dict):
            return cookie_string

        cookie_dict = {}
        for cookie in cookie_string.split("; "):
            cookie_dict[cookie.split("=")[0]] = cookie.split("=")[1]

        return cookie_dict

Classes

class TikTokUser (user_cookie, debug=False, proxy=None)

A TikTok User Class. Represents a single user that is logged in.

:param user_cookie: The cookies from a signed in session of TikTok. Sign into TikTok.com and run document.cookie in the javascript console and then copy the string and place it into this parameter.

Expand source code
class TikTokUser:
    def __init__(self, user_cookie, debug=False, proxy=None):
        """A TikTok User Class. Represents a single user that is logged in.

        :param user_cookie: The cookies from a signed in session of TikTok.
         Sign into TikTok.com and run document.cookie in the javascript console
        and then copy the string and place it into this parameter.
        """
        self.cookies = user_cookie
        self.debug = debug
        self.proxy = proxy

    def get_insights(self, videoID, username=None, proxy=None) -> dict:
        """Get insights/analytics for a video.

        :param videoID: The TikTok ID to look up the insights for.
        """
        api_url = "https://api.tiktok.com/aweme/v1/data/insighs/?tz_offset=-25200&aid=1233&carrier_region=US"
        if username is not None:
            referrer = "https://www.tiktok.com/@" + username + "/video/" + videoID
        else:
            referrer = "https://www.tiktok.com/"
        insights = [
            "video_info",
            "video_page_percent",
            "video_region_percent",
            "video_total_duration",
            "video_per_duration",
        ]
        # Note: this list of parameters has to be in exactly this order with exactly this format
        # or else you will get "Invalid parameters"

        def build_insight(insight, videoID):
            return '{"insigh_type":"' + insight + '","aweme_id":"' + videoID + '"}'

        insight_string = ",".join([build_insight(i, videoID) for i in insights])
        insight_string = (
            insight_string
            + ',{"insigh_type": "user_info"}'
            + ',{"insigh_type":"video_uv","aweme_id":"'
            + videoID
            + '"}'
            + ',{"insigh_type":"vv_history","days":8}'
            + ',{"insigh_type":"follower_num_history","days":9}'
            + ',{"insigh_type":"follower_num"}'
            + ',{"insigh_type":"user_info"}'
        )
        r = requests.post(
            api_url,
            headers={
                "accept": "*/*",
                "accept-language": "en-US,en;q=0.9",
                "content-type": "application/x-www-form-urlencoded",
                "sec-fetch-dest": "empty",
                "sec-fetch-mode": "cors",
                "sec-fetch-site": "same-site",
                "referrer": referrer,
                "referrerPolicy": "no-referrer-when-downgrade",
                "method": "POST",
                "mode": "cors",
                "credentials": "include",
            },
            data="type_requests=[" + insight_string + "]",
            proxies=self.__format_proxy(proxy),
            cookies=self.__cookies_to_json(self.cookies),
        )
        try:
            return r.json()
        except Exception:
            if debug:
                print(f"Failed converting following to JSON\n{r.text}")
            raise Exception("Invalid Response (from TikTok)")

    #
    # PRIVATE METHODS
    #
    def __format_proxy(self, proxy) -> dict:
        """
        Formats the proxy object
        """
        if proxy is not None:
            return {"http": proxy, "https": proxy}
        else:
            return None

    def __cookies_to_json(self, cookie_string) -> dict:
        """
        Turns a cookie string into a dict for
        use in the requests module
        """
        if isinstance(cookie_string, dict):
            return cookie_string

        cookie_dict = {}
        for cookie in cookie_string.split("; "):
            cookie_dict[cookie.split("=")[0]] = cookie.split("=")[1]

        return cookie_dict

Methods

def get_insights(self, videoID, username=None, proxy=None) ‑> dict

Get insights/analytics for a video.

:param videoID: The TikTok ID to look up the insights for.

Expand source code
def get_insights(self, videoID, username=None, proxy=None) -> dict:
    """Get insights/analytics for a video.

    :param videoID: The TikTok ID to look up the insights for.
    """
    api_url = "https://api.tiktok.com/aweme/v1/data/insighs/?tz_offset=-25200&aid=1233&carrier_region=US"
    if username is not None:
        referrer = "https://www.tiktok.com/@" + username + "/video/" + videoID
    else:
        referrer = "https://www.tiktok.com/"
    insights = [
        "video_info",
        "video_page_percent",
        "video_region_percent",
        "video_total_duration",
        "video_per_duration",
    ]
    # Note: this list of parameters has to be in exactly this order with exactly this format
    # or else you will get "Invalid parameters"

    def build_insight(insight, videoID):
        return '{"insigh_type":"' + insight + '","aweme_id":"' + videoID + '"}'

    insight_string = ",".join([build_insight(i, videoID) for i in insights])
    insight_string = (
        insight_string
        + ',{"insigh_type": "user_info"}'
        + ',{"insigh_type":"video_uv","aweme_id":"'
        + videoID
        + '"}'
        + ',{"insigh_type":"vv_history","days":8}'
        + ',{"insigh_type":"follower_num_history","days":9}'
        + ',{"insigh_type":"follower_num"}'
        + ',{"insigh_type":"user_info"}'
    )
    r = requests.post(
        api_url,
        headers={
            "accept": "*/*",
            "accept-language": "en-US,en;q=0.9",
            "content-type": "application/x-www-form-urlencoded",
            "sec-fetch-dest": "empty",
            "sec-fetch-mode": "cors",
            "sec-fetch-site": "same-site",
            "referrer": referrer,
            "referrerPolicy": "no-referrer-when-downgrade",
            "method": "POST",
            "mode": "cors",
            "credentials": "include",
        },
        data="type_requests=[" + insight_string + "]",
        proxies=self.__format_proxy(proxy),
        cookies=self.__cookies_to_json(self.cookies),
    )
    try:
        return r.json()
    except Exception:
        if debug:
            print(f"Failed converting following to JSON\n{r.text}")
        raise Exception("Invalid Response (from TikTok)")