From a9f12576bb189f297743058d898d17e1cfb4e540 Mon Sep 17 00:00:00 2001 From: john Date: Mon, 31 Aug 2020 18:28:59 +0200 Subject: [PATCH 01/12] If not running in the main thread, it's necessary to create & set a new event loop. --- TikTokAPI/tiktok_browser.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/TikTokAPI/tiktok_browser.py b/TikTokAPI/tiktok_browser.py index 773d341..899830a 100644 --- a/TikTokAPI/tiktok_browser.py +++ b/TikTokAPI/tiktok_browser.py @@ -7,6 +7,14 @@ class TikTokBrowser: def __init__(self, user_agent): + + # If not running in the main thread, it's necessary to create & set a + # new event loop. + try: + asyncio.get_event_loop() + except RuntimeError: + asyncio.set_event_loop(asyncio.new_event_loop()) + self.userAgent = user_agent self.args = [ "--no-sandbox", From 22fb296b9626f08eb7912ac45b0323207ee53916 Mon Sep 17 00:00:00 2001 From: john Date: Mon, 31 Aug 2020 21:22:39 +0200 Subject: [PATCH 02/12] Trying to fix memory leak / orphaned chrome processes. --- TikTokAPI/tiktok_browser.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/TikTokAPI/tiktok_browser.py b/TikTokAPI/tiktok_browser.py index 899830a..8168e82 100644 --- a/TikTokAPI/tiktok_browser.py +++ b/TikTokAPI/tiktok_browser.py @@ -1,6 +1,6 @@ import os import asyncio -from pyppeteer import launch +from pyppeteer import launcher from .utils import python_list2_web_list @@ -62,7 +62,8 @@ def fetch_auth_params(self, url, language='en'): return asyncio.get_event_loop().run_until_complete(self.async_fetch_auth_params(url, language)) async def async_fetch_auth_params(self, url, language): - browser = await launch(self.options) + pplauncher = launcher.Launcher(self.options) + browser = await pplauncher.launch() page = await browser.newPage() await page.evaluateOnNewDocument("""() => { @@ -88,5 +89,7 @@ async def async_fetch_auth_params(self, url, language): return token; }''') + await page.close() await browser.close() + await pplauncher.killChrome() return signature From 4f245bb75ab3454428a34799ac9b3365199670e0 Mon Sep 17 00:00:00 2001 From: Ingo Marquardt Date: Wed, 2 Sep 2020 03:21:40 +0200 Subject: [PATCH 03/12] Moved get / new event loop to fetch_auth_params, to avoid error in case tiktokapi is initialised in parent (api) function. Work in progress. --- TikTokAPI/tiktok_browser.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/TikTokAPI/tiktok_browser.py b/TikTokAPI/tiktok_browser.py index 8168e82..f78fc38 100644 --- a/TikTokAPI/tiktok_browser.py +++ b/TikTokAPI/tiktok_browser.py @@ -8,13 +8,6 @@ class TikTokBrowser: def __init__(self, user_agent): - # If not running in the main thread, it's necessary to create & set a - # new event loop. - try: - asyncio.get_event_loop() - except RuntimeError: - asyncio.set_event_loop(asyncio.new_event_loop()) - self.userAgent = user_agent self.args = [ "--no-sandbox", @@ -59,6 +52,16 @@ def __init__(self, user_agent): self.tiktok_dummy_page = "file://" + os.path.join(parent_folder, "website", "tiktok.html") def fetch_auth_params(self, url, language='en'): + + # If not running in the main thread, it's necessary to create & set a + # new event loop. + try: + asyncio.get_event_loop() + print('get_event_loop') + except RuntimeError: + asyncio.set_event_loop(asyncio.new_event_loop()) + print('new_event_loop') + return asyncio.get_event_loop().run_until_complete(self.async_fetch_auth_params(url, language)) async def async_fetch_auth_params(self, url, language): From 2d14b964fe076f1a8766d3cb493bac2542ebab57 Mon Sep 17 00:00:00 2001 From: Ingo Marquardt Date: Wed, 2 Sep 2020 18:33:13 +0200 Subject: [PATCH 04/12] Removed debugging print statements. --- TikTokAPI/tiktok_browser.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/TikTokAPI/tiktok_browser.py b/TikTokAPI/tiktok_browser.py index f78fc38..c242326 100644 --- a/TikTokAPI/tiktok_browser.py +++ b/TikTokAPI/tiktok_browser.py @@ -57,10 +57,8 @@ def fetch_auth_params(self, url, language='en'): # new event loop. try: asyncio.get_event_loop() - print('get_event_loop') except RuntimeError: asyncio.set_event_loop(asyncio.new_event_loop()) - print('new_event_loop') return asyncio.get_event_loop().run_until_complete(self.async_fetch_auth_params(url, language)) From cbbc05b82cca781dcf5a0bec7c20f275b1dc9b99 Mon Sep 17 00:00:00 2001 From: avilash Date: Sun, 3 Jan 2021 01:20:42 +0530 Subject: [PATCH 05/12] Fix routes --- TikTokAPI/tiktokapi.py | 24 +++++++++++++++--------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/TikTokAPI/tiktokapi.py b/TikTokAPI/tiktokapi.py index 7a0611b..520dcbb 100644 --- a/TikTokAPI/tiktokapi.py +++ b/TikTokAPI/tiktokapi.py @@ -1,4 +1,5 @@ import os +import string import random import urllib.parse from .utils import random_key, build_get_url, get_req_json, get_req_content, get_req_text @@ -12,7 +13,9 @@ def __init__(self, language='en', browser_lang="en-US", timezone="Asia/Kolkata", self.user_agent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0" self.headers = { - "User-Agent": self.user_agent, + 'Host': 't.tiktok.com', + 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0', + # 'Cookie': 'tt_webid_v2=6913043173028431361; tt_webid=6913043173028431361; tt_csrf_token=taRJpJNwpA9NmrpdiwSwaysu' } self.language = language self.browser_lang = browser_lang @@ -20,7 +23,7 @@ def __init__(self, language='en', browser_lang="en-US", timezone="Asia/Kolkata", self.region = region if cookie is None: - self.verifyFp = random_key(16) + self.verifyFp = "verify_kjfaff24_sOZVAInw_G0Sm_4BtI_BStb_SB6moxzLxFrr" else: self.verifyFp = cookie self.default_params = { @@ -60,7 +63,7 @@ def __init__(self, language='en', browser_lang="en-US", timezone="Asia/Kolkata", def send_get_request(self, url, params, extra_headers=None): url = build_get_url(url, params) - did = str(random.randint(10000, 999999999)) + did = ''.join(random.choice(string.digits) for num in range(19)) url = build_get_url(url, {self.did_key: did}, append=True) signature = self.tiktok_browser.fetch_auth_params(url, language=self.language) url = build_get_url(url, {self.signature_key: signature}, append=True) @@ -95,9 +98,10 @@ def getTrending(self, count=30): return self.send_get_request(url, params) def getUserByName(self, user_name): - url = self.base_url + "/user/detail/" + url = "https://t.tiktok.com/node/share/user/@" + user_name params = { - "uniqueId": user_name + "uniqueId": user_name, + "validUniqueId": user_name, } for key, val in self.default_params.items(): params[key] = val @@ -164,7 +168,7 @@ def getVideosByHashTag(self, hashTag, count=30): hashTag = hashTag.replace("#", "") hashTag_obj = self.getHashTag(hashTag) hashTag_id = hashTag_obj["challengeInfo"]["challenge"]["id"] - url = "https://m.tiktok.com/share/item/list" + url = self.base_url + "/challenge/item_list/" req_default_params = { "secUid": "", "type": "3", @@ -174,8 +178,9 @@ def getVideosByHashTag(self, hashTag, count=30): "recType": "" } params = { - "id": str(hashTag_id), + "challengeID": str(hashTag_id), "count": str(count), + "cursor": "0", } for key, val in req_default_params.items(): params[key] = val @@ -194,7 +199,7 @@ def getMusic(self, music_id): return self.send_get_request(url, params) def getVideosByMusic(self, music_id, count=30): - url = "https://m.tiktok.com/share/item/list" + url = self.base_url + "/music/item_list/" req_default_params = { "secUid": "", "type": "4", @@ -204,8 +209,9 @@ def getVideosByMusic(self, music_id, count=30): "recType": "" } params = { - "id": str(music_id), + "musicID": str(music_id), "count": str(count), + "cursor": "0", } for key, val in req_default_params.items(): params[key] = val From d9323a243840bb31510194fa75131a7bce5e2f5a Mon Sep 17 00:00:00 2001 From: avilash Date: Sun, 3 Jan 2021 03:24:17 +0530 Subject: [PATCH 06/12] Video download fix --- TikTokAPI/tiktokapi.py | 30 +++++++++++++++++------------- TikTokAPI/utils.py | 3 +++ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/TikTokAPI/tiktokapi.py b/TikTokAPI/tiktokapi.py index 520dcbb..3454191 100644 --- a/TikTokAPI/tiktokapi.py +++ b/TikTokAPI/tiktokapi.py @@ -6,26 +6,30 @@ from .tiktok_browser import TikTokBrowser +class VideoException(Exception): + pass + class TikTokAPI(object): - def __init__(self, language='en', browser_lang="en-US", timezone="Asia/Kolkata", region='IN', cookie=None): + def __init__(self, cookie={}, language='en', browser_lang="en-US", timezone="Asia/Kolkata", region='IN'): self.base_url = "https://t.tiktok.com/api" self.user_agent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0" + self.verifyFp = cookie.get("s_v_web_id", "verify_kjf974fd_y7bupmR0_3uRm_43kF_Awde_8K95qt0GcpBk") + self.tt_webid = cookie.get("tt_webid", "6913027209393473025") + + self.headers = { 'Host': 't.tiktok.com', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0', - # 'Cookie': 'tt_webid_v2=6913043173028431361; tt_webid=6913043173028431361; tt_csrf_token=taRJpJNwpA9NmrpdiwSwaysu' + 'Referer': 'https://www.tiktok.com/', + 'Cookie': 'tt_webid_v2={}; tt_webid={}'.format(self.tt_webid, self.tt_webid) } self.language = language self.browser_lang = browser_lang self.timezone = timezone self.region = region - if cookie is None: - self.verifyFp = "verify_kjfaff24_sOZVAInw_G0Sm_4BtI_BStb_SB6moxzLxFrr" - else: - self.verifyFp = cookie self.default_params = { "aid": "1988", "app_name": "tiktok_web", @@ -231,22 +235,22 @@ def getVideoById(self, video_id): def downloadVideoById(self, video_id, save_path): video_info = self.getVideoById(video_id) - video_url = video_info["itemInfo"]["itemStruct"]["video"]["downloadAddr"] - headers = {"User-Agent": "okhttp"} - video_data = get_req_content(video_url, params=None, headers=headers) + video_url = video_info["itemInfo"]["itemStruct"]["video"]["playAddr"] + video_data = get_req_content(video_url, params=None, headers=self.headers) with open(save_path, 'wb') as f: f.write(video_data) def downloadVideoByIdNoWatermark(self, video_id, save_path): video_info = self.getVideoById(video_id) video_url = video_info["itemInfo"]["itemStruct"]["video"]["downloadAddr"] - headers = {"User-Agent": "okhttp"} - video_data = get_req_text(video_url, params=None, headers=headers) + video_data = get_req_text(video_url, params=None, headers=self.headers) pos = video_data.find("vid:") + if pos == -1: + raise VideoException("Video without watermark not available in new videos") video_url_no_wm = "https://api2-16-h2.musical.ly/aweme/v1/play/?video_id={" \ "}&vr_type=0&is_play_url=1&source=PackSourceEnum_PUBLISH&media_type=4" \ .format(video_data[pos+4:pos+36]) - headers = {"User-Agent": "okhttp"} - video_data_no_wm = get_req_content(video_url_no_wm, params=None, headers=headers) + + video_data_no_wm = get_req_content(video_url_no_wm, params=None, headers=self.headers) with open(save_path, 'wb') as f: f.write(video_data_no_wm) diff --git a/TikTokAPI/utils.py b/TikTokAPI/utils.py index 5587769..4470fa7 100644 --- a/TikTokAPI/utils.py +++ b/TikTokAPI/utils.py @@ -24,16 +24,19 @@ def build_get_url(base_url, params, append=False): def get_req_json(url, params=None, headers=None): + headers["Host"] = url.split("/")[2] r = requests.get(url, params=params, headers=headers) return json.loads(r.text) def get_req_content(url, params=None, headers=None): + headers["Host"] = url.split("/")[2] r = requests.get(url, params=params, headers=headers) return r.content def get_req_text(url, params=None, headers=None): + headers["Host"] = url.split("/")[2] r = requests.get(url, params=params, headers=headers) return r.text From 8d6d8059f4e14eaed96e62220bd58b2da3ca5ae5 Mon Sep 17 00:00:00 2001 From: avilash Date: Sun, 3 Jan 2021 03:37:26 +0530 Subject: [PATCH 07/12] Pasing cookie params in test --- TikTokAPI/tiktokapi.py | 10 ++++++---- tests/cookie.json | 4 ++++ tests/test_hashtag.py | 5 +++-- tests/test_music.py | 5 +++-- tests/test_trending.py | 3 ++- tests/test_user.py | 7 ++++--- tests/test_video.py | 7 ++++--- tests/utils.py | 9 +++++++++ 8 files changed, 35 insertions(+), 15 deletions(-) create mode 100644 tests/cookie.json create mode 100644 tests/utils.py diff --git a/TikTokAPI/tiktokapi.py b/TikTokAPI/tiktokapi.py index 3454191..580728a 100644 --- a/TikTokAPI/tiktokapi.py +++ b/TikTokAPI/tiktokapi.py @@ -9,16 +9,18 @@ class VideoException(Exception): pass + class TikTokAPI(object): - def __init__(self, cookie={}, language='en', browser_lang="en-US", timezone="Asia/Kolkata", region='IN'): + def __init__(self, cookie=None, language='en', browser_lang="en-US", timezone="Asia/Kolkata", region='IN'): self.base_url = "https://t.tiktok.com/api" self.user_agent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0" + if cookie is None: + cookie = {} self.verifyFp = cookie.get("s_v_web_id", "verify_kjf974fd_y7bupmR0_3uRm_43kF_Awde_8K95qt0GcpBk") self.tt_webid = cookie.get("tt_webid", "6913027209393473025") - self.headers = { 'Host': 't.tiktok.com', 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0', @@ -134,7 +136,7 @@ def getVideosByUserName(self, user_name, count=30): for key, val in self.default_params.items(): params[key] = val return self.send_get_request(url, params) - + def getLikesByUserName(self, user_name, count=30): user_data = self.getUserByName(user_name) user_obj = user_data["userInfo"]["user"] @@ -249,7 +251,7 @@ def downloadVideoByIdNoWatermark(self, video_id, save_path): raise VideoException("Video without watermark not available in new videos") video_url_no_wm = "https://api2-16-h2.musical.ly/aweme/v1/play/?video_id={" \ "}&vr_type=0&is_play_url=1&source=PackSourceEnum_PUBLISH&media_type=4" \ - .format(video_data[pos+4:pos+36]) + .format(video_data[pos + 4:pos + 36]) video_data_no_wm = get_req_content(video_url_no_wm, params=None, headers=self.headers) with open(save_path, 'wb') as f: diff --git a/tests/cookie.json b/tests/cookie.json new file mode 100644 index 0000000..46eac0d --- /dev/null +++ b/tests/cookie.json @@ -0,0 +1,4 @@ +{ + "s_v_web_id": "verify_kjf974fd_y7bupmR0_3uRm_43kF_Awde_8K95qt0GcpBk", + "tt_webid": "6913027209393473025" +} \ No newline at end of file diff --git a/tests/test_hashtag.py b/tests/test_hashtag.py index ba87dbb..c2a6439 100644 --- a/tests/test_hashtag.py +++ b/tests/test_hashtag.py @@ -1,14 +1,15 @@ import argparse from TikTokAPI import TikTokAPI +from utils import read_json_from_file def getHashTag(hashTag): - api = TikTokAPI() + api = TikTokAPI(read_json_from_file("cookie.json")) return api.getHashTag(hashTag) def getVideosByHashTag(hashTag): - api = TikTokAPI() + api = TikTokAPI(read_json_from_file("cookie.json")) return api.getVideosByHashTag(hashTag, count=10) diff --git a/tests/test_music.py b/tests/test_music.py index bce7cd5..2f942f6 100644 --- a/tests/test_music.py +++ b/tests/test_music.py @@ -1,14 +1,15 @@ import argparse from TikTokAPI import TikTokAPI +from utils import read_json_from_file def getMusic(music_id): - api = TikTokAPI() + api = TikTokAPI(read_json_from_file("cookie.json")) return api.getMusic(music_id) def getVideosByMusic(music_id): - api = TikTokAPI() + api = TikTokAPI(read_json_from_file("cookie.json")) return api.getVideosByMusic(music_id, count=10) diff --git a/tests/test_trending.py b/tests/test_trending.py index 652c709..3f43e38 100644 --- a/tests/test_trending.py +++ b/tests/test_trending.py @@ -1,6 +1,7 @@ from TikTokAPI import TikTokAPI +from utils import read_json_from_file -api = TikTokAPI() +api = TikTokAPI(read_json_from_file("cookie.json")) retval = api.getTrending(count=5) print("Trending Videos") print(retval) diff --git a/tests/test_user.py b/tests/test_user.py index 1f1d942..a0f84d6 100644 --- a/tests/test_user.py +++ b/tests/test_user.py @@ -1,19 +1,20 @@ import argparse from TikTokAPI import TikTokAPI +from utils import read_json_from_file def getUser(user_name): - api = TikTokAPI() + api = TikTokAPI(read_json_from_file("cookie.json")) return api.getUserByName(user_name) def getVideosByUserName(user_name): - api = TikTokAPI() + api = TikTokAPI(read_json_from_file("cookie.json")) return api.getVideosByUserName(user_name, count=1) def getLikesByUserName(user_name): - api = TikTokAPI() + api = TikTokAPI(read_json_from_file("cookie.json")) return api.getLikesByUserName(user_name, count=1) diff --git a/tests/test_video.py b/tests/test_video.py index ae0efc8..f000bc0 100644 --- a/tests/test_video.py +++ b/tests/test_video.py @@ -1,19 +1,20 @@ import argparse from TikTokAPI import TikTokAPI +from utils import read_json_from_file def getVideoById(video_id): - api = TikTokAPI() + api = TikTokAPI(read_json_from_file("cookie.json")) return api.getVideoById(video_id) def downloadVideoById(video_id): - api = TikTokAPI() + api = TikTokAPI(read_json_from_file("cookie.json")) api.downloadVideoById(video_id, video_id+".mp4") def downloadVideoByIdNoWatermark(video_id): - api = TikTokAPI() + api = TikTokAPI(read_json_from_file("cookie.json")) api.downloadVideoByIdNoWatermark(video_id, video_id+"_no_wm.mp4") diff --git a/tests/utils.py b/tests/utils.py new file mode 100644 index 0000000..8903eb9 --- /dev/null +++ b/tests/utils.py @@ -0,0 +1,9 @@ +import json + + +def read_json_from_file(filepath): + with open(filepath, 'r', encoding='utf-8') as json_file: + data = json.load(json_file) + if type(data) is str: + return json.loads(data) + return data From 86ab7caed8bb692d7f47d80fd108d205a7b03092 Mon Sep 17 00:00:00 2001 From: avilash Date: Sun, 3 Jan 2021 03:44:56 +0530 Subject: [PATCH 08/12] Version upgrade and Readme upgrade --- README.md | 17 +++++++++++++---- setup.py | 2 +- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index a0b62ea..488ad91 100644 --- a/README.md +++ b/README.md @@ -48,24 +48,33 @@ Import ``` from TikTokAPI import TikTokAPI ``` +Get your keys from Cookie. You can get them from the Applications tab in Chrome developer console. +By default it used hardcoded values which may not work after some time. +The keys to extract are `s_v_web_id` and `tt_webid` +``` +cookie = { + "s_v_web_id": "", + "tt_webid": "" +} +``` Get the most trending Videos on TikTok ``` -api = TikTokAPI() +api = TikTokAPI(cookie=cookie) retval = api.getTrending(count=5) ``` Get a user by name ``` -api = TikTokAPI() +api = TikTokAPI(cookie=cookie) user_obj = api.getUserByName("fcbarcelona") ``` Get videos of a user ``` -api = TikTokAPI() +api = TikTokAPI(cookie=cookie) user_videos = api.getVideosByUserName("fcbarcelona") ``` Get likes of a user ``` -api = TikTokAPI() +api = TikTokAPI(cookie=cookie) user_videos = api.getLikesByUserName("fcbarcelona") ``` diff --git a/setup.py b/setup.py index 0b9877b..e9dcfc2 100644 --- a/setup.py +++ b/setup.py @@ -6,7 +6,7 @@ setuptools.setup( name="PyTikTokAPI", packages=setuptools.find_packages(), - version="0.0.4", + version="0.0.5", license='MIT', author="Avilash Kumar", author_email="avilashkumar4@gmail.com", From 9b3c5d1bc1433f58926d6b39ff86f645969285a9 Mon Sep 17 00:00:00 2001 From: john Date: Mon, 31 Aug 2020 18:28:59 +0200 Subject: [PATCH 09/12] If not running in the main thread, it's necessary to create & set a new event loop. --- TikTokAPI/tiktok_browser.py | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/TikTokAPI/tiktok_browser.py b/TikTokAPI/tiktok_browser.py index 773d341..899830a 100644 --- a/TikTokAPI/tiktok_browser.py +++ b/TikTokAPI/tiktok_browser.py @@ -7,6 +7,14 @@ class TikTokBrowser: def __init__(self, user_agent): + + # If not running in the main thread, it's necessary to create & set a + # new event loop. + try: + asyncio.get_event_loop() + except RuntimeError: + asyncio.set_event_loop(asyncio.new_event_loop()) + self.userAgent = user_agent self.args = [ "--no-sandbox", From 93db86f4ae42eb5356f2b4368eeb38e276b7ec18 Mon Sep 17 00:00:00 2001 From: john Date: Mon, 31 Aug 2020 21:22:39 +0200 Subject: [PATCH 10/12] Trying to fix memory leak / orphaned chrome processes. --- TikTokAPI/tiktok_browser.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/TikTokAPI/tiktok_browser.py b/TikTokAPI/tiktok_browser.py index 899830a..8168e82 100644 --- a/TikTokAPI/tiktok_browser.py +++ b/TikTokAPI/tiktok_browser.py @@ -1,6 +1,6 @@ import os import asyncio -from pyppeteer import launch +from pyppeteer import launcher from .utils import python_list2_web_list @@ -62,7 +62,8 @@ def fetch_auth_params(self, url, language='en'): return asyncio.get_event_loop().run_until_complete(self.async_fetch_auth_params(url, language)) async def async_fetch_auth_params(self, url, language): - browser = await launch(self.options) + pplauncher = launcher.Launcher(self.options) + browser = await pplauncher.launch() page = await browser.newPage() await page.evaluateOnNewDocument("""() => { @@ -88,5 +89,7 @@ async def async_fetch_auth_params(self, url, language): return token; }''') + await page.close() await browser.close() + await pplauncher.killChrome() return signature From 556402b8f06d72e80c40cbe60bbf62dd2f494a44 Mon Sep 17 00:00:00 2001 From: Ingo Marquardt Date: Wed, 2 Sep 2020 03:21:40 +0200 Subject: [PATCH 11/12] Moved get / new event loop to fetch_auth_params, to avoid error in case tiktokapi is initialised in parent (api) function. Work in progress. --- TikTokAPI/tiktok_browser.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/TikTokAPI/tiktok_browser.py b/TikTokAPI/tiktok_browser.py index 8168e82..f78fc38 100644 --- a/TikTokAPI/tiktok_browser.py +++ b/TikTokAPI/tiktok_browser.py @@ -8,13 +8,6 @@ class TikTokBrowser: def __init__(self, user_agent): - # If not running in the main thread, it's necessary to create & set a - # new event loop. - try: - asyncio.get_event_loop() - except RuntimeError: - asyncio.set_event_loop(asyncio.new_event_loop()) - self.userAgent = user_agent self.args = [ "--no-sandbox", @@ -59,6 +52,16 @@ def __init__(self, user_agent): self.tiktok_dummy_page = "file://" + os.path.join(parent_folder, "website", "tiktok.html") def fetch_auth_params(self, url, language='en'): + + # If not running in the main thread, it's necessary to create & set a + # new event loop. + try: + asyncio.get_event_loop() + print('get_event_loop') + except RuntimeError: + asyncio.set_event_loop(asyncio.new_event_loop()) + print('new_event_loop') + return asyncio.get_event_loop().run_until_complete(self.async_fetch_auth_params(url, language)) async def async_fetch_auth_params(self, url, language): From 6f92de7279dff43a37fc5ab4131699a2a9d96754 Mon Sep 17 00:00:00 2001 From: Ingo Marquardt Date: Wed, 2 Sep 2020 18:33:13 +0200 Subject: [PATCH 12/12] Removed debugging print statements. --- TikTokAPI/tiktok_browser.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/TikTokAPI/tiktok_browser.py b/TikTokAPI/tiktok_browser.py index f78fc38..c242326 100644 --- a/TikTokAPI/tiktok_browser.py +++ b/TikTokAPI/tiktok_browser.py @@ -57,10 +57,8 @@ def fetch_auth_params(self, url, language='en'): # new event loop. try: asyncio.get_event_loop() - print('get_event_loop') except RuntimeError: asyncio.set_event_loop(asyncio.new_event_loop()) - print('new_event_loop') return asyncio.get_event_loop().run_until_complete(self.async_fetch_auth_params(url, language))