tiktokautouploader 2.98__py2.py3-none-any.whl → 3.2__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- tiktokautouploader/function.py +220 -130
- {tiktokautouploader-2.98.dist-info → tiktokautouploader-3.2.dist-info}/METADATA +22 -13
- tiktokautouploader-3.2.dist-info/RECORD +7 -0
- tiktokautouploader-2.98.dist-info/RECORD +0 -7
- {tiktokautouploader-2.98.dist-info → tiktokautouploader-3.2.dist-info}/WHEEL +0 -0
- {tiktokautouploader-2.98.dist-info → tiktokautouploader-3.2.dist-info}/licenses/LICENSE.md +0 -0
tiktokautouploader/function.py
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
from playwright.sync_api import sync_playwright
|
2
2
|
import json
|
3
3
|
import time
|
4
|
-
import inference
|
5
4
|
import subprocess
|
5
|
+
from inference_sdk import InferenceHTTPClient
|
6
6
|
import pkg_resources
|
7
7
|
import requests
|
8
8
|
from PIL import Image
|
@@ -139,21 +139,27 @@ def download_image(image_url):
|
|
139
139
|
f.write(response.content)
|
140
140
|
return image_path
|
141
141
|
|
142
|
-
|
143
142
|
def run_inference_on_image_tougher(image_path, object):
|
144
143
|
|
145
|
-
|
146
|
-
|
144
|
+
k = 'n|KIeDZnRZiJ};iVHz;R'
|
145
|
+
rk = ''.join(chr((ord(c) - 3) % 256) for c in k)
|
146
|
+
|
147
|
+
CLIENT = InferenceHTTPClient(
|
148
|
+
api_url="https://detect.roboflow.com",
|
149
|
+
api_key=f"{rk}"
|
150
|
+
)
|
151
|
+
|
152
|
+
results = CLIENT.infer(image_path, model_id="captcha-2-6ehbe/2")
|
147
153
|
|
148
154
|
class_names = []
|
149
155
|
bounding_boxes = []
|
150
|
-
for obj in results[
|
151
|
-
class_names.append(obj
|
156
|
+
for obj in results['predictions']:
|
157
|
+
class_names.append(obj['class'])
|
152
158
|
bounding_boxes.append({
|
153
|
-
"x": obj
|
154
|
-
"y": obj
|
155
|
-
"width": obj
|
156
|
-
"height": obj
|
159
|
+
"x": obj['x'],
|
160
|
+
"y": obj['y'],
|
161
|
+
"width": obj['width'],
|
162
|
+
"height": obj['height']
|
157
163
|
})
|
158
164
|
|
159
165
|
bounding_box = []
|
@@ -168,34 +174,40 @@ def run_inference_on_image_tougher(image_path, object):
|
|
168
174
|
|
169
175
|
def run_inference_on_image(image_path):
|
170
176
|
|
171
|
-
|
172
|
-
|
177
|
+
k = 'n|KIeDZnRZiJ};iVHz;R'
|
178
|
+
rk = ''.join(chr((ord(c) - 3) % 256) for c in k)
|
179
|
+
|
180
|
+
CLIENT = InferenceHTTPClient(
|
181
|
+
api_url="https://detect.roboflow.com",
|
182
|
+
api_key=f"{rk}"
|
183
|
+
)
|
184
|
+
|
185
|
+
results = CLIENT.infer(image_path, model_id="tk-3nwi9/2")
|
173
186
|
|
174
187
|
class_names = []
|
175
188
|
bounding_boxes = []
|
176
|
-
for obj in results[
|
177
|
-
class_names.append(obj
|
189
|
+
for obj in results['predictions']:
|
190
|
+
class_names.append(obj['class'])
|
178
191
|
bounding_boxes.append({
|
179
|
-
"x": obj
|
180
|
-
"y": obj
|
181
|
-
"width": obj
|
182
|
-
"height": obj
|
192
|
+
"x": obj['x'],
|
193
|
+
"y": obj['y'],
|
194
|
+
"width": obj['width'],
|
195
|
+
"height": obj['height']
|
183
196
|
})
|
184
197
|
|
185
198
|
already_written = []
|
186
199
|
bounding_box = []
|
187
200
|
class_to_click = []
|
188
|
-
for i,
|
189
|
-
if
|
190
|
-
class_to_click.append(
|
201
|
+
for i, detected_class in enumerate(class_names):
|
202
|
+
if detected_class in already_written:
|
203
|
+
class_to_click.append(detected_class)
|
191
204
|
bounding_box.append(bounding_boxes[i])
|
192
|
-
index = already_written.index(
|
205
|
+
index = already_written.index(detected_class)
|
193
206
|
bounding_box.append(bounding_boxes[index])
|
194
207
|
|
195
|
-
already_written.append(
|
208
|
+
already_written.append(detected_class)
|
196
209
|
|
197
210
|
found = False
|
198
|
-
|
199
211
|
if len(class_to_click) == 1:
|
200
212
|
found = True
|
201
213
|
|
@@ -223,13 +235,14 @@ def click_on_objects(page, object_coords):
|
|
223
235
|
|
224
236
|
|
225
237
|
|
226
|
-
def upload_tiktok(video, description, accountname, hashtags=None, sound_name=None, sound_aud_vol='mix', schedule=None, day=None, copyrightcheck=False, suppressprint=False):
|
238
|
+
def upload_tiktok(video, description, accountname, hashtags=None, sound_name=None, sound_aud_vol='mix', schedule=None, day=None, copyrightcheck=False, suppressprint=False, headless=True):
|
227
239
|
|
228
240
|
"""
|
229
241
|
UPLOADS VIDEO TO TIKTOK
|
230
242
|
------------------------------------------------------------------------------------------------------------------------------------------------c
|
231
243
|
video (str) -> path to video to upload
|
232
244
|
description (str) -> description for video
|
245
|
+
accountname (str) -> account to upload on
|
233
246
|
hashtags (str)(array) -> hashtags for video
|
234
247
|
sound_name (str) -> name of tik tok sound to use for video
|
235
248
|
sound_aud_vol (str) -> volume of tik tok sound, 'main', 'mix' or 'background', check documentation for more info -> https://github.com/haziq-exe/TikTokAutoUploader
|
@@ -237,6 +250,7 @@ def upload_tiktok(video, description, accountname, hashtags=None, sound_name=Non
|
|
237
250
|
day (int) -> day to schedule video for, check documentation for more info -> https://github.com/haziq-exe/TikTokAutoUploader
|
238
251
|
copyrightcheck (bool) -> include copyright check or not; CODE FAILS IF FAIL COPYRIGHT CHECK
|
239
252
|
suppressprint (bool) -> True means function doesnt print anything to provide updates on progress
|
253
|
+
headless (bool) -> run in headless mode or not
|
240
254
|
--------------------------------------------------------------------------------------------------------------------------------------------
|
241
255
|
"""
|
242
256
|
try:
|
@@ -272,8 +286,7 @@ def upload_tiktok(video, description, accountname, hashtags=None, sound_name=Non
|
|
272
286
|
|
273
287
|
with sync_playwright() as p:
|
274
288
|
|
275
|
-
browser = p.firefox.launch(headless=
|
276
|
-
|
289
|
+
browser = p.firefox.launch(headless=headless)
|
277
290
|
context = browser.new_context()
|
278
291
|
context.add_cookies(cookies)
|
279
292
|
page = context.new_page()
|
@@ -459,13 +472,16 @@ def upload_tiktok(video, description, accountname, hashtags=None, sound_name=Non
|
|
459
472
|
print("Description and Hashtags added")
|
460
473
|
|
461
474
|
try:
|
462
|
-
page.
|
475
|
+
page.wait_for_selector('button.TUXButton.TUXButton--default.TUXButton--large.TUXButton--primary:has-text("Post")[aria-disabled="false"]', timeout=12000000)
|
463
476
|
except:
|
464
477
|
sys.exit("ERROR: TIK TOK TOOK TOO LONG TO UPLOAD YOUR FILE (>20min). Try again, if issue persists then try a lower file size or different wifi connection")
|
465
478
|
|
466
479
|
time.sleep(0.2)
|
467
480
|
if suppressprint == False:
|
468
481
|
print("Tik tok done loading file onto servers")
|
482
|
+
|
483
|
+
if (schedule == None) and (day != None):
|
484
|
+
sys.exit("ERROR: CANT SCHEDULE FOR ANOTHER DAY USING 'day' WITHOUT ALSO INCLUDING TIME OF UPLOAD WITH 'schedule'; PLEASE ALSO INCLUDE TIME WITH 'schedule' PARAMETER")
|
469
485
|
|
470
486
|
if schedule != None:
|
471
487
|
try:
|
@@ -477,31 +493,39 @@ def upload_tiktok(video, description, accountname, hashtags=None, sound_name=Non
|
|
477
493
|
except:
|
478
494
|
sys.exit("SCHEDULE TIME ERROR: PLEASE MAKE SURE YOUR SCHEDULE TIME IS A STRING THAT FOLLOWS THE 24H FORMAT 'HH:MM', VIDEO SAVED AS DRAFT")
|
479
495
|
|
480
|
-
page.locator('div.TUXRadioStandalone.TUXRadioStandalone--medium').
|
481
|
-
time.sleep(1)
|
482
|
-
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
time.sleep(0.
|
496
|
+
page.locator('div.TUXRadioStandalone.TUXRadioStandalone--medium:has(input[value="schedule"])').click()
|
497
|
+
# time.sleep(1)
|
498
|
+
visible = False
|
499
|
+
while visible == False:
|
500
|
+
if page.locator('button.TUXButton.TUXButton--default.TUXButton--medium.TUXButton--primary:has-text("Allow")').nth(0).is_visible():
|
501
|
+
page.locator('button.TUXButton.TUXButton--default.TUXButton--medium.TUXButton--primary:has-text("Allow")').nth(0).click()
|
502
|
+
visible = True
|
503
|
+
time.sleep(0.1)
|
504
|
+
else:
|
505
|
+
if page.locator('div.TUXTextInputCore-trailingIconWrapper').nth(1).is_visible():
|
506
|
+
visible = True
|
507
|
+
time.sleep(0.1)
|
488
508
|
if day != None:
|
489
|
-
page.locator('div.TUXTextInputCore-
|
509
|
+
page.locator('div.TUXTextInputCore-leadingIconWrapper:has(svg > path[d="M15 3a1 1 0 0 0-1 1v3h-1.4c-3.36 0-5.04 0-6.32.65a6 6 0 0 0-2.63 2.63C3 11.56 3 13.24 3 16.6v16.8c0 3.36 0 5.04.65 6.32a6 6 0 0 0 2.63 2.63c1.28.65 2.96.65 6.32.65h22.8c3.36 0 5.04 0 6.32-.65a6 6 0 0 0 2.63-2.63c.65-1.28.65-2.96.65-6.32V16.6c0-3.36 0-5.04-.65-6.32a6 6 0 0 0-2.63-2.63C40.44 7 38.76 7 35.4 7H34V4a1 1 0 0 0-1-1h-2a1 1 0 0 0-1 1v3H18V4a1 1 0 0 0-1-1h-2Zm-2.4 8H14v3a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-3h12v3a1 1 0 0 0 1 1h2a1 1 0 0 0 1-1v-3h1.4c1.75 0 2.82 0 3.62.07a5.11 5.11 0 0 1 .86.14h.03a2 2 0 0 1 .88.91 5.11 5.11 0 0 1 .14.86c.07.8.07 1.87.07 3.62v1.9H7v-1.9c0-1.75 0-2.82.07-3.62a5.12 5.12 0 0 1 .14-.86v-.03a2 2 0 0 1 .88-.87l.03-.01a5.11 5.11 0 0 1 .86-.14c.8-.07 1.87-.07 3.62-.07ZM7 22.5h34v10.9c0 1.75 0 2.82-.07 3.62a5.11 5.11 0 0 1-.14.86v.03a2 2 0 0 1-.88.87l-.03.01a5.11 5.11 0 0 1-.86.14c-.8.07-1.87.07-3.62.07H12.6c-1.75 0-2.82 0-3.62-.07a5.11 5.11 0 0 1-.89-.15 2 2 0 0 1-.87-.87l-.01-.03a5.12 5.12 0 0 1-.14-.86C7 36.22 7 35.15 7 33.4V22.5Z"])').click()
|
490
510
|
time.sleep(0.2)
|
491
511
|
try:
|
492
512
|
page.locator(f'span.day.valid:has-text("{day}")').click()
|
493
513
|
except:
|
494
514
|
sys.exit("SCHEDULE DAY ERROR: ERROR WITH SCHEDULED DAY, read documentation for more information on format of day")
|
495
515
|
try:
|
496
|
-
time.sleep(1)
|
497
|
-
page.locator('div.TUXTextInputCore-trailingIconWrapper').nth(0).click()
|
498
516
|
time.sleep(0.2)
|
499
|
-
page.locator(
|
517
|
+
page.locator('div.TUXTextInputCore-leadingIconWrapper:has(svg > path[d="M24 2a22 22 0 1 0 0 44 22 22 0 0 0 0-44ZM6 24a18 18 0 1 1 36 0 18 18 0 0 1-36 0Z"])').click()
|
518
|
+
time.sleep(0.2)
|
519
|
+
page.locator(f'.tiktok-timepicker-option-text.tiktok-timepicker-right:has-text("{minute}")').scroll_into_view_if_needed()
|
500
520
|
time.sleep(0.2)
|
501
|
-
page.locator(f'.tiktok-timepicker-option-text.tiktok-timepicker-right:has-text("{minute}")').
|
521
|
+
page.locator(f'.tiktok-timepicker-option-text.tiktok-timepicker-right:has-text("{minute}")').click()
|
502
522
|
time.sleep(0.2)
|
503
|
-
page.locator(
|
504
|
-
|
523
|
+
if page.locator("div.tiktok-timepicker-time-picker-container").is_visible():
|
524
|
+
time.sleep(0.1)
|
525
|
+
else:
|
526
|
+
page.locator('div.TUXTextInputCore-leadingIconWrapper:has(svg > path[d="M24 2a22 22 0 1 0 0 44 22 22 0 0 0 0-44ZM6 24a18 18 0 1 1 36 0 18 18 0 0 1-36 0Z"])').click()
|
527
|
+
page.locator(f'.tiktok-timepicker-option-text.tiktok-timepicker-left:has-text("{hour}")').scroll_into_view_if_needed()
|
528
|
+
page.locator(f'.tiktok-timepicker-option-text.tiktok-timepicker-left:has-text("{hour}")').click()
|
505
529
|
time.sleep(1)
|
506
530
|
|
507
531
|
if suppressprint == False:
|
@@ -509,93 +533,14 @@ def upload_tiktok(video, description, accountname, hashtags=None, sound_name=Non
|
|
509
533
|
|
510
534
|
except:
|
511
535
|
sys.exit("SCHEDULING ERROR: VIDEO SAVED AS DRAFT")
|
512
|
-
|
513
|
-
if (schedule == None) and (day != None):
|
514
|
-
sys.exit("ERROR: CANT SCHEDULE FOR ANOTHER DAY USING 'day' WITHOUT ALSO INCLUDING TIME OF UPLOAD WITH 'schedule'; PLEASE ALSO INCLUDE TIME WITH 'schedule' PARAMETER")
|
515
|
-
|
516
|
-
if(sound_name == None):
|
517
|
-
if copyrightcheck == True:
|
518
|
-
page.locator(".TUXSwitch-input").nth(0).click()
|
519
|
-
while copyrightcheck == True:
|
520
|
-
time.sleep(0.2)
|
521
|
-
if page.locator("span", has_text="No issues detected.").is_visible():
|
522
|
-
if suppressprint == False:
|
523
|
-
print("Copyright check complete")
|
524
|
-
break
|
525
|
-
if page.locator("span", has_text="Copyright issues detected.").is_visible():
|
526
|
-
sys.exit("COPYRIGHT CHECK FAILED: COPYRIGHT AUDIO DETECTED FROM TIKTOK")
|
527
|
-
|
528
|
-
if schedule == None:
|
529
|
-
page.click('button.TUXButton.TUXButton--default.TUXButton--large.TUXButton--primary:has-text("Post")', timeout=10000)
|
530
|
-
uploaded = False
|
531
|
-
checks = 0
|
532
|
-
while uploaded == False:
|
533
|
-
if page.locator(':has-text("Leaving the page does not interrupt")').nth(0).is_visible():
|
534
|
-
time.sleep(0.2)
|
535
|
-
break
|
536
|
-
time.sleep(0.2)
|
537
|
-
checks += 1
|
538
|
-
if checks > 100:
|
539
|
-
time.sleep(10)
|
540
|
-
if checks == 150:
|
541
|
-
break
|
542
|
-
else:
|
543
|
-
page.click('button.TUXButton.TUXButton--default.TUXButton--large.TUXButton--primary:has-text("Schedule")', timeout=10000)
|
544
|
-
uploaded = False
|
545
|
-
checks = 0
|
546
|
-
while uploaded == False:
|
547
|
-
if page.locator(':has-text("Leaving the page does not interrupt")').nth(0).is_visible():
|
548
|
-
time.sleep(0.2)
|
549
|
-
break
|
550
|
-
time.sleep(0.2)
|
551
|
-
checks += 1
|
552
|
-
if checks > 100:
|
553
|
-
time.sleep(10)
|
554
|
-
if checks == 150:
|
555
|
-
break
|
556
|
-
if suppressprint == False:
|
557
|
-
print("Done uploading video, NOTE: it may take a minute or two to show on TikTok")
|
558
|
-
|
559
|
-
page.close()
|
560
|
-
|
561
|
-
else:
|
562
|
-
try:
|
563
|
-
page.click('button.TUXButton.TUXButton--default.TUXButton--large.TUXButton--secondary:has-text("Save draft")', timeout=10000)
|
564
|
-
except:
|
565
|
-
sys.exit("SAVE AS DRAFT BUTTON NOT FOUND; CANNOT ADD SOUND WITHOUT ABILITY TO SAVE DRAFTS")
|
566
|
-
|
567
|
-
time.sleep(0.5)
|
568
|
-
page.close()
|
569
|
-
|
570
|
-
browser = p.chromium.launch(headless=True)
|
571
|
-
|
572
|
-
context = browser.new_context()
|
573
|
-
context.add_cookies(cookies)
|
574
|
-
page = context.new_page()
|
575
|
-
url2 = 'https://www.tiktok.com/tiktokstudio/content?tab=draft'
|
576
536
|
|
577
|
-
|
578
|
-
|
579
|
-
page.goto(url2, timeout=30000)
|
580
|
-
except:
|
581
|
-
retries +=1
|
582
|
-
time.sleep(5)
|
583
|
-
if retries == 2:
|
584
|
-
sys.exit("ERROR: TIK TOK PAGE FAILED TO LOAD, try again.")
|
585
|
-
else:
|
586
|
-
break
|
587
|
-
|
537
|
+
sound_fail = False
|
538
|
+
if sound_name != None:
|
588
539
|
try:
|
589
|
-
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']")
|
590
|
-
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']")
|
591
|
-
page.wait_for_selector('div[data-contents="true"]')
|
592
|
-
page.wait_for_function("document.querySelector('.info-progress-num').textContent.trim() === '100%'", timeout=3000000)
|
593
|
-
time.sleep(0.2)
|
594
|
-
except:
|
595
|
-
sys.exit("ERROR ADDING SOUND: Video saved as draft")
|
596
|
-
|
597
|
-
if sound_name != None:
|
598
540
|
page.click("div.TUXButton-label:has-text('Edit video')")
|
541
|
+
except:
|
542
|
+
sound_fail = True
|
543
|
+
if sound_fail == False:
|
599
544
|
page.wait_for_selector("input.search-bar-input")
|
600
545
|
page.fill(f"input.search-bar-input", f"{sound_name}")
|
601
546
|
time.sleep(0.2)
|
@@ -648,11 +593,154 @@ def upload_tiktok(video, description, accountname, hashtags=None, sound_name=Non
|
|
648
593
|
page.click("div.TUXButton-label:has-text('Save edit')")
|
649
594
|
if suppressprint == False:
|
650
595
|
print("Added sound")
|
651
|
-
|
596
|
+
|
597
|
+
if sound_fail == False:
|
598
|
+
page.wait_for_selector('div[data-contents="true"]')
|
599
|
+
|
600
|
+
if copyrightcheck == True:
|
601
|
+
page.click('div.TUXSwitch:has(label.TUXSwitch-label:has-text("Run a copyright check")) input.TUXSwitch-input')
|
602
|
+
while copyrightcheck == True:
|
603
|
+
time.sleep(0.2)
|
604
|
+
if page.locator("span", has_text="No issues detected.").is_visible():
|
605
|
+
if suppressprint == False:
|
606
|
+
print("Copyright check complete")
|
607
|
+
break
|
608
|
+
if page.locator("span", has_text="Copyright issues detected.").is_visible():
|
609
|
+
sys.exit("COPYRIGHT CHECK FAILED: VIDEO SAVED AS DRAFT, COPYRIGHT AUDIO DETECTED FROM TIKTOK")
|
610
|
+
|
611
|
+
|
612
|
+
try:
|
613
|
+
if schedule == None:
|
614
|
+
page.click('button.TUXButton.TUXButton--default.TUXButton--large.TUXButton--primary:has-text("Post")', timeout=10000)
|
615
|
+
uploaded = False
|
616
|
+
checks = 0
|
617
|
+
while uploaded == False:
|
618
|
+
if page.locator(':has-text("Leaving the page does not interrupt")').nth(0).is_visible():
|
619
|
+
time.sleep(0.2)
|
620
|
+
break
|
621
|
+
time.sleep(0.2)
|
622
|
+
checks += 1
|
623
|
+
if checks > 100:
|
624
|
+
time.sleep(10)
|
625
|
+
if checks == 150:
|
626
|
+
break
|
627
|
+
else:
|
628
|
+
page.click('button.TUXButton.TUXButton--default.TUXButton--large.TUXButton--primary:has-text("Schedule")', timeout=10000)
|
629
|
+
uploaded = False
|
630
|
+
checks = 0
|
631
|
+
while uploaded == False:
|
632
|
+
if page.locator(':has-text("Leaving the page does not interrupt")').nth(0).is_visible():
|
633
|
+
time.sleep(0.2)
|
634
|
+
break
|
635
|
+
time.sleep(0.2)
|
636
|
+
checks += 1
|
637
|
+
if checks > 100:
|
638
|
+
time.sleep(10)
|
639
|
+
if checks == 150:
|
640
|
+
break
|
641
|
+
if suppressprint == False:
|
642
|
+
print("Done uploading video, NOTE: it may take a minute or two to show on TikTok")
|
643
|
+
except:
|
644
|
+
time.sleep(5)
|
645
|
+
sys.exit("ERROR UPLOADING: VIDEO HAS SAVED AS DRAFT BUT CANT UPLOAD")
|
646
|
+
time.sleep(1)
|
647
|
+
|
648
|
+
page.close()
|
649
|
+
else:
|
650
|
+
try:
|
651
|
+
page.click('button.TUXButton.TUXButton--default.TUXButton--large.TUXButton--secondary:has-text("Save draft")', timeout=10000)
|
652
|
+
except:
|
653
|
+
sys.exit("SAVE AS DRAFT BUTTON NOT FOUND; Please try account that has ability to save as draft")
|
654
|
+
|
655
|
+
time.sleep(0.5)
|
656
|
+
page.close()
|
657
|
+
|
658
|
+
browser = p.chromium.launch(headless=headless)
|
659
|
+
|
660
|
+
context = browser.new_context()
|
661
|
+
context.add_cookies(cookies)
|
662
|
+
page = context.new_page()
|
663
|
+
url2 = 'https://www.tiktok.com/tiktokstudio/content?tab=draft'
|
664
|
+
|
665
|
+
while retries < 2:
|
666
|
+
try:
|
667
|
+
page.goto(url2, timeout=30000)
|
668
|
+
except:
|
669
|
+
retries +=1
|
670
|
+
time.sleep(5)
|
671
|
+
if retries == 2:
|
672
|
+
sys.exit("ERROR: TIK TOK PAGE FAILED TO LOAD, try again.")
|
673
|
+
else:
|
674
|
+
break
|
675
|
+
|
676
|
+
try:
|
677
|
+
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']")
|
678
|
+
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']")
|
679
|
+
page.wait_for_selector('div[data-contents="true"]')
|
680
|
+
time.sleep(0.2)
|
681
|
+
except:
|
682
|
+
sys.exit("ERROR ADDING SOUND: Video saved as draft")
|
683
|
+
|
684
|
+
if sound_name != None:
|
685
|
+
page.click("div.TUXButton-label:has-text('Edit video')")
|
686
|
+
page.wait_for_selector("input.search-bar-input")
|
687
|
+
page.fill(f"input.search-bar-input", f"{sound_name}")
|
688
|
+
time.sleep(0.2)
|
689
|
+
page.click("div.TUXButton-label:has-text('Search')")
|
690
|
+
try:
|
691
|
+
page.wait_for_selector('div.music-card-container')
|
692
|
+
page.click("div.music-card-container")
|
693
|
+
page.wait_for_selector("div.TUXButton-label:has-text('Use')")
|
694
|
+
page.click("div.TUXButton-label:has-text('Use')")
|
695
|
+
except:
|
696
|
+
sys.exit(f"ERROR: SOUND '{sound_name}' NOT FOUND")
|
697
|
+
try:
|
698
|
+
page.wait_for_selector('img[src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMSAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAgNy41MDE2QzAgNi42NzMxNyAwLjY3MTU3MyA2LjAwMTYgMS41IDYuMDAxNkgzLjU3NzA5QzMuODY4MDUgNi4wMDE2IDQuMTQ0NTggNS44NzQ4OCA0LjMzNDU1IDUuNjU0NDlMOC43NDI1NSAwLjU0MDUyQzkuMzQ3OCAtMC4xNjE2NjggMTAuNSAwLjI2NjM3NCAxMC41IDEuMTkzNDFWMTguOTY3MkMxMC41IDE5Ljg3NDUgOS4zODg5NCAyMC4zMTI5IDguNzY5NDIgMTkuNjVMNC4zMzE3OSAxNC45MDIxQzQuMTQyNjkgMTQuNjk5OCAzLjg3ODE2IDE0LjU4NDkgMy42MDEyMiAxNC41ODQ5SDEuNUMwLjY3MTU3MyAxNC41ODQ5IDAgMTMuOTEzNCAwIDEzLjA4NDlWNy41MDE2Wk01Ljg0OTQ1IDYuOTYwMjdDNS4yNzk1NiA3LjYyMTQzIDQuNDQ5OTcgOC4wMDE2IDMuNTc3MDkgOC4wMDE2SDJWMTIuNTg0OUgzLjYwMTIyQzQuNDMyMDMgMTIuNTg0OSA1LjIyNTY0IDEyLjkyOTUgNS43OTI5NSAxMy41MzY0TDguNSAxNi40MzI4VjMuODg1MjJMNS44NDk0NSA2Ljk2MDI3WiIgZmlsbD0iIzE2MTgyMyIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTEzLjUxNSA3LjE5MTE5QzEzLjM0MjQgNi45NzU1OSAxMy4zMzk5IDYuNjYwNTYgMTMuNTM1MiA2LjQ2NTNMMTQuMjQyMyA1Ljc1ODE5QzE0LjQzNzYgNS41NjI5MyAxNC43NTU4IDUuNTYxNzUgMTQuOTM1NiA1Ljc3MTM2QzE2Ljk5NTkgOC4xNzM2MiAxNi45OTU5IDExLjgyOCAxNC45MzU2IDE0LjIzMDNDMTQuNzU1OCAxNC40Mzk5IDE0LjQzNzYgMTQuNDM4NyAxNC4yNDIzIDE0LjI0MzVMMTMuNTM1MiAxMy41MzY0QzEzLjMzOTkgMTMuMzQxMSAxMy4zNDI0IDEzLjAyNjEgMTMuNTE1IDEyLjgxMDVDMTQuODEzIDExLjE4ODUgMTQuODEzIDguODEzMTIgMTMuNTE1IDcuMTkxMTlaIiBmaWxsPSIjMTYxODIzIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNMTYuNzE3MiAxNi43MTgzQzE2LjUyMTkgMTYuNTIzMSAxNi41MjMxIDE2LjIwNzQgMTYuNzA3MiAxNi4wMDE3QzE5LjcyNTcgMTIuNjMgMTkuNzI1NyA3LjM3MTY4IDE2LjcwNzIgNC4wMDAwMUMxNi41MjMxIDMuNzk0MjcgMTYuNTIxOSAzLjQ3ODU4IDE2LjcxNzIgMy4yODMzMkwxNy40MjQzIDIuNTc2MjFDMTcuNjE5NSAyLjM4MDk1IDE3LjkzNyAyLjM4MDIgMTguMTIzMyAyLjU4NDA4QzIxLjkwOTkgNi43MjkyNiAyMS45MDk5IDEzLjI3MjQgMTguMTIzMyAxNy40MTc2QzE3LjkzNyAxNy42MjE1IDE3LjYxOTUgMTcuNjIwNyAxNy40MjQzIDE3LjQyNTVMMTYuNzE3MiAxNi43MTgzWiIgZmlsbD0iIzE2MTgyMyIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPC9zdmc+Cg=="]')
|
699
|
+
page.click('img[src="data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjEiIGhlaWdodD0iMjAiIHZpZXdCb3g9IjAgMCAyMSAyMCIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZD0iTTAgNy41MDE2QzAgNi42NzMxNyAwLjY3MTU3MyA2LjAwMTYgMS41IDYuMDAxNkgzLjU3NzA5QzMuODY4MDUgNi4wMDE2IDQuMTQ0NTggNS44NzQ4OCA0LjMzNDU1IDUuNjU0NDlMOC43NDI1NSAwLjU0MDUyQzkuMzQ3OCAtMC4xNjE2NjggMTAuNSAwLjI2NjM3NCAxMC41IDEuMTkzNDFWMTguOTY3MkMxMC41IDE5Ljg3NDUgOS4zODg5NCAyMC4zMTI5IDguNzY5NDIgMTkuNjVMNC4zMzE3OSAxNC45MDIxQzQuMTQyNjkgMTQuNjk5OCAzLjg3ODE2IDE0LjU4NDkgMy42MDEyMiAxNC41ODQ5SDEuNUMwLjY3MTU3MyAxNC41ODQ5IDAgMTMuOTEzNCAwIDEzLjA4NDlWNy41MDE2Wk01Ljg0OTQ1IDYuOTYwMjdDNS4yNzk1NiA3LjYyMTQzIDQuNDQ5OTcgOC4wMDE2IDMuNTc3MDkgOC4wMDE2SDJWMTIuNTg0OUgzLjYwMTIyQzQuNDMyMDMgMTIuNTg0OSA1LjIyNTY0IDEyLjkyOTUgNS43OTI5NSAxMy41MzY0TDguNSAxNi40MzI4VjMuODg1MjJMNS44NDk0NSA2Ljk2MDI3WiIgZmlsbD0iIzE2MTgyMyIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPHBhdGggZD0iTTEzLjUxNSA3LjE5MTE5QzEzLjM0MjQgNi45NzU1OSAxMy4zMzk5IDYuNjYwNTYgMTMuNTM1MiA2LjQ2NTNMMTQuMjQyMyA1Ljc1ODE5QzE0LjQzNzYgNS41NjI5MyAxNC43NTU4IDUuNTYxNzUgMTQuOTM1NiA1Ljc3MTM2QzE2Ljk5NTkgOC4xNzM2MiAxNi45OTU5IDExLjgyOCAxNC45MzU2IDE0LjIzMDNDMTQuNzU1OCAxNC40Mzk5IDE0LjQzNzYgMTQuNDM4NyAxNC4yNDIzIDE0LjI0MzVMMTMuNTM1MiAxMy41MzY0QzEzLjMzOTkgMTMuMzQxMSAxMy4zNDI0IDEzLjAyNjEgMTMuNTE1IDEyLjgxMDVDMTQuODEzIDExLjE4ODUgMTQuODEzIDguODEzMTIgMTMuNTE1IDcuMTkxMTlaIiBmaWxsPSIjMTYxODIzIiBmaWxsLW9wYWNpdHk9IjAuNiIvPgo8cGF0aCBkPSJNMTYuNzE3MiAxNi43MTgzQzE2LjUyMTkgMTYuNTIzMSAxNi41MjMxIDE2LjIwNzQgMTYuNzA3MiAxNi4wMDE3QzE5LjcyNTcgMTIuNjMgMTkuNzI1NyA3LjM3MTY4IDE2LjcwNzIgNC4wMDAwMUMxNi41MjMxIDMuNzk0MjcgMTYuNTIxOSAzLjQ3ODU4IDE2LjcxNzIgMy4yODMzMkwxNy40MjQzIDIuNTc2MjFDMTcuNjE5NSAyLjM4MDk1IDE3LjkzNyAyLjM4MDIgMTguMTIzMyAyLjU4NDA4QzIxLjkwOTkgNi43MjkyNiAyMS45MDk5IDEzLjI3MjQgMTguMTIzMyAxNy40MTc2QzE3LjkzNyAxNy42MjE1IDE3LjYxOTUgMTcuNjIwNyAxNy40MjQzIDE3LjQyNTVMMTYuNzE3MiAxNi43MTgzWiIgZmlsbD0iIzE2MTgyMyIgZmlsbC1vcGFjaXR5PSIwLjYiLz4KPC9zdmc+Cg=="]')
|
700
|
+
time.sleep(0.5)
|
701
|
+
sliders = page.locator("input.scaleInput")
|
702
|
+
|
703
|
+
if sound_aud_vol == 'background':
|
704
|
+
slider1 = sliders.nth(0)
|
705
|
+
bounding_box1 = slider1.bounding_box()
|
706
|
+
if bounding_box1:
|
707
|
+
x1 = bounding_box1["x"] + (bounding_box1["width"] * 0.92)
|
708
|
+
y1 = bounding_box1["y"] + bounding_box1["height"] / 2
|
709
|
+
page.mouse.click(x1, y1)
|
710
|
+
|
711
|
+
slider2 = sliders.nth(1)
|
712
|
+
bounding_box2 = slider2.bounding_box()
|
713
|
+
if bounding_box2:
|
714
|
+
x2 = bounding_box2["x"] + (bounding_box2["width"] * 0.097)
|
715
|
+
y2 = bounding_box2["y"] + bounding_box2["height"] / 2
|
716
|
+
page.mouse.click(x2, y2)
|
717
|
+
|
718
|
+
if sound_aud_vol == 'main':
|
719
|
+
slider1 = sliders.nth(0)
|
720
|
+
bounding_box1 = slider1.bounding_box()
|
721
|
+
if bounding_box1:
|
722
|
+
x1 = bounding_box1["x"] + (bounding_box1["width"] * 0.092)
|
723
|
+
y1 = bounding_box1["y"] + bounding_box1["height"] / 2
|
724
|
+
page.mouse.click(x1, y1)
|
725
|
+
slider2 = sliders.nth(1)
|
726
|
+
bounding_box2 = slider2.bounding_box()
|
727
|
+
if bounding_box2:
|
728
|
+
x2 = bounding_box2["x"] + (bounding_box2["width"] * 0.92)
|
729
|
+
y2 = bounding_box2["y"] + bounding_box2["height"] / 2
|
730
|
+
page.mouse.click(x2, y2)
|
731
|
+
except:
|
732
|
+
sys.exit("ERROR ADJUSTING SOUND VOLUME: please try again.")
|
733
|
+
|
734
|
+
page.wait_for_selector("div.TUXButton-label:has-text('Save edit')")
|
735
|
+
page.click("div.TUXButton-label:has-text('Save edit')")
|
736
|
+
if suppressprint == False:
|
737
|
+
print("Added sound")
|
738
|
+
|
739
|
+
|
652
740
|
page.wait_for_selector('div[data-contents="true"]')
|
653
741
|
|
654
742
|
if copyrightcheck == True:
|
655
|
-
page.
|
743
|
+
page.click('div.TUXSwitch:has(label.TUXSwitch-label:has-text("Run a copyright check")) input.TUXSwitch-input')
|
656
744
|
while copyrightcheck == True:
|
657
745
|
time.sleep(0.2)
|
658
746
|
if page.locator("span", has_text="No issues detected.").is_visible():
|
@@ -699,4 +787,6 @@ def upload_tiktok(video, description, accountname, hashtags=None, sound_name=Non
|
|
699
787
|
sys.exit("ERROR UPLOADING: VIDEO HAS SAVED AS DRAFT BUT CANT UPLOAD")
|
700
788
|
time.sleep(1)
|
701
789
|
|
702
|
-
page.close()
|
790
|
+
page.close()
|
791
|
+
|
792
|
+
return "Completed"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.3
|
2
2
|
Name: tiktokautouploader
|
3
|
-
Version: 2
|
3
|
+
Version: 3.2
|
4
4
|
Summary: Upload or schedule videos to TikTok with viral TikTok sounds and hashtags.
|
5
5
|
Project-URL: Homepage, https://github.com/haziq-exe/TikTokAutoUploader
|
6
6
|
Author-email: HAZIQ <haziqmk123@gmail.com>
|
@@ -29,9 +29,8 @@ Description-Content-Type: text/markdown
|
|
29
29
|
|
30
30
|
[](https://pypi.org/project/tiktokautouploader/) [](https://opensource.org/licenses/MIT)
|
31
31
|
|
32
|
-
|
33
32
|
<p align="center">
|
34
|
-
<img src="READMEimage/
|
33
|
+
<img src="READMEimage/READMEGIF.gif" alt="" width="900"/>
|
35
34
|
</p>
|
36
35
|
|
37
36
|
## 🚀 Features
|
@@ -41,8 +40,10 @@ Description-Content-Type: text/markdown
|
|
41
40
|
- **🗓 Schedule Uploads:** Upload videos at specific times or upto 10 days in advance with our scheduling feature.
|
42
41
|
- **🔍 Copyright Check:** Ensure your video is safe from copyright claims before uploading.
|
43
42
|
- **🏷 Add Working Hashtags:** Increase your reach by adding effective hashtags that actually work.
|
44
|
-
- **⏰ Cutdown on upload time:** Upload to TikTok with way less hassle and much more speed using our library
|
43
|
+
- **⏰ Cutdown on upload time:** Upload to TikTok with way less hassle and much more speed using our library.
|
44
|
+
- **📝 Upload to different accounts:** Stay organized and on top of multiple different accounts with our multi-account functionality.
|
45
45
|
|
46
|
+
⭐️ If you like this project please feel free to star it, Thank you.
|
46
47
|
|
47
48
|
## 📦 Installation
|
48
49
|
|
@@ -52,7 +53,7 @@ Description-Content-Type: text/markdown
|
|
52
53
|
pip install tiktokautouploader
|
53
54
|
```
|
54
55
|
|
55
|
-
**NOTE:** IF YOU HAVE INSTALLED BEFORE, PLEASE MAKE SURE YOU
|
56
|
+
**NOTE:** IF YOU HAVE INSTALLED BEFORE, PLEASE MAKE SURE YOU UPGRADE TO THE LATEST VERSION.
|
56
57
|
|
57
58
|
---
|
58
59
|
|
@@ -77,7 +78,7 @@ pip install tiktokautouploader
|
|
77
78
|
## 📝 Quick-Start
|
78
79
|
|
79
80
|
**NOTE:** It is highly recommended you read DOCUMENTATION.md before using the library.
|
80
|
-
The first time you run the code, you will be prompted to log-in, this will only occur the first time the function is used. Check documentation for more info.
|
81
|
+
The first time you run the code for an account, you will be prompted to log-in, this will only occur the first time the function is used for the account. Check documentation for more info.
|
81
82
|
|
82
83
|
## Upload with hashtags
|
83
84
|
|
@@ -86,16 +87,17 @@ from tiktokautouploader import upload_tiktok
|
|
86
87
|
|
87
88
|
video_path = 'path/to/your/video.mp4'
|
88
89
|
description = 'Check out my latest TikTok video!'
|
90
|
+
accountname = 'mytiktokaccount'
|
89
91
|
hashtags = ['#fun', '#viral']
|
90
92
|
|
91
|
-
upload_tiktok(video=video_path, description=description, hashtags=hashtags)
|
93
|
+
upload_tiktok(video=video_path, description=description, accountname=accountname, hashtags=hashtags)
|
92
94
|
|
93
95
|
```
|
94
96
|
|
95
97
|
### Upload with TikTok Sound
|
96
98
|
|
97
99
|
```python
|
98
|
-
upload_tiktok(video=video_path, description=description, sound_name='trending_sound', sound_aud_vol='main')
|
100
|
+
upload_tiktok(video=video_path, description=description, accountname=accountname, sound_name='trending_sound', sound_aud_vol='main')
|
99
101
|
```
|
100
102
|
|
101
103
|
PLEASE READ DOCUMENTATION FOR MORE INFO.
|
@@ -103,7 +105,7 @@ PLEASE READ DOCUMENTATION FOR MORE INFO.
|
|
103
105
|
### Schedule an Upload
|
104
106
|
|
105
107
|
```python
|
106
|
-
upload_tiktok(video=video_path, description=description, schedule='03:10', day=11)
|
108
|
+
upload_tiktok(video=video_path, description=description, accountname=accountname, schedule='03:10', day=11)
|
107
109
|
```
|
108
110
|
|
109
111
|
PLEASE READ DOCUMENTATION FOR MORE INFO
|
@@ -111,16 +113,17 @@ PLEASE READ DOCUMENTATION FOR MORE INFO
|
|
111
113
|
### Perform Copyright Check Before Uploading
|
112
114
|
|
113
115
|
```python
|
114
|
-
upload_tiktok(video=video_path, description=description, hashtags=hashtags, copyrightcheck=True)
|
116
|
+
upload_tiktok(video=video_path, description=description, accountname=accountname, hashtags=hashtags, copyrightcheck=True)
|
115
117
|
```
|
116
118
|
|
117
119
|
## 🎯 Why Choose `autotiktokuploader`?
|
118
120
|
|
119
121
|
- **No more captchas:** Fully automated uploads without interruptions, If captchas do show up, no worries, they will be solved. (read documentation for more info)
|
120
|
-
- **Maximize your reach:** Add popular sounds and effective hashtags that work to boost visibility
|
122
|
+
- **Maximize your reach:** Add popular sounds and effective hashtags that work to boost visibility and go viral!
|
121
123
|
- **Stay compliant:** Built-in copyright checks to avoid unforeseen takedowns.
|
122
|
-
- **Convenient scheduling:** Post at the right time, even when you're away
|
124
|
+
- **Convenient scheduling:** Post at the right time, even when you're away!
|
123
125
|
- **Much faster than manually uploading:** Drastically reduce the time you need to upload videos, just click one button and be done much quicker!
|
126
|
+
- **Upload to different account:** Stay on top of all your TikTok accounts with our multi-account functionality!
|
124
127
|
|
125
128
|
## 🛠 Dependencies
|
126
129
|
|
@@ -141,4 +144,10 @@ Created by **Haziq**. Feel free to reach out at [haziqmk123@gmail.com](mailto:ha
|
|
141
144
|
## 📄 License
|
142
145
|
|
143
146
|
This project is licensed under the MIT License. See the [LICENSE](LICENSE.md) file for details.
|
144
|
-
|
147
|
+
|
148
|
+
## 📮 Related Projects
|
149
|
+
|
150
|
+
If you liked this project please check out my use case showcase project that generates TikToks and uploads them using 'tiktokautouploader'
|
151
|
+
|
152
|
+
[TikTokGenerator](https://github.com/haziq-exe/TikTokGenerator)
|
153
|
+
|
@@ -0,0 +1,7 @@
|
|
1
|
+
tiktokautouploader/__init__.py,sha256=u7OWCK_u68ST8dfrkSF4Yw44CJOzV9NXI6ASRuoDfmE,64
|
2
|
+
tiktokautouploader/function.py,sha256=m7ynv_zKtac1-wRSK2hndxevh1mUJCb0KZx8oFObz1c,44875
|
3
|
+
tiktokautouploader/Js_assets/login.js,sha256=SLhtPYo8ZfTRUnbR7Xqp084lSuAOqIWUxi75FlFH3vs,966
|
4
|
+
tiktokautouploader-3.2.dist-info/METADATA,sha256=kVxGqGPeVhibiiHayhz1KRRjMfbIyQ2yBvMAmL73zUg,6161
|
5
|
+
tiktokautouploader-3.2.dist-info/WHEEL,sha256=fl6v0VwpzfGBVsGtkAkhILUlJxROXbA3HvRL6Fe3140,105
|
6
|
+
tiktokautouploader-3.2.dist-info/licenses/LICENSE.md,sha256=hYds_VJIpnS5gC73WhuWk2IY_e9BWjuEJthQCb9ThyU,1073
|
7
|
+
tiktokautouploader-3.2.dist-info/RECORD,,
|
@@ -1,7 +0,0 @@
|
|
1
|
-
tiktokautouploader/__init__.py,sha256=u7OWCK_u68ST8dfrkSF4Yw44CJOzV9NXI6ASRuoDfmE,64
|
2
|
-
tiktokautouploader/function.py,sha256=wUI4r8dPIj6eSyi2WvBFJHb3zYyNAPonw_xrrMtJvBQ,35203
|
3
|
-
tiktokautouploader/Js_assets/login.js,sha256=SLhtPYo8ZfTRUnbR7Xqp084lSuAOqIWUxi75FlFH3vs,966
|
4
|
-
tiktokautouploader-2.98.dist-info/METADATA,sha256=NXjc7EasXewxxIrnTJSb295_-UD9Q4-AcA5aKy5Jt98,5464
|
5
|
-
tiktokautouploader-2.98.dist-info/WHEEL,sha256=fl6v0VwpzfGBVsGtkAkhILUlJxROXbA3HvRL6Fe3140,105
|
6
|
-
tiktokautouploader-2.98.dist-info/licenses/LICENSE.md,sha256=hYds_VJIpnS5gC73WhuWk2IY_e9BWjuEJthQCb9ThyU,1073
|
7
|
-
tiktokautouploader-2.98.dist-info/RECORD,,
|
File without changes
|
File without changes
|