Comments (25)
yes
in the config.toml file
change line 21
upload = "https://www.tiktok.com/upload?lang=en"
to
upload = "https://www.tiktok.com/creator-center/upload?lang=en"
from tiktok-uploader.
Same problem here! As mentioned by piriyaraj@, looks like tiktok is force redirecting from "https://www.tiktok.com/upload?lang=en" to the new Creator Center Beta "https://www.tiktok.com/creator-center/upload?lang=en".
Happy to send the PR if this change seems safe.
from tiktok-uploader.
thanks !
from tiktok-uploader.
same problem, they change I guess
from tiktok-uploader.
Yes, I had same problem. It happend because they addded new editing feature and whenever you upload video it suggests it and doesn't allow to click "Post" button unless you click "Not now".
from tiktok-uploader.
Can we fix this in the code and do another pull request?
from tiktok-uploader.
Same problem here. Anyone knows how to fix it?
from tiktok-uploader.
I'm having a problem where I go to "https://www.tiktok.com/upload?lang=en" but the page stays at "pt-BR", has someone got a work around ?
from tiktok-uploader.
Even after changing the url i'm stuck on the upload page with the video uploaded and title filled and i have this error :
Message: no such element: Unable to locate element: {"method":"xpath","selector":"//input[@type='file']"}
(Session info: chrome=117.0.5938.92); For documentation on this error, please visit: https://www.selenium.dev/documentation/webdriver/troubleshooting/errors#no-such-element-exception
Stacktrace:
#0 0x55b28ab916b3
#1 0x55b28a8671e7
#2 0x55b28a8ae566
#3 0x55b28a8ae651
#4 0x55b28a8eba74
#5 0x55b28a8d00ed
#6 0x55b28a8e9322
#7 0x55b28a8cfe93
#8 0x55b28a8a2934
#9 0x55b28a8a371e
#10 0x55b28ab56cb8
#11 0x55b28ab5abf0
#12 0x55b28ab6519c
#13 0x55b28ab5b808
#14 0x55b28ab2827f
#15 0x55b28ab7fe88
#16 0x55b28ab80059
#17 0x55b28ab90843
#18 0x7fb09a294b43
[14:14:25] Failed to upload /test.mp4
[14:14:25]
A video failed to upload
from tiktok-uploader.
had the same problem. change upload.py to the following to fix it.
please let me know if it worked for you as well :)
`tiktok_uploader` module for uploading videos to TikTok
Key Functions
-------------
upload_video : Uploads a single TikTok video
upload_videos : Uploads multiple TikTok videos
"""
from os.path import abspath, exists
from typing import List
import time
import traceback
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import TimeoutException, NoSuchElementException, WebDriverException
from tiktok_uploader.browsers import get_browser
from tiktok_uploader.auth import AuthBackend
from tiktok_uploader import config, logger
from tiktok_uploader.utils import bold, green
import logging
# Logging-Konfiguration
logging.basicConfig(filename='tiktok_uploader.log', level=logging.DEBUG)
def upload_video(filename=None, description='', username='',
password='', cookies='', sessionid=None, cookies_list=None, *args, **kwargs):
"""
Uploads a single TikTok video.
Conder using `upload_videos` if using multiple videos
Parameters
----------
filename : str
The path to the video to upload
description : str
The description to set for the video
cookies : str
The cookies to use for uploading
sessionid: str
The `sessionid` is the only required cookie for uploading,
but it is recommended to use all cookies to avoid detection
"""
auth = AuthBackend(username=username, password=password, cookies=cookies,
cookies_list=cookies_list, sessionid=sessionid)
return upload_videos(
videos=[ { 'path': filename, 'description': description } ],
auth=auth,
*args, **kwargs
)
def upload_videos(videos: list = None, auth: AuthBackend = None, browser='chrome',
browser_agent=None, on_complete=None, headless=False, num_retires : int = 1, *args, **kwargs):
"""
Uploads multiple videos to TikTok
Parameters
----------
videos : list
A list of dictionaries containing the video's ('path') and description ('description')
browser : str
The browser to use for uploading
browser_agent : selenium.webdriver
A selenium webdriver object to use for uploading
on_complete : function
A function to call when the upload is complete
headless : bool
Whether or not the browser should be run in headless mode
num_retries : int
The number of retries to attempt if the upload fails
options : SeleniumOptions
The options to pass into the browser -> custom privacy settings, etc.
*args :
Additional arguments to pass into the upload function
**kwargs :
Additional keyword arguments to pass into the upload function
Returns
-------
failed : list
A list of videos which failed to upload
"""
videos = _convert_videos_dict(videos)
if videos and len(videos) > 1:
logger.debug("Uploading %d videos", len(videos))
if not browser_agent: # user-specified browser agent
logger.debug('Create a %s browser instance %s', browser,
'in headless mode' if headless else '')
driver = get_browser(name=browser, headless=headless, *args, **kwargs)
else:
logger.debug('Using user-defined browser agent')
driver = browser_agent
driver = auth.authenticate_agent(driver)
failed = []
# uploads each video
for video in videos:
try:
path = abspath(video.get('path'))
description = video.get('description', '')
logger.debug('Posting %s%s', bold(video.get('path')),
f'\n{" " * 15}with description: {bold(description)}' if description else '')
# Video must be of supported type
if not _check_valid_path(path):
print(f'{path} is invalid, skipping')
failed.append(video)
continue
complete_upload_form(driver, path, description,
num_retires = num_retires, headless=headless,
*args, **kwargs)
except Exception as exception:
logger.error('Failed to upload %s', path)
logger.error(exception)
failed.append(video)
if on_complete is callable: # calls the user-specified on-complete function
on_complete(video)
if config['quit_on_end']:
driver.quit()
return failed
def complete_upload_form(driver, path: str, description: str, headless=False, *args, **kwargs) -> None:
"""
Actually uploades each video
Parameters
----------
driver : selenium.webdriver
The selenium webdriver to use for uploading
path : str
The path to the video to upload
"""
logging.info("Navigating to upload page...")
_go_to_upload(driver)
logging.info("Setting video...")
_set_video(driver, path=path, **kwargs)
logging.info("Setting interactivity...")
_set_interactivity(driver, **kwargs)
logging.info("Setting description...")
_set_description(driver, description)
logging.info("Posting video...")
_post_video(driver)
def _go_to_upload(driver) -> None:
print("Inside _go_to_upload function...")
"""
Navigates to the upload page, switches to the iframe and waits for it to load
Parameters
----------
driver : selenium.webdriver
"""
logger.debug(green('Navigating to upload page'))
driver.get(config['paths']['upload'])
# changes to the iframe
iframe_selector = EC.presence_of_element_located(
(By.XPATH, config['selectors']['upload']['iframe'])
)
iframe = WebDriverWait(driver, config['explicit_wait']).until(iframe_selector)
driver.switch_to.frame(iframe)
# waits for the iframe to load
root_selector = EC.presence_of_element_located((By.ID, 'root'))
WebDriverWait(driver, config['explicit_wait']).until(root_selector)
def _set_description(driver, description: str) -> None:
print("Inside _set_description function...")
"""
Sets the description of the video
Parameters
----------
driver : selenium.webdriver
description : str
The description to set
"""
if description is None:
# if no description is provided, filename
return
logger.debug(green('Setting description'))
saved_description = description # save the description in case it fails
desc = driver.find_element(By.XPATH, config['selectors']['upload']['description'])
# desc populates with filename before clearing
WebDriverWait(driver, config['explicit_wait']).until(lambda driver: desc.text != '')
_clear(desc)
try:
while description:
nearest_mention = description.find('@')
nearest_hash = description.find('#')
if nearest_mention == 0 or nearest_hash == 0:
desc.send_keys('@' if nearest_mention == 0 else '#')
# wait for the frames to load
time.sleep(config['implicit_wait'])
name = description[1:].split(' ')[0]
if nearest_mention == 0: # @ case
mention_xpath = config['selectors']['upload']['mention_box']
condition = EC.presence_of_element_located((By.XPATH, mention_xpath))
mention_box = WebDriverWait(driver, config['explicit_wait']).until(condition)
mention_box.send_keys(name)
else:
desc.send_keys(name)
time.sleep(config['implicit_wait'])
if nearest_mention == 0: # @ case
mention_xpath = config['selectors']['upload']['mentions'].format('@' + name)
condition = EC.presence_of_element_located((By.XPATH, mention_xpath))
else:
hashtag_xpath = config['selectors']['upload']['hashtags'].format(name)
condition = EC.presence_of_element_located((By.XPATH, hashtag_xpath))
elem = WebDriverWait(driver, config['explicit_wait']).until(condition)
ActionChains(driver).move_to_element(elem).click(elem).perform()
description = description[len(name) + 2:]
else:
min_index = _get_splice_index(nearest_mention, nearest_hash, description)
desc.send_keys(description[:min_index])
description = description[min_index:]
except Exception as exception:
print('Failed to set description: ', exception)
_clear(desc)
desc.send_keys(saved_description) # if fail, use saved description
def _clear(element) -> None:
print("Clearing element...")
"""
Clears the text of the element (an issue with the TikTok website when automating)
Parameters
----------
element
The text box to clear
"""
element.send_keys(2 * len(element.text) * Keys.BACKSPACE)
def _set_video(driver, path: str = '', num_retries: int = 3, **kwargs) -> None:
"""
Sets the video to upload
Parameters
----------
driver : selenium.webdriver
path : str
The path to the video to upload
num_retries : number of retries (can occasionally fail)
"""
# uploads the element
logger.debug(green('Uploading video file'))
for _ in range(num_retries):
try:
driver.execute_script("document.body.style.zoom='50%'")
# Wait for the upload box to be present using class name
upload_box = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, config['selectors']['upload']['upload_video']))
)
print("send file")
upload_box.send_keys(path)
print("file sent, wait for upload")
# waits for the upload progress by checking the disabled attribute of the button
post_button = WebDriverWait(driver, config['explicit_wait']).until(
EC.presence_of_element_located((By.CLASS_NAME, "css-y1m958"))
)
while post_button.get_attribute("disabled"):
time.sleep(1) # Wait for a second and then check again
print("wait for upload")
# waits for the video to upload
upload_confirmation = EC.presence_of_element_located(
(By.XPATH, config['selectors']['upload']['upload_confirmation'])
)
# NOTE (IMPORTANT): implicit wait as video should already be uploaded if not failed
# An exception throw here means the video failed to upload and a retry is needed
WebDriverWait(driver, config['implicit_wait']).until(upload_confirmation)
# wait until a non-draggable image is found
process_confirmation = EC.presence_of_element_located(
(By.XPATH, config['selectors']['upload']['process_confirmation'])
)
WebDriverWait(driver, config['explicit_wait']).until(process_confirmation)
return
except TimeoutException as te:
print("Timeout Exception on attempt {}: ".format(_), te)
except NoSuchElementException as nse:
print("No Such Element Exception on attempt {}: ".format(_), nse)
except WebDriverException as wde:
print("Web Driver Exception on attempt {}: ".format(_), wde)
except Exception as exception:
print("General Exception on attempt {}: ".format(_), exception)
raise FailedToUpload()
def _set_interactivity(driver, comment=True, stitch=True, duet=True, *args, **kwargs) -> None:
print("Inside _set_interactivity function...")
"""
Sets the interactivity settings of the video
Parameters
----------
driver : selenium.webdriver
comment : bool
Whether or not to allow comments
stitch : bool
Whether or not to allow stitching
duet : bool
Whether or not to allow duets
"""
try:
logger.debug(green('Setting interactivity settings'))
comment_box = driver.find_element(By.XPATH, config['selectors']['upload']['comment'])
stitch_box = driver.find_element(By.XPATH, config['selectors']['upload']['stitch'])
duet_box = driver.find_element(By.XPATH, config['selectors']['upload']['duet'])
# xor the current state with the desired state
if comment ^ comment_box.is_selected():
comment_box.click()
if stitch ^ stitch_box.is_selected():
stitch_box.click()
if duet ^ duet_box.is_selected():
duet_box.click()
except Exception as _:
logger.error('Failed to set interactivity settings')
def _post_video(driver) -> None:
print("Inside _post_video function...")
"""
Posts the video by clicking the post button
Parameters
----------
driver : selenium.webdriver
"""
try:
logger.debug(green('Starting the video posting process...'))
# Taking initial screenshot
logger.debug(green('Screenshot saved as screenie_before_click.png'))
# Trying to locate the post button
logger.debug(green('Attempting to locate the post button...'))
post = WebDriverWait(driver, config['explicit_wait']).until(
EC.presence_of_element_located((By.CLASS_NAME, "css-y1m958"))
)
logger.debug(green('Post button located successfully!'))
# Clicking the post button
driver.execute_script("arguments[0].click();", post)
logger.debug(green('Clicked the post button'))
# Taking screenshot after clicking the post button
logger.debug(green('Screenshot saved as screenie_after_click.png'))
# Waiting for the video to upload
logger.debug(green('Waiting for the video to upload...'))
post_confirmation = EC.presence_of_element_located(
(By.XPATH, config['selectors']['upload']['post_confirmation'])
)
WebDriverWait(driver, config['explicit_wait']).until(post_confirmation)
logger.debug(green('Video posted successfully'))
except Exception as e:
logger.debug(green('Error screenshot saved as error_screenshot.png'))
# HELPERS
def _check_valid_path(path: str) -> bool:
"""
Returns whether or not the filetype is supported by TikTok
"""
return exists(path) and path.split('.')[-1] in config['supported_file_types']
def _get_splice_index(nearest_mention: int, nearest_hashtag: int, description: str) -> int:
"""
Returns the index to splice the description at
Parameters
----------
nearest_mention : int
The index of the nearest mention
nearest_hashtag : int
The index of the nearest hashtag
Returns
-------
int
The index to splice the description at
"""
if nearest_mention == -1 and nearest_hashtag == -1:
return len(description)
elif nearest_hashtag == -1:
return nearest_mention
elif nearest_mention == -1:
return nearest_hashtag
else:
return min(nearest_mention, nearest_hashtag)
def _convert_videos_dict(videos_list_of_dictionaries) -> List:
"""
Takes in a videos dictionary and converts it.
This allows the user to use the wrong stuff and thing to just work
"""
if not videos_list_of_dictionaries:
raise RuntimeError("No videos to upload")
valid_path = config['valid_path_names']
valid_description = config['valid_descriptions']
correct_path = valid_path[0]
correct_description = valid_description[0]
def intersection(lst1, lst2):
""" return the intersection of two lists """
return list(set(lst1) & set(lst2))
return_list = []
for elem in videos_list_of_dictionaries:
# preprocesses the dictionary
elem = {k.strip().lower(): v for k, v in elem.items()}
keys = elem.keys()
path_intersection = intersection(valid_path, keys)
description_interesection = intersection(valid_description, keys)
if path_intersection:
# we have a path
path = elem[path_intersection.pop()]
if not _check_valid_path(path):
raise RuntimeError("Invalid path: " + path)
elem[correct_path] = path
else:
# iterates over the elem and find a key which is a path with a valid extension
for _, value in elem.items():
if _check_valid_path(value):
elem[correct_path] = value
break
else:
# no valid path found
raise RuntimeError("Path not found in dictionary: " + str(elem))
if description_interesection:
# we have a description
elem[correct_description] = elem[description_interesection.pop()]
else:
# iterates over the elem and finds a description which is not a valid path
for _, value in elem.items():
if not _check_valid_path(value):
elem[correct_description] = value
break
else:
elem[correct_description] = '' # null description is fine
return_list.append(elem)
return return_list
class DescriptionTooLong(Exception):
"""
A video description longer than the maximum allowed by TikTok's website (not app) uploader
"""
def __init__(self, message=None):
super().__init__(message or self.__doc__)
class FailedToUpload(Exception):
"""
A video failed to upload
"""
def __init__(self, message=None):
super().__init__(message or self.__doc__)
from tiktok-uploader.
I'm not too sure because I haven't done a ton of testing, but they may have changed the post video upload as well. I am noticing it just hangs after the upload. Not a big problem because the video is already uploaded, just waits until the timeout.
In the config.toml file:
post_confirmation = "//div[.='Your videos are being uploaded to TikTok!']"
I tried the following, but i couldn't get it to work:
post_confirmation = "//div[.='Your video is being uploaded to TikTok!']"
post_confirmation = "//div[.='Manage your posts']"
I was only uploading a single video though.
from tiktok-uploader.
right, it just times out for a while and exits ig.
For me it dosen't even upload ha.
from tiktok-uploader.
@nanoguy0 you said you figured out how to upload the video still, after timeout right?
from tiktok-uploader.
@JoonyWoony Yes, I was able to upload several times. So the video uploads, but hangs on the end screen waiting for confirmation that the upload has been completed. You can see this when you turn off headless. All I did was what was follow what was said earlier. The problem is after it clicks the upload button, what is odd is that I've noticed that TikTok may include the "Your video is being uploaded to TikTok!" and "Your videos are being uploaded to TikTok!". I have seen both, as a result the xpath selector post_confirmation in config.toml hangs. If you are still having trouble try firefox, it gave me less trouble.
What do you see if you turn off headless? Does it log in and get to the upload page?
from tiktok-uploader.
@JoonyWoony Yes, I was able to upload several times. So the video uploads, but hangs on the end screen waiting for confirmation that the upload has been completed. You can see this when you turn off headless. All I did was what was follow what was said earlier. The problem is after it clicks the upload button, what is odd is that I've noticed that TikTok may include the "Your video is being uploaded to TikTok!" and "Your videos are being uploaded to TikTok!". I have seen both, as a result the xpath selector post_confirmation in config.toml hangs. If you are still having trouble try firefox, it gave me less trouble.
What do you see if you turn off headless? Does it log in and get to the upload page?
Right, I use headless off on default, and for me it just uploads the video and waits a few mins then closes (my wifi is slow). But now another problem; is it possible to have multiple account/cookies uploading a video at the same time? Od it it limited to only 1?
from tiktok-uploader.
Right, I use headless off on default, and for me it just uploads the video and waits a few mins then closes (my wifi is slow). But now another problem; is it possible to have multiple account/cookies uploading a video at the same time? Od it it limited to only 1?
So it is uploading the video? Or is like getting stuck at 100% but not uploading. I've noticed that TikTok sometimes does that like it has the account on cooldown where it can't upload a video, in order to fix that I either wait like 10 minutes or relog in and get a new cookies.txt file. (Honestly a ton of my problems I have get solved by doing this)
I see no reason why you couldn't upload from multiple accounts, I saw on reddit that TikTok allows same IP uploads, although I'd recommend using the proxy so that you aren't uploading from the same IP. You would just have to spin up a thread to do it, since each selenium session is incognito by default. I don't think there is a feature to do that with the library but just call it twice.
--- 10 minutes later
I just tested it, looks like you do have to use some sort of proxy because TikTok was being difficult uploading. I did get it to work, and it was quite fast actually. Faster than when I don't use proxies to upload.
Make sure you DO NOT sign out when you get the cookies.txt for both accounts, otherwise that would make the cookies.txt you just got invalid.
# run two uploads at the same time
from tiktok_uploader.upload import upload_video
from concurrent.futures import ProcessPoolExecutor
HEADLESS = True
BROWSER = 'chrome' # have to use for proxies
videos = [
{
'cookies': './cookies_1.txt', # first account
'video': './path/to/first/video.mp4',
'description': "First description",
'proxy': { 'user': '', 'pass': '', 'host': '', 'port': ''}
},
{
'cookies': './cookies_2.txt', # second account
'video': './path/to/second/video.mp4',
'description': 'Second description',
'proxy': { 'user': '', 'pass': '', 'host': '', 'port': ''}
}
]
def upload_video_task(video):
try:
print(f"Starting upload for {video['video']}")
upload_video(video['video'], description=video['description'], cookies=video['cookies'], proxy=video['proxy'],browser=BROWSER, headless=HEADLESS)
print(f"Finished upload for {video['video']}")
except Exception as e:
print(f"Failed to upload {video['video']} with error {e}")
if __name__ == '__main__':
# using process pool executor since its cpu bound
with ProcessPoolExecutor() as executor:
executor.map(upload_video_task, videos)
In terms of getting your own proxy, while I can't vouch for the safety of them, if you do need some, I have been using webshare (referral link) for awhile. You get 10 free proxies just by signing up so its good to test.
from tiktok-uploader.
Right, I use headless off on default, and for me it just uploads the video and waits a few mins then closes (my wifi is slow). But now another problem; is it possible to have multiple account/cookies uploading a video at the same time? Od it it limited to only 1?
So it is uploading the video? Or is like getting stuck at 100% but not uploading. I've noticed that TikTok sometimes does that like it has the account on cooldown where it can't upload a video, in order to fix that I either wait like 10 minutes or relog in and get a new cookies.txt file. (Honestly a ton of my problems I have get solved by doing this)
I see no reason why you couldn't upload from multiple accounts, I saw on reddit that TikTok allows same IP uploads, although I'd recommend using the proxy so that you aren't uploading from the same IP. You would just have to spin up a thread to do it, since each selenium session is incognito by default. I don't think there is a feature to do that with the library but just call it twice.
--- 10 minutes later
I just tested it, looks like you do have to use some sort of proxy because TikTok was being difficult uploading. I did get it to work, and it was quite fast actually. Faster than when I don't use proxies to upload.
Make sure you DO NOT sign out when you get the cookies.txt for both accounts, otherwise that would make the cookies.txt you just got invalid.
# run two uploads at the same time from tiktok_uploader.upload import upload_video from concurrent.futures import ProcessPoolExecutor HEADLESS = True BROWSER = 'chrome' # have to use for proxies videos = [ { 'cookies': './cookies_1.txt', # first account 'video': './path/to/first/video.mp4', 'description': "First description", 'proxy': { 'user': '', 'pass': '', 'host': '', 'port': ''} }, { 'cookies': './cookies_2.txt', # second account 'video': './path/to/second/video.mp4', 'description': 'Second description', 'proxy': { 'user': '', 'pass': '', 'host': '', 'port': ''} } ] def upload_video_task(video): try: print(f"Starting upload for {video['video']}") upload_video(video['video'], description=video['description'], cookies=video['cookies'], proxy=video['proxy'],browser=BROWSER, headless=HEADLESS) print(f"Finished upload for {video['video']}") except Exception as e: print(f"Failed to upload {video['video']} with error {e}") if __name__ == '__main__': # using process pool executor since its cpu bound with ProcessPoolExecutor() as executor: executor.map(upload_video_task, videos)In terms of getting your own proxy, while I can't vouch for the safety of them, if you do need some, I have been using webshare (referral link) for awhile. You get 10 free proxies just by signing up so its good to test.
Wow... Nice job, have a little problem here tho, you can only use proxies on chrome and # do not work on chrome.
from tiktok-uploader.
Another question; about the cookies part I found out that if u log out ur cookie goes invalid, but then how do we have multiple cookies running (since to do this I would be unable to log out on the current account)!
I've tried using incognito but due to little testing I didn't know whether it worked or not. let me know!
from tiktok-uploader.
Responding to both your questions:
Testing the tag problem you mentioned. Looks like a timing problem. Might do a PR if I manage to figure out what's wrong.
You are right, as I mentioned earlier signing out will void the cookies.txt that's because when you click the sign out their auth manager voids the session, should be no problem if you use incognito and not click sign out. Could also use a different browser, different computer, there's really multiple ways to get the cookies.txt without signing out. Personally I used incognito and it works.
from tiktok-uploader.
Responding to both your questions:
Testing the tag problem you mentioned. Looks like a timing problem. Might do a PR if I manage to figure out what's wrong.
You are right, as I mentioned earlier signing out will void the cookies.txt that's because when you click the sign out their auth manager voids the session, should be no problem if you use incognito and not click sign out. Could also use a different browser, different computer, there's really multiple ways to get the cookies.txt without signing out. Personally I used incognito and it works.
Great! Seems to work on my side as well
.. now I switched to chrome because hashtags started working again??? I have no idea... but now proxies dont work for me. Like you linked me before, I used those proxies and filled out credentials. Am I doing something wrong..?
from tiktok-uploader.
@JoonyWoony Sorry, Can you elaborate? Are you getting an error? Are you using US proxies? Please provide more info on what you mean, thanks!
from tiktok-uploader.
@JoonyWoony Sorry, Can you elaborate? Are you getting an error? Are you using US proxies? Please provide more info on what you mean, thanks!
Im using the 10 free proxies they give me, and I check the bandwidth usage, and it is not being changed, meaning the proxies aren't being used, despite the fact that correct credentials are inserted into the proxy dict in the python script.
from tiktok-uploader.
Right, I lied I think the proxies are working, another issue has occured tho, hashtags are way too slow, and for upload_videos function, this program crashes with this error:
For upload_videos function, 1 video is uploaded then this error is triggered, and then crashes.
[20:27:34] Failed to upload C:\Users\joonp\OneDrive\Pictures\Documents\tiktok shit\video.mov
[20:27:34] Alert Text: {Alert text :
Message: unexpected alert open: {Alert text : }
from tiktok-uploader.
Right, I lied I think the proxies are working, another issue has occured tho, hashtags are way too slow, and for upload_videos function, this program crashes with this error:
For upload_videos function, 1 video is uploaded then this error is triggered, and then crashes.
[20:27:34] Failed to upload C:\Users\joonp\OneDrive\Pictures\Documents\tiktok shit\video.mov [20:27:34] Alert Text: {Alert text : Message: unexpected alert open: {Alert text : }
Hello @JoonyWoony, I think I'm having the same issue you described. any luck finding a solution??
from tiktok-uploader.
Multiple accounts work. However, signing out of an account invalidates the cookies for that session (or accelerates their invalidation). Using different browsers is how I was able to get around this.
from tiktok-uploader.
Related Issues (20)
- Failed to upload HOT 5
- Multiple Account - Cookies HOT 2
- Error when running script with my cookies HOT 2
- FYP - Zero Viewers HOT 1
- CLI schedule error :( HOT 1
- Schedule switch id is changing HOT 1
- Failed to upload HOT 9
- Schedule and upload not work HOT 4
- Elelment not Found HOT 2
- The application is great, can you add an option to select affiliate products? HOT 1
- The issue of configuring proxy for Firefox HOT 3
- Low views with uploader. HOT 7
- Upload Button Not being Pressed HOT 1
- TikTok-Uploader Not Pressing Upload/ Error Uploading HOT 5
- Error while uploading video
- Solve the problem of 0 views HOT 9
- IT doesn't post at the end HOT 6
- Video uploaded successfully but does not appear in profile HOT 3
- How to start it? HOT 2
- video with description failed
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from tiktok-uploader.