diff --git a/src/modules/processing/services/tiktok.js b/src/modules/processing/services/tiktok.js index c43a3b61..6b455a8d 100644 --- a/src/modules/processing/services/tiktok.js +++ b/src/modules/processing/services/tiktok.js @@ -4,11 +4,13 @@ const userAgent = genericUserAgent.split(' Chrome/1')[0], config = { tiktok: { short: "https://vt.tiktok.com/", - api: "https://api22-normal-c-useast2a.tiktokv.com/aweme/v1/feed/?aweme_id={postId}&version_code=262&app_name=musical_ly&channel=App&device_id=null&os_version=14.4.2&device_platform=iphone&device_type=iPhone9®ion=US&carrier_region=US" + api: "https://api22-normal-c-useast2a.tiktokv.com/aweme/v1/feed/?aweme_id={postId}&version_code=262&app_name=musical_ly&channel=App&device_id=null&os_version=14.4.2&device_platform=iphone&device_type=iPhone9®ion=US&carrier_region=US", + userAgent: "TikTok 26.2.0 rv:262018 (iPhone; iOS 14.4.2; en_US) Cronet" }, douyin: { short: "https://v.douyin.com/", - api: "https://www.iesdouyin.com/aweme/v1/web/aweme/detail/?aweme_id={postId}" + api: "https://www.iesdouyin.com/aweme/v1/web/aweme/detail/?aweme_id={postId}", + userAgent: "TikTok 26.2.0 rv:262018 (iPhone; iOS 14.4.2; en_US) Cronet" } } @@ -17,10 +19,10 @@ function selector(j, h, id) { let t; switch (h) { case "tiktok": - t = j["aweme_list"].filter(v => v["aweme_id"] === id)[0]; + t = j.aweme_list.filter(v => v.aweme_id === id)[0]; break; case "douyin": - t = j['aweme_detail']; + t = j.aweme_detail; break; } if (t?.length < 3) return false; @@ -31,7 +33,7 @@ export default async function(obj) { let postId = obj.postId ? obj.postId : false; if (!postId) { - let html = await fetch(`${config[obj.host]["short"]}${obj.id}`, { + let html = await fetch(`${config[obj.host].short}${obj.id}`, { redirect: "manual", headers: { "user-agent": userAgent } }).then((r) => { return r.text() }).catch(() => { return false }); @@ -47,8 +49,10 @@ export default async function(obj) { if (!postId) return { error: 'ErrorCantGetID' }; let detail; - detail = await fetch(config[obj.host]["api"].replace("{postId}", postId), { - headers: {"user-agent": "TikTok 26.2.0 rv:262018 (iPhone; iOS 14.4.2; en_US) Cronet"} + detail = await fetch(config[obj.host].api.replace("{postId}", postId), { + headers: { + "user-agent": config[obj.host].userAgent + } }).then((r) => { return r.json() }).catch(() => { return false }); detail = selector(detail, obj.host, postId); @@ -56,24 +60,24 @@ export default async function(obj) { let video, videoFilename, audioFilename, isMp3, audio, images, filenameBase = `${obj.host}_${postId}`; if (obj.host === "tiktok") { - images = detail["image_post_info"] ? detail["image_post_info"]["images"] : false + images = detail.image_post_info ? detail.image_post_info.images : false } else { - images = detail["images"] ? detail["images"] : false + images = detail.images ? detail.images : false } if (!obj.isAudioOnly && !images) { - video = obj.host === "tiktok" ? detail["video"]["download_addr"]["url_list"][0] : detail["video"]["play_addr"]["url_list"][2].replace("/play/", "/playwm/"); + video = obj.host === "tiktok" ? detail.video.download_addr.url_list[0] : detail.video.play_addr.url_list[2].replace("/play/", "/playwm/"); videoFilename = `${filenameBase}_video.mp4`; if (obj.noWatermark) { - video = obj.host === "tiktok" ? detail["video"]["play_addr"]["url_list"][0] : detail["video"]["play_addr"]["url_list"][0]; + video = obj.host === "tiktok" ? detail.video.play_addr.url_list[0] : detail.video.play_addr.url_list[0]; videoFilename = `${filenameBase}_video_nw.mp4` // nw - no watermark } } else { - let fallback = obj.host === "douyin" ? detail["video"]["play_addr"]["url_list"][0].replace("playwm", "play") : detail["video"]["play_addr"]["url_list"][0]; + let fallback = obj.host === "douyin" ? detail.video.play_addr.url_list[0].replace("playwm", "play") : detail.video.play_addr.url_list[0]; audio = fallback; audioFilename = `${filenameBase}_audio_fv`; // fv - from video if (obj.fullAudio || fallback.includes("music")) { - audio = detail["music"]["play_url"]["url_list"][0] + audio = detail.music.play_url.url_list[0] audioFilename = `${filenameBase}_audio` } if (audio.slice(-4) === ".mp3") isMp3 = true; @@ -92,7 +96,7 @@ export default async function(obj) { if (images) { let imageLinks = []; for (let i in images) { - let sel = obj.host === "tiktok" ? images[i]["display_image"]["url_list"] : images[i]["url_list"]; + let sel = obj.host === "tiktok" ? images[i].display_image.url_list : images[i].url_list; sel = sel.filter(p => p.includes(".jpeg?")) imageLinks.push({url: sel[0]}) }