Giter Club home page Giter Club logo

Comments (25)

piriyaraj avatar piriyaraj commented on May 26, 2024 1

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.

brunoschalch avatar brunoschalch commented on May 26, 2024 1

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.

Bendrift22 avatar Bendrift22 commented on May 26, 2024 1

thanks !

from tiktok-uploader.

starcrime33 avatar starcrime33 commented on May 26, 2024

same problem, they change I guess

from tiktok-uploader.

Dwilem avatar Dwilem commented on May 26, 2024

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.

KundKMC avatar KundKMC commented on May 26, 2024

Can we fix this in the code and do another pull request?

from tiktok-uploader.

StanleyHuang123 avatar StanleyHuang123 commented on May 26, 2024

Same problem here. Anyone knows how to fix it?

from tiktok-uploader.

neves8232 avatar neves8232 commented on May 26, 2024

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.

Bendrift22 avatar Bendrift22 commented on May 26, 2024

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.

prioa avatar prioa commented on May 26, 2024

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.

nanoguy0 avatar nanoguy0 commented on May 26, 2024

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.

JoonyWoony avatar JoonyWoony commented on May 26, 2024

right, it just times out for a while and exits ig.
For me it dosen't even upload ha.

from tiktok-uploader.

JoonyWoony avatar JoonyWoony commented on May 26, 2024

@nanoguy0 you said you figured out how to upload the video still, after timeout right?

from tiktok-uploader.

nanoguy0 avatar nanoguy0 commented on May 26, 2024

@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 avatar JoonyWoony commented on May 26, 2024

@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.

nanoguy0 avatar nanoguy0 commented on May 26, 2024

@JoonyWoony

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.

JoonyWoony avatar JoonyWoony commented on May 26, 2024

@JoonyWoony

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.

JoonyWoony avatar JoonyWoony commented on May 26, 2024

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.

nanoguy0 avatar nanoguy0 commented on May 26, 2024

@JoonyWoony

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.

JoonyWoony avatar JoonyWoony commented on May 26, 2024

@JoonyWoony

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.

nanoguy0 avatar nanoguy0 commented on May 26, 2024

@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 avatar JoonyWoony commented on May 26, 2024

@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.

JoonyWoony avatar JoonyWoony commented on May 26, 2024

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.

deploy010101 avatar deploy010101 commented on May 26, 2024

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.

wkaisertexas avatar wkaisertexas commented on May 26, 2024

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)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo 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.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.