tiktokautouploader 0.1__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,3 @@
1
+ from .function import UploadTK
2
+
3
+ __all__ = ['UploadTK']
@@ -0,0 +1,431 @@
1
+ from playwright.sync_api import sync_playwright
2
+ import json
3
+ import time
4
+ import inference
5
+ import requests
6
+ from PIL import Image
7
+ import sys
8
+ import warnings
9
+ from transformers import AutoModel, AutoTokenizer
10
+ import torch
11
+ from sklearn.metrics.pairwise import cosine_similarity
12
+ warnings.filterwarnings("ignore")
13
+
14
+ def get_embedding(sentence):
15
+ tokenizer = AutoTokenizer.from_pretrained('distilbert-base-uncased')
16
+ model = AutoModel.from_pretrained('distilbert-base-uncased')
17
+ inputs = tokenizer(sentence, return_tensors='pt')
18
+ outputs = model(**inputs)
19
+ return outputs.last_hidden_state.mean(dim=1).detach()
20
+
21
+ def get_object(question):
22
+ objects = ["boat","book","camera","chair","american football","guitar","hat","tree", "basketball", "purse", "pineapple", "car"]
23
+ object_embeddings = []
24
+
25
+ for obj in objects:
26
+ object_embeddings.append(get_embedding(obj))
27
+
28
+ question_embedding = get_embedding(question)
29
+
30
+ similarities = []
31
+
32
+ for obj in object_embeddings:
33
+ similarities.append(cosine_similarity(question_embedding, obj).item())
34
+
35
+ best_match_idx = torch.argmax(torch.tensor(similarities))
36
+ best_match = objects[best_match_idx]
37
+
38
+ return best_match
39
+
40
+
41
+
42
+ def get_image_src(page):
43
+ image_url = page.get_attribute("img#captcha-verify-image", "src")
44
+ return image_url
45
+
46
+ def download_image(image_url):
47
+ response = requests.get(image_url)
48
+ image_path = "captcha_image.jpg"
49
+ with open(image_path, "wb") as f:
50
+ f.write(response.content)
51
+ return image_path
52
+
53
+
54
+ def run_inference_on_image_tougher(image_path, object):
55
+
56
+ found_proper = False
57
+
58
+ model = inference.get_model("captcha-2-6ehbe/1")
59
+ results = model.infer(image=image_path)
60
+
61
+ class_names = []
62
+ bounding_boxes = []
63
+ for obj in results[0].predictions:
64
+ class_names.append(obj.class_name)
65
+ bounding_boxes.append({
66
+ "x": obj.x,
67
+ "y": obj.y,
68
+ "width": obj.width,
69
+ "height": obj.height
70
+ })
71
+
72
+ bounding_box = []
73
+ class_to_click = object
74
+ for i, classes in enumerate(class_names):
75
+ if classes == class_to_click:
76
+ bounding_box.append(bounding_boxes[i])
77
+
78
+ if len(bounding_box) == 2:
79
+ found_proper = True
80
+
81
+ return bounding_box, found_proper
82
+
83
+ def run_inference_on_image(image_path):
84
+
85
+ model = inference.get_model("tk-3nwi9/2")
86
+ results = model.infer(image=image_path)
87
+
88
+ class_names = []
89
+ bounding_boxes = []
90
+ for obj in results[0].predictions:
91
+ class_names.append(obj.class_name)
92
+ bounding_boxes.append({
93
+ "x": obj.x,
94
+ "y": obj.y,
95
+ "width": obj.width,
96
+ "height": obj.height
97
+ })
98
+
99
+ already_written = []
100
+ bounding_box = []
101
+ class_to_click = []
102
+ for i, classes in enumerate(class_names):
103
+ if classes in already_written:
104
+ class_to_click.append(classes)
105
+ bounding_box.append(bounding_boxes[i])
106
+ index = already_written.index(classes)
107
+ bounding_box.append(bounding_boxes[index])
108
+
109
+ already_written.append(classes)
110
+
111
+
112
+ return bounding_box, class_to_click
113
+
114
+ def convert_to_webpage_coordinates(bounding_boxes, image_x, image_y, image_height_web, image_width_web, image_height_real, image_width_real):
115
+
116
+ webpage_coordinates = []
117
+ for box in bounding_boxes:
118
+ x_box = box['x']
119
+ y_box = box['y']
120
+ rel_x = (x_box * image_width_web) / image_width_real
121
+ rel_y = (y_box * image_height_web) / image_height_real
122
+ x_cord = image_x + rel_x
123
+ y_cord = image_y + rel_y
124
+
125
+ print(f'BOX_X: {rel_x} : BOX_Y: {rel_y}')
126
+
127
+ webpage_coordinates.append((x_cord, y_cord))
128
+
129
+ return webpage_coordinates
130
+
131
+ def click_on_objects(page, object_coords):
132
+ for (x, y) in object_coords:
133
+ page.mouse.click(x, y)
134
+ time.sleep(0.5)
135
+
136
+
137
+
138
+ def UploadTK(video, description, hashtags, cookies_path, sound_name=None, sound_aud_vol='mix', schedule=None, day=None, copyrightcheck=False):
139
+
140
+ """
141
+ UPLOADS VIDEO TO TIKTOK
142
+ ------------------------------------------------------------------------------------------------------------------------------------------------c
143
+ video (str) -> path to video to upload
144
+ description (str) -> description for video
145
+ hashtags (str)(array) -> hashtags for video
146
+ cookies_path (str) -> path to tik tok cookies .json file
147
+ sound_name (str) -> name of tik tok sound to use for video
148
+ sound_aud_vol (str) -> volume of tik tok sound, 'main', 'mix' or 'background', check documentation for more info -> https://github.com/haziq-exe/TikTokAutoUploader
149
+ schedule (str) -> format HH:MM, your local time to upload video
150
+ day (int) -> day to schedule video for, check documentation for more info -> https://github.com/haziq-exe/TikTokAutoUploader
151
+ copyrightcheck (bool) -> include copyright check or not; CODE FAILS IF DONT PASS COPYRIGHT CHECK
152
+ --------------------------------------------------------------------------------------------------------------------------------------------
153
+ """
154
+
155
+ retries = 0
156
+ class_found = None
157
+
158
+ try:
159
+ with open(cookies_path , 'r') as cookiefile:
160
+ cookies = json.load(cookiefile)
161
+ except:
162
+ sys.exit("ERROR: COOKIES FILE NOT FOUND, make sure to copy the path of the cookies.json file")
163
+
164
+ try:
165
+ for cookie in cookies:
166
+ if cookie.get('sameSite') not in ['Strict', 'Lax', 'None']:
167
+ cookie['sameSite'] = 'Lax'
168
+ except:
169
+ sys.exit("ERROR: CANT READ COOKIES FILE, make sure the data in cookies.json is correct and in a valid format")
170
+
171
+
172
+ with sync_playwright() as p:
173
+ browser = p.chromium.launch(headless=True)
174
+ context = browser.new_context()
175
+ context.add_cookies(cookies)
176
+ page = context.new_page()
177
+ url = 'https://www.tiktok.com/tiktokstudio/upload?from=upload&lang=en'
178
+
179
+ while retries < 2:
180
+ try:
181
+ page.goto(url, timeout=60000)
182
+ except:
183
+ retries +=1
184
+ time.sleep(5)
185
+ if retries == 2:
186
+ sys.exit("ERROR: TIK TOK PAGE FAILED TO LOAD, try again.")
187
+ else:
188
+ break
189
+
190
+
191
+ image = get_image_src(page)
192
+ if image:
193
+ solved = False
194
+ attempts = 0
195
+ while solved == False:
196
+ attempts += 1
197
+ question = page.locator('div.VerifyBar___StyledDiv-sc-12zaxoy-0.hRJhHT').text_content()
198
+ if 'Select two objects that are the same' in question:
199
+ while class_found == None:
200
+ page.click('span.secsdk_captcha_refresh--text')
201
+ time.sleep(0.5)
202
+ image = get_image_src(page)
203
+ img_path = download_image(image)
204
+ b_box, class_found = run_inference_on_image(image_path=img_path)
205
+ print(f'CLICKING ON {class_found}')
206
+
207
+ with Image.open(img_path) as img:
208
+ image_size = img.size
209
+
210
+ image = page.locator('#captcha-verify-image')
211
+ image.wait_for()
212
+ box = image.bounding_box()
213
+ image_x = box['x']
214
+ image_y = box['y']
215
+ image_height_web = box['height']
216
+ image_width_web = box['width']
217
+ image_width_real, image_height_real = image_size
218
+
219
+ webpage_coords = convert_to_webpage_coordinates(b_box, image_x, image_y, image_height_web, image_width_web, image_height_real, image_width_real)
220
+ click_on_objects(page, webpage_coords)
221
+ time.sleep(0.5)
222
+ page.click("div.verify-captcha-submit-button")
223
+ if attempts > 5:
224
+ sys.exit("FAILED TO SOLVE CAPTCHA")
225
+ try:
226
+ page.wait_for_selector('input[type="file"][accept="video/*"]', timeout=5000)
227
+ solved = True
228
+ except:
229
+ continue
230
+ else:
231
+ found_prop = False
232
+ while found_prop == False:
233
+ page.click('span.secsdk_captcha_refresh--text')
234
+ time.sleep(0.5)
235
+ object = get_object(question)
236
+ image = get_image_src(page)
237
+ img_path = download_image(image)
238
+ if object == 'american football':
239
+ object = 'football'
240
+ b_box, found_prop = run_inference_on_image_tougher(image_path=img_path, object=object)
241
+
242
+ with Image.open(img_path) as img:
243
+ image_size = img.size
244
+
245
+ image = page.locator('#captcha-verify-image')
246
+ image.wait_for()
247
+ box = image.bounding_box()
248
+ image_x = box['x']
249
+ image_y = box['y']
250
+ image_height_web = box['height']
251
+ image_width_web = box['width']
252
+ image_width_real, image_height_real = image_size
253
+
254
+ webpage_coords = convert_to_webpage_coordinates(b_box, image_x, image_y, image_height_web, image_width_web, image_height_real, image_width_real)
255
+ click_on_objects(page, webpage_coords)
256
+ time.sleep(0.5)
257
+ page.click("div.verify-captcha-submit-button")
258
+ if attempts > 5:
259
+ sys.exit("FAILED TO SOLVE CAPTCHA")
260
+ try:
261
+ page.wait_for_selector('input[type="file"][accept="video/*"]', timeout=5000)
262
+ solved = True
263
+ except:
264
+ continue
265
+
266
+
267
+
268
+ try:
269
+ page.wait_for_selector('input[type="file"][accept="video/*"]', timeout=30000)
270
+ page.set_input_files('input[type="file"][accept="video/*"]', f'{video}')
271
+ except:
272
+ sys.exit("ERROR: INPUT FILE FAILED TO UPLOAD. Possible Issues: Wifi too slow, file directory wrong, or check documentation to see if captcha is solvable")
273
+
274
+ page.wait_for_selector('div[data-contents="true"]')
275
+ page.click('div[data-contents="true"]')
276
+ time.sleep(0.5)
277
+ if description == None:
278
+ sys.exit("ERROR: PLEASE INCLUDE A DESCRIPTION")
279
+
280
+ for _ in range(len(video) + 2):
281
+ page.keyboard.press("Backspace")
282
+ page.keyboard.press("Delete")
283
+
284
+ time.sleep(0.5)
285
+
286
+ page.keyboard.type(description)
287
+
288
+ for _ in range(3):
289
+ page.keyboard.press("Enter")
290
+
291
+ if hashtags != None:
292
+ for hashtag in hashtags:
293
+ if hashtag[0] != '#':
294
+ hashtag = "#" + hashtag
295
+
296
+ page.keyboard.type(hashtag)
297
+ time.sleep(0.5)
298
+ try:
299
+ page.click(f'span.hash-tag-topic:has-text("{hashtag}")', timeout=1000)
300
+ except:
301
+ try:
302
+ page.click('span.hash-tag-topic', timeout=1000)
303
+ except:
304
+ page.keyboard.press("Backspace")
305
+ try:
306
+ page.click('span.hash-tag-topic', timeout=1000)
307
+ except:
308
+ print(f"Tik tok hashtag not working for {hashtag}, moving onto next")
309
+ for _ in range(len(hashtag) + 1):
310
+ page.keyboard.press("Backspace")
311
+
312
+ try:
313
+ page.wait_for_function("document.querySelector('.info-progress-num').textContent.trim() === '100%'", timeout=3000000)
314
+ except:
315
+ sys.exit("ERROR: TIK TOK TOOK TOO LONG TO UPLOAD YOUR FILE (>50min). try a lower file size or different wifi connection")
316
+
317
+ time.sleep(0.5)
318
+
319
+ page.click('button.TUXButton.TUXButton--default.TUXButton--large.TUXButton--secondary:has-text("Save draft")')
320
+ page.wait_for_selector("path[d='M37.37 4.85a4.01 4.01 0 0 0-.99-.79 3 3 0 0 0-2.72 0c-.45.23-.81.6-1 .79a9 9 0 0 1-.04.05l-19.3 19.3c-1.64 1.63-2.53 2.52-3.35 3.47a36 36 0 0 0-4.32 6.16c-.6 1.1-1.14 2.24-2.11 4.33l-.3.6c-.4.75-.84 1.61-.8 2.43a2.5 2.5 0 0 0 2.37 2.36c.82.05 1.68-.4 2.44-.79l.59-.3c2.09-.97 3.23-1.5 4.33-2.11a36 36 0 0 0 6.16-4.32c.95-.82 1.84-1.71 3.47-3.34l19.3-19.3.05-.06a3 3 0 0 0 .78-3.71c-.22-.45-.6-.81-.78-1l-.02-.02-.03-.03-3.67-3.67a8.7 8.7 0 0 1-.06-.05ZM16.2 26.97 35.02 8.15l2.83 2.83L19.03 29.8c-1.7 1.7-2.5 2.5-3.33 3.21a32 32 0 0 1-7.65 4.93 32 32 0 0 1 4.93-7.65c.73-.82 1.51-1.61 3.22-3.32Z']")
321
+ page.click("path[d='M37.37 4.85a4.01 4.01 0 0 0-.99-.79 3 3 0 0 0-2.72 0c-.45.23-.81.6-1 .79a9 9 0 0 1-.04.05l-19.3 19.3c-1.64 1.63-2.53 2.52-3.35 3.47a36 36 0 0 0-4.32 6.16c-.6 1.1-1.14 2.24-2.11 4.33l-.3.6c-.4.75-.84 1.61-.8 2.43a2.5 2.5 0 0 0 2.37 2.36c.82.05 1.68-.4 2.44-.79l.59-.3c2.09-.97 3.23-1.5 4.33-2.11a36 36 0 0 0 6.16-4.32c.95-.82 1.84-1.71 3.47-3.34l19.3-19.3.05-.06a3 3 0 0 0 .78-3.71c-.22-.45-.6-.81-.78-1l-.02-.02-.03-.03-3.67-3.67a8.7 8.7 0 0 1-.06-.05ZM16.2 26.97 35.02 8.15l2.83 2.83L19.03 29.8c-1.7 1.7-2.5 2.5-3.33 3.21a32 32 0 0 1-7.65 4.93 32 32 0 0 1 4.93-7.65c.73-.82 1.51-1.61 3.22-3.32Z']")
322
+ page.wait_for_selector('div[data-contents="true"]')
323
+ page.wait_for_function("document.querySelector('.info-progress-num').textContent.trim() === '100%'", timeout=3000000)
324
+ time.sleep(0.5)
325
+
326
+ if sound_name != None:
327
+ page.click("div.TUXButton-label:has-text('Edit video')")
328
+ page.wait_for_selector("input.search-bar-input")
329
+ page.fill(f"input.search-bar-input", f"{sound_name}")
330
+ time.sleep(0.5)
331
+ page.click("div.TUXButton-label:has-text('Search')")
332
+ page.wait_for_selector('div.music-card-container')
333
+ page.click("div.music-card-container")
334
+ time.sleep(0.5)
335
+ page.click("div.TUXButton-label:has-text('Use')")
336
+ time.sleep(0.5)
337
+ page.click('img[src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMSAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAgNy41MDE2QzAgNi42NzMxNyAwLjY3MTU3MyA2LjAwMTYgMS41IDYuMDAxNkgzLjU3NzA5QzMuODY4MDUgNi4wMDE2IDQuMTQ0NTggNS44NzQ4OCA0LjMzNDU1IDUuNjU0NDlMOC43NDI1NSAwLjU0MDUyQzkuMzQ3OCAtMC4xNjE2NjggMTAuNSAwLjI2NjM3NCAxMC41IDEuMTkzNDFWMTguOTY3MkMxMC41IDE5Ljg3NDUgOS4zODg5NCAyMC4zMTI5IDguNzY5NDIgMTkuNjVMNC4zMzE3OSAxNC45MDIxQzQuMTQyNjkgMTQuNjk5OCAzLjg3ODE2IDE0LjU4NDkgMy42MDEyMiAxNC41ODQ5SDEuNUMwLjY3MTU3MyAxNC41ODQ5IDAgMTMuOTEzNCAwIDEzLjA4NDlWNy41MDE2Wk01Ljg0OTQ1IDYuOTYwMjdDNS4yNzk1NiA3LjYyMTQzIDQuNDQ5OTcgOC4wMDE2IDMuNTc3MDkgOC4wMDE2SDJWMTIuNTg0OUgzLjYwMTIyQzQuNDMyMDMgMTIuNTg0OSA1LjIyNTY0IDEyLjkyOTUgNS43OTI5NSAxMy41MzY0TDguNSAxNi40MzI4VjMuODg1MjJMNS44NDk0NSA2Ljk2MDI3WiIgZmlsbD0iIzE2MTgyMyIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTEzLjUxNSA3LjE5MTE5QzEzLjM0MjQgNi45NzU1OSAxMy4zMzk5IDYuNjYwNTYgMTMuNTM1MiA2LjQ2NTNMMTQuMjQyMyA1Ljc1ODE5QzE0LjQzNzYgNS41NjI5MyAxNC43NTU4IDUuNTYxNzUgMTQuOTM1NiA1Ljc3MTM2QzE2Ljk5NTkgOC4xNzM2MiAxNi45OTU5IDExLjgyOCAxNC45MzU2IDE0LjIzMDNDMTQuNzU1OCAxNC40Mzk5IDE0LjQzNzYgMTQuNDM4NyAxNC4yNDIzIDE0LjI0MzVMMTMuNTM1MiAxMy41MzY0QzEzLjMzOTkgMTMuMzQxMSAxMy4zNDI0IDEzLjAyNjEgMTMuNTE1IDEyLjgxMDVDMTQuODEzIDExLjE4ODUgMTQuODEzIDguODEzMTIgMTMuNTE1IDcuMTkxMTlaIiBmaWxsPSIjMTYxODIzIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNMTYuNzE3MiAxNi43MTgzQzE2LjUyMTkgMTYuNTIzMSAxNi41MjMxIDE2LjIwNzQgMTYuNzA3MiAxNi4wMDE3QzE5LjcyNTcgMTIuNjMgMTkuNzI1NyA3LjM3MTY4IDE2LjcwNzIgNC4wMDAwMUMxNi41MjMxIDMuNzk0MjcgMTYuNTIxOSAzLjQ3ODU4IDE2LjcxNzIgMy4yODMzMkwxNy40MjQzIDIuNTc2MjFDMTcuNjE5NSAyLjM4MDk1IDE3LjkzNyAyLjM4MDIgMTguMTIzMyAyLjU4NDA4QzIxLjkwOTkgNi43MjkyNiAyMS45MDk5IDEzLjI3MjQgMTguMTIzMyAxNy40MTc2QzE3LjkzNyAxNy42MjE1IDE3LjYxOTUgMTcuNjIwNyAxNy40MjQzIDE3LjQyNTVMMTYuNzE3MiAxNi43MTgzWiIgZmlsbD0iIzE2MTgyMyIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPC9zdmc+Cg=="]')
338
+ time.sleep(0.5)
339
+ sliders = page.locator("input.scaleInput")
340
+ time.sleep(0.5)
341
+
342
+ if sound_aud_vol == 'background':
343
+ slider1 = sliders.nth(0)
344
+ bounding_box1 = slider1.bounding_box()
345
+ if bounding_box1:
346
+ x1 = bounding_box1["x"] + (bounding_box1["width"] * 0.95)
347
+ y1 = bounding_box1["y"] + bounding_box1["height"] / 2
348
+ page.mouse.click(x1, y1)
349
+
350
+ slider2 = sliders.nth(1)
351
+ bounding_box2 = slider2.bounding_box()
352
+ if bounding_box2:
353
+ x2 = bounding_box2["x"] + (bounding_box2["width"] * 0.097)
354
+ y2 = bounding_box2["y"] + bounding_box2["height"] / 2
355
+ page.mouse.click(x2, y2)
356
+
357
+ if sound_aud_vol == 'main':
358
+ slider1 = sliders.nth(0)
359
+ bounding_box1 = slider1.bounding_box()
360
+ if bounding_box1:
361
+ x1 = bounding_box1["x"] + (bounding_box1["width"] * 0.097)
362
+ y1 = bounding_box1["y"] + bounding_box1["height"] / 2
363
+ page.mouse.click(x1, y1)
364
+ slider2 = sliders.nth(1)
365
+ bounding_box2 = slider2.bounding_box()
366
+ if bounding_box2:
367
+ x2 = bounding_box2["x"] + (bounding_box2["width"] * 0.95)
368
+ y2 = bounding_box2["y"] + bounding_box2["height"] / 2
369
+ page.mouse.click(x2, y2)
370
+
371
+
372
+ time.sleep(0.5)
373
+ page.click("div.TUXButton-label:has-text('Save edit')")
374
+
375
+ page.wait_for_selector('div[data-contents="true"]')
376
+ if schedule != None:
377
+ try:
378
+ hour = schedule[0:2]
379
+ minute = schedule[3:]
380
+ print(hour, minute)
381
+ if (int(minute) % 5) != 0:
382
+ sys.exit("MINUTE FORMAT ERROR: PLEASE MAKE SURE MINUTE YOU SCHEDULE AT IS A MULTIPLE OF 5 UNTIL 60 (i.e: 40)")
383
+
384
+ except:
385
+ sys.exit("SCHEDULE TIME ERROR: PLEASE MAKE SURE YOUR SCHEDULE TIME IS A STRING THAT FOLLOWS THE 24H FORMAT 'HH:MM'")
386
+
387
+ page.locator('div.TUXRadioStandalone.TUXRadioStandalone--medium').nth(1).click()
388
+ time.sleep(0.5)
389
+ if day != None:
390
+ page.locator('div.TUXTextInputCore-trailingIconWrapper').nth(1).click()
391
+ time.sleep(0.5)
392
+ try:
393
+ page.locator(f'span.day.valid:has-text("{day}")').click()
394
+ except:
395
+ sys.exit("SCHEDULE DAY ERROR: ERROR WITH SCHEDULED DAY, read documentation for more information on format of day")
396
+ try:
397
+ page.locator('div.TUXTextInputCore-trailingIconWrapper').nth(0).click()
398
+ time.sleep(0.5)
399
+ page.locator(f'.tiktok-timepicker-option-text:has-text("{hour}")').nth(0).scroll_into_view_if_needed()
400
+ page.locator(f'.tiktok-timepicker-option-text:has-text("{hour}")').nth(0).click()
401
+ time.sleep(1)
402
+ page.locator('div.TUXTextInputCore-trailingIconWrapper').nth(0).click()
403
+ time.sleep(0.5)
404
+ page.locator(f'.tiktok-timepicker-option-text:has-text("{minute}")').nth(1).scroll_into_view_if_needed()
405
+ time.sleep(0.5)
406
+ page.locator(f'.tiktok-timepicker-option-text:has-text("{minute}")').nth(1).click()
407
+
408
+ error_message_locator = page.locator('span', has_text="Schedule at least 15 minutes in advance")
409
+ if error_message_locator.is_visible():
410
+ sys.exit("SCHEDULE TIME ERROR: SCHEDULING TIME SHOULD BE MORE THAN 15 MINUTES FROM YOUR CURRENT TIME")
411
+
412
+ except:
413
+ sys.exit("SCHEDULING ERROR")
414
+
415
+
416
+
417
+
418
+ if copyrightcheck == True:
419
+ page.locator("input#\\:r1h\\: + div.TUXSwitch-handle").click()
420
+ while copyrightcheck == True:
421
+ time.sleep(3)
422
+ if page.locator("span", has_text="No issues detected.").is_visible():
423
+ break
424
+ if page.locator("span", has_text="Copyright issues detected.").is_visible():
425
+ sys.exit("COPYRIGHT CHECK FAILED: COPYRIGHT AUDIO DETECTED FROM TIKTOK")
426
+
427
+
428
+ page.click('button.TUXButton.TUXButton--default.TUXButton--large.TUXButton--primary')
429
+ time.sleep(2)
430
+
431
+ page.close()
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) [2024] [HAZIQ KHALID]
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,24 @@
1
+ Metadata-Version: 2.1
2
+ Name: tiktokautouploader
3
+ Version: 0.1
4
+ Summary: Upload or schedules videos to tiktok with tiktok sounds and hashtags that work.
5
+ Home-page: https://github.com/haziq-exe/TikTokAutoUploader
6
+ Author: HAZIQ KHALID
7
+ Author-email: haziqmk123@gmail.com
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3.8
10
+ Classifier: Programming Language :: Python :: 3.9
11
+ Classifier: Programming Language :: Python :: 3.10
12
+ Classifier: Programming Language :: Python :: 3.11
13
+ Classifier: License :: OSI Approved :: MIT License
14
+ Classifier: Operating System :: OS Independent
15
+ Requires-Python: >=3.6
16
+ Description-Content-Type: text/markdown
17
+ License-File: LICENSE.md
18
+ Requires-Dist: playwright >=1.0.0
19
+ Requires-Dist: requests >=2.0.0
20
+ Requires-Dist: Pillow >=8.0.0
21
+ Requires-Dist: transformers >=4.0.0
22
+ Requires-Dist: torch >=1.0.0
23
+ Requires-Dist: scikit-learn >=0.24.0
24
+
@@ -0,0 +1,7 @@
1
+ tiktokautouploader/___init__.py,sha256=2L-CuafzOqBa3W9m22MLhPMd3Zq4M-X-xvvpxg9c2l0,54
2
+ tiktokautouploader/function.py,sha256=4IE3TalKgnYMHHytUTu538e8mLaFRVs6ICg01mOVe5g,20640
3
+ tiktokautouploader-0.1.dist-info/LICENSE.md,sha256=hYds_VJIpnS5gC73WhuWk2IY_e9BWjuEJthQCb9ThyU,1073
4
+ tiktokautouploader-0.1.dist-info/METADATA,sha256=NPDmRjWTL3ZzlkfIVl7ARlrYQzvgUo9vvfTH8lTcqQU,899
5
+ tiktokautouploader-0.1.dist-info/WHEEL,sha256=y4mX-SOX4fYIkonsAGA5N0Oy-8_gI4FXw5HNI1xqvWg,91
6
+ tiktokautouploader-0.1.dist-info/top_level.txt,sha256=qWHpLVcaD7RWLk-Kbm7dQJozxGecC0ldwh6dEBexOu4,19
7
+ tiktokautouploader-0.1.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (70.2.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ tiktokautouploader