-
Notifications
You must be signed in to change notification settings - Fork 118
Expand file tree
/
Copy pathtiktok_browser.py
More file actions
96 lines (81 loc) · 3.1 KB
/
tiktok_browser.py
File metadata and controls
96 lines (81 loc) · 3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
import os
import asyncio
from pyppeteer import launcher
from .utils import python_list2_web_list
class TikTokBrowser:
def __init__(self, user_agent):
self.userAgent = user_agent
self.args = [
"--no-sandbox",
"--disable-setuid-sandbox",
"--disable-infobars",
"--window-position=0,0",
"--ignore-certifcate-errors",
"--ignore-certifcate-errors-spki-list",
"--user-agent=" + self.userAgent,
]
self.options = {
'args': self.args,
'headless': True,
'ignoreHTTPSErrors': True,
'userDataDir': "./tmp",
'handleSIGINT': False,
'handleSIGTERM': False,
'handleSIGHUP': False
}
self.api_list = [
"/api/user/detail",
"/api/user/list/",
"/api/music/detail",
"/api/item/detail",
"/api/challenge/detail/",
"/share/item/list",
"/api/item_list/",
"/api/comment/list/",
"/api/comment/list/reply/",
"/api/discover/*",
"/api/commit/follow/user/",
"/api/recommend/user/",
"/api/impression/write/",
"/share/item/explore/list",
"/api/commit/item/digg/",
"/node/share/*",
"/discover/render/*"
]
parent_folder = os.path.dirname(__file__)
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()
except RuntimeError:
asyncio.set_event_loop(asyncio.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):
pplauncher = launcher.Launcher(self.options)
browser = await pplauncher.launch()
page = await browser.newPage()
await page.evaluateOnNewDocument("""() => {
delete navigator.__proto__.webdriver;
}""")
await page.setUserAgent(self.userAgent)
await page.setExtraHTTPHeaders({
'Accept-Language': language
})
await page.goto(self.tiktok_dummy_page, {'waitUntil': "load"})
signature = await page.evaluate('''() => {
var init_token = window.byted_acrawler.init({
aid: 1988,
dfp: !1,
boe: !1,
intercept: !0,
enablePathList: ''' + python_list2_web_list(self.api_list) + '''
});
var token = window.byted_acrawler.sign({url: "''' + url + '''"});
return token;
}''')
await page.close()
await browser.close()
await pplauncher.killChrome()
return signature