Skip to content

Instantly share code, notes, and snippets.

@ataki
Created September 21, 2022 16:28
Show Gist options
  • Save ataki/c10f367d6607d1d84e7eda562a123710 to your computer and use it in GitHub Desktop.
Save ataki/c10f367d6607d1d84e7eda562a123710 to your computer and use it in GitHub Desktop.
Scrapes TikTok results for a certain hashtag. Paste into chrome console
let seen = new Set()
async function getBioLink(row) {
try {
const { signature, uniqueId } = row
const secUid = row.secUid
const url = `https://us.tiktok.com/api/user/detail/?aid=1988&app_language=en&app_name=tiktok_web&battery_info=1&browser_language=en-US&browser_name=Mozilla&browser_online=true&browser_platform=MacIntel&browser_version=5.0%20%28Macintosh%3B%20Intel%20Mac%20OS%20X%2010_15_7%29%20AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20Chrome%2F105.0.0.0%20Safari%2F537.36&channel=tiktok_web&cookie_enabled=true&device_id=7137341942917350955&device_platform=web_pc&focus_state=true&from_page=user&history_len=2&is_fullscreen=false&is_page_visible=true&language=en&os=mac&priority_region=US&referer=&region=US&screen_height=1440&screen_width=2560&secUid=${secUid}&tz_name=America%2FNew_York&uniqueId=${uniqueId}&webcast_language=en&msToken=J9m3_eBf4GKuBDGa063BDCsjVBzMBmcFqJvEGf0M62WHW9yPzXAHzcFhc8-X5-DLAkVoNH7CKKi-Jkp1Kb7ua75MV6btEfjcZPAbhZJKirSwPlP_CTcRrSMHocUTnU4=&X-Bogus=DFSzswjOWETANyuDSse9PcYEO920&_signature=${signature}`
console.log(url)
const res = await fetch(url)
// const userData: { userInfo?: { user?: { bioLink?: { link?: string } } } } = await res.json()
const userData = await res.json()
return userData?.userInfo?.user?.bioLink?.link || ''
} catch (e) {
return ''
}
}
// CHANGE THIS
let kw = `%23fintok`
let offset = 0
let base = "https://us.tiktok.com/api/search/general/full"
let cumulativeDataAsRows = []
while (true) {
let url = `${base}/?aid=1988&app_language=en&app_name=tiktok_web&battery_info=1&browser_language=en-US&browser_name=Mozilla&browser_online=true&browser_platform=MacIntel&browser_version=5.0%20%28Macintosh%3B%20Intel%20Mac%20OS%20X%2010_15_7%29%20AppleWebKit%2F537.36%20%28KHTML%2C%20like%20Gecko%29%20Chrome%2F105.0.0.0%20Safari%2F537.36&channel=tiktok_web&cookie_enabled=true&device_id=7137341942917350955&device_platform=web_pc&focus_state=true&from_page=search&history_len=3&is_fullscreen=false&is_page_visible=true&keyword=${kw}&offset=${offset}&os=mac&priority_region=US&referer=&region=US&screen_height=1440&screen_width=2560&tz_name=America%2FNew_York&verifyFp=verify_l87zdu3e_nNaNTe9g_D9vP_4RCK_A5cT_pgAfD4S7NYIG&webcast_language=en&msToken=fUMZm-eMlonGgkjPrjICpJQb92Ga0-LWGWh8ekEP_qpSzIdDyg0UerAT61T0Te1a1ZanpHSLLCupEgTdGIXVVGms7P61eeirsuRx8_8itZNnYtJdWgP_brrZIjUNoUc=&X-Bogus=DFSzswjL0NJANyxRSsayYkzpc1rT&_signature=_02B4Z6wo00001M81y4wAAIDD1EnMjOQHBBjPNccAAFDse5`
let res = await fetch(url, {
"headers": {
"accept": "*/*",
"accept-language": "en-US,en;q=0.9",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-site",
"sec-gpc": "1"
},
"referrer": "https://www.tiktok.com/",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": null,
"method": "GET",
"mode": "cors",
"credentials": "include"
});
const rowToCsv = (row) => {
return [row.url, row.link].join(',')
}
const parseBio = (desc) => {
// linktree
if (desc.includes("linktr.ee")) {
const match = desc.match(/linktr.ee\/(.*)/)
if (match && match.length > 0) return match[0]
}
// beacons
if (desc.includes("linktr.ee")) {
const match = desc.match(/beacons.ai\/(.*)/)
if (match && match.length > 0) return match[0]
}
// hoo.be
if (desc.includes("hoo.be")) {
const match = desc.match(/hoo.be\/(.*)/)
if (match && match.length > 0) return match[0]
}
return ''
}
let payload = await res.json()
if (payload.data.length === 0) {
break
}
let _dataAsRows = await Promise.all(payload.data.map(async (item) => {
if (!item.item) {
return ''
}
const key = item.item.author.uniqueId
if (seen.has(key)) return ''
seen.add(key)
const row = {
url: `https://www.tiktok.com/@${item.item.author.uniqueId}`,
link: parseBio(item.item.author.signature) || await getBioLink(item.item.author)
}
return rowToCsv(row)
}))
let dataAsRows = _dataAsRows.filter((row) => row !== null)
cumulativeDataAsRows = cumulativeDataAsRows.concat(dataAsRows)
offset += 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment