|
6 | 6 | from .tiktok_browser import TikTokBrowser
|
7 | 7 |
|
8 | 8 |
|
| 9 | +class VideoException(Exception): |
| 10 | + pass |
| 11 | + |
9 | 12 | class TikTokAPI(object):
|
10 | 13 |
|
11 |
| - def __init__(self, language='en', browser_lang="en-US", timezone="Asia/Kolkata", region='IN', cookie=None): |
| 14 | + def __init__(self, cookie={}, language='en', browser_lang="en-US", timezone="Asia/Kolkata", region='IN'): |
12 | 15 | self.base_url = "https://t.tiktok.com/api"
|
13 | 16 | self.user_agent = "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0"
|
14 | 17 |
|
| 18 | + self.verifyFp = cookie.get("s_v_web_id", "verify_kjf974fd_y7bupmR0_3uRm_43kF_Awde_8K95qt0GcpBk") |
| 19 | + self.tt_webid = cookie.get("tt_webid", "6913027209393473025") |
| 20 | + |
| 21 | + |
15 | 22 | self.headers = {
|
16 | 23 | 'Host': 't.tiktok.com',
|
17 | 24 | 'User-Agent': 'Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:79.0) Gecko/20100101 Firefox/79.0',
|
18 |
| - # 'Cookie': 'tt_webid_v2=6913043173028431361; tt_webid=6913043173028431361; tt_csrf_token=taRJpJNwpA9NmrpdiwSwaysu' |
| 25 | + 'Referer': 'https://www.tiktok.com/', |
| 26 | + 'Cookie': 'tt_webid_v2={}; tt_webid={}'.format(self.tt_webid, self.tt_webid) |
19 | 27 | }
|
20 | 28 | self.language = language
|
21 | 29 | self.browser_lang = browser_lang
|
22 | 30 | self.timezone = timezone
|
23 | 31 | self.region = region
|
24 | 32 |
|
25 |
| - if cookie is None: |
26 |
| - self.verifyFp = "verify_kjfaff24_sOZVAInw_G0Sm_4BtI_BStb_SB6moxzLxFrr" |
27 |
| - else: |
28 |
| - self.verifyFp = cookie |
29 | 33 | self.default_params = {
|
30 | 34 | "aid": "1988",
|
31 | 35 | "app_name": "tiktok_web",
|
@@ -231,22 +235,22 @@ def getVideoById(self, video_id):
|
231 | 235 |
|
232 | 236 | def downloadVideoById(self, video_id, save_path):
|
233 | 237 | video_info = self.getVideoById(video_id)
|
234 |
| - video_url = video_info["itemInfo"]["itemStruct"]["video"]["downloadAddr"] |
235 |
| - headers = {"User-Agent": "okhttp"} |
236 |
| - video_data = get_req_content(video_url, params=None, headers=headers) |
| 238 | + video_url = video_info["itemInfo"]["itemStruct"]["video"]["playAddr"] |
| 239 | + video_data = get_req_content(video_url, params=None, headers=self.headers) |
237 | 240 | with open(save_path, 'wb') as f:
|
238 | 241 | f.write(video_data)
|
239 | 242 |
|
240 | 243 | def downloadVideoByIdNoWatermark(self, video_id, save_path):
|
241 | 244 | video_info = self.getVideoById(video_id)
|
242 | 245 | video_url = video_info["itemInfo"]["itemStruct"]["video"]["downloadAddr"]
|
243 |
| - headers = {"User-Agent": "okhttp"} |
244 |
| - video_data = get_req_text(video_url, params=None, headers=headers) |
| 246 | + video_data = get_req_text(video_url, params=None, headers=self.headers) |
245 | 247 | pos = video_data.find("vid:")
|
| 248 | + if pos == -1: |
| 249 | + raise VideoException("Video without watermark not available in new videos") |
246 | 250 | video_url_no_wm = "https://api2-16-h2.musical.ly/aweme/v1/play/?video_id={" \
|
247 | 251 | "}&vr_type=0&is_play_url=1&source=PackSourceEnum_PUBLISH&media_type=4" \
|
248 | 252 | .format(video_data[pos+4:pos+36])
|
249 |
| - headers = {"User-Agent": "okhttp"} |
250 |
| - video_data_no_wm = get_req_content(video_url_no_wm, params=None, headers=headers) |
| 253 | + |
| 254 | + video_data_no_wm = get_req_content(video_url_no_wm, params=None, headers=self.headers) |
251 | 255 | with open(save_path, 'wb') as f:
|
252 | 256 | f.write(video_data_no_wm)
|
0 commit comments