Перейти к содержимому


До конца распродажи:
Фотография

Рабочий скрипт по автозаливу python видео shorts

Форум ZiSMO.biz
youtube shorts python
2
Сообщений в теме: 2

OFFLINE Отправлено

prostozor
Активный
  • Онлайн:8д 7ч 36м
21
увидел тему с нерабочим скриптом. Переписал, сейчас должен работать. Если будут ошибки, то скидывайте, постараюсь пофиксить
Также подписывайтесь в ТГ канал, тут стараемся обсуждать ютубчик - Ссылка
P.S. если ошибки, пробуйте установить либы
P.S.S. тяжелые видосы / слабый интернет - пробуйте увеличить знаечения timeout
import requests
import json
import pyppeteer
import asyncio
from tqdm import tqdm

from os import listdir
from os.path import isfile, join, abspath

username = 'логин долфин'
password = 'пасс долфин'
host = '127.0.0.1'
videos_dir = r'папка с видосами'
titles_path = r'путь до названий'
comments_path = r'путь до комментов'


def get_token():
    login_url = "https://anty-api.com/auth/login"
    payload = f'username={username}&password={password}'
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded'
    }
    response = requests.post(login_url, headers=headers, data=payload)
    token = json.loads(response.text)['token']
    print(f'Your token: {token}')
    return token


def get_browser_profiles(token):
    profiles_url = "https://anty-api.com/browser_profiles"

    payload = 'username=motojo6085%40ploneix.com&password=7313ivan'
    headers = {
        'Authorization': f'Bearer {token}',
        'Content-Type': 'application/x-www-form-urlencoded'
    }

    response = requests.get(profiles_url, headers=headers, data=payload)
    browser_profile = json.loads(response.text)['data'][0]['id']
    print(f'Your browser profile: {browser_profile}')
    return browser_profile


def start_browser(browser_id):
    try:
        start_url = f'http://localhost:3001/v1.0/browser_profiles/{browser_id}/start?automation=1'
        response = requests.get(start_url)
        port = json.loads(response.text)['automation']['port']
        ws_endpoint = json.loads(response.text)['automation']['wsEndpoint']
        return port, ws_endpoint
    except Exception as ex:
        print(f'\033[31mProfile ID {browser_id} already running, close it')


def stop_browser(browser_id):
    stop_url = f'http://localhost:3001/v1.0/browser_profiles/{browser_id}/stop'
    response = requests.get(stop_url)
    print(f'Finish Profile {browser_id}')


async def deploy(port, ws_endpoint, data):
    global page
    browser = await pyppeteer.connect(browserWSEndpoint=f'ws://{host}:{str(port) + ws_endpoint}', defaultViewport=None)
    page = await browser.newPage()
    for d in tqdm(data):
        response = await page.goto('https://studio.youtube.com/', timeout=30000)
        if response.status not in [200, 302]:
            print(f'\nAttempt to reconnect...')
            for i in range(5):
                print(f'\nFailed to navigate to page https://studio.youtube.com/ (Attempt {i + 1})')
                response = await page.goto('https://studio.youtube.com/', timeout=30000)
                if response.status == 200 or response.status == 302:
                    break

        await asyncio.sleep(5)
        print("step1")
        await page.waitForXPath('//ytcp-button[@id="create-icon"]//tp-yt-iron-icon[1]', timeout=30000)
        create_btn = await page.xpath('//ytcp-button[@id="create-icon"]//tp-yt-iron-icon[1]')
        await create_btn[0].click()
        print("step2")
        await page.waitForXPath('//yt-formatted-string[@class="item-text style-scope ytcp-text-menu"]', timeout=30000)
        add_video_btn = await page.xpath('//yt-formatted-string[@class="item-text style-scope ytcp-text-menu"]')
        await add_video_btn[0].click()
        print("step3")
        await page.waitForXPath('//input[@type="file"]', timeout=30000)
        input_form = await page.xpath('//input[@type="file"]')
        await input_form[0].uploadFile(d[0])
        print("step4")
        await page.waitForSelector('#textbox', timeout=30000)
        await asyncio.sleep(6)
        await page.type(selector='#textbox', text=d[1])
        print("step5")
        await page.waitForXPath('//tp-yt-paper-radio-button[@name="VIDEO_MADE_FOR_KIDS_NOT_MFK"]', timeout=30000)
        for_not_kids_btn = await page.xpath('//tp-yt-paper-radio-button[@name="VIDEO_MADE_FOR_KIDS_NOT_MFK"]')
        await for_not_kids_btn[0].click()
        print("step6")
        await page.waitForXPath('//ytcp-button[@id="toggle-button"]', timeout=30000)
        await asyncio.sleep(5)
        to_comments_btn = await page.xpath('//ytcp-button[@id="toggle-button"]')
        await to_comments_btn[0].click()
        print("step7")
        await page.waitForXPath('//tp-yt-paper-radio-button[@id="allow-all-radio-button"]/div[1]/div[1]',
                                timeout=30000)
        comments_radio_btn = await page.xpath('//tp-yt-paper-radio-button[@id="allow-all-radio-button"]/div[1]/div[1]')
        await comments_radio_btn[0].click()
        print("step8")
        await page.waitForXPath('//ytcp-video-player-controls[@id="video-player"]', timeout=180000)

        await page.waitForXPath('//ytcp-button[@id="next-button"]', timeout=30000)
        next_btn = await page.xpath('//ytcp-button[@id="next-button"]')
        await next_btn[0].click()
        await next_btn[0].click()
        await next_btn[0].click()
        print("step9")
        await page.waitForXPath('//tp-yt-paper-radio-group[@id="privacy-radios"]/tp-yt-paper-radio-button[3]',
                                timeout=30000)
        await asyncio.sleep(5)
        public_radio_btn = await page.xpath(
            '//tp-yt-paper-radio-group[@id="privacy-radios"]/tp-yt-paper-radio-button[3]')
        await public_radio_btn[0].click()
        print("step10")
        await page.waitForXPath('//ytcp-button[@id="done-button"]', timeout=30000)
        done_btn = await page.xpath('//ytcp-button[@id="done-button"]')
        await done_btn[0].click()
        print("step11")
        await page.waitForXPath('//a[@id="share-url"]', timeout=30000)
        shrot_ref = await page.evaluate('document.querySelector("#share-url").innerText')

        response = await page.goto(shrot_ref, timeout=30000)
        if response.status not in [200, 302]:
            print(f'\nAttempt to reconnect...')
            for i in range(5):
                print(f'\nVideo is upload but failed to navigate to page {shrot_ref} (Attempt {i + 1})')
                response = await page.goto(shrot_ref, timeout=30000)
                if response.status == 200 or response.status == 302:
                    break

        await asyncio.sleep(5)

        await page.waitForXPath('//div[@id="comments-button"]', timeout=30000)
        comments_btn = await page.xpath('//div[@id="comments-button"]')
        is_disabled = await (await comments_btn[0].getProperty('disabled')).jsonValue()
        if is_disabled:
            print(f'Failed to add comment for video {shrot_ref}')
            continue
        else:
            await comments_btn[0].click()

        try:
            await page.waitForXPath('//yt-formatted-string[@id="simplebox-placeholder"]', timeout=30000)
            comment_btn = await page.xpath('//yt-formatted-string[@id="simplebox-placeholder"]')
            await comment_btn[0].click()
        except Exception as ex:
            continue

        await page.waitForXPath('//yt-formatted-string[@id="contenteditable-textarea"]//div[1]', timeout=30000)
        await page.type(selector='#contenteditable-root', text=d[2])

        await page.waitForXPath('//ytd-button-renderer[@id="submit-button"]', timeout=30000)
        confirm_btn = await page.xpath('//ytd-button-renderer[@id="submit-button"]')
        await confirm_btn[0].click()

        await asyncio.sleep(10)

        await page.waitForSelector('div#action-menu ytd-menu-renderer', timeout=30000)
        await page.evaluate(
            'document.querySelector("div#action-menu ytd-menu-renderer").setAttribute("menu-active", true)')
        comment_menu = await page.xpath('//div[@id="action-menu"]/ytd-menu-renderer')
        await comment_menu[0].click()

        await page.waitForXPath('//tp-yt-paper-listbox[@id="items"]/ytd-menu-navigation-item-renderer', timeout=30000)
        fix_option_btn = await page.xpath('//tp-yt-paper-listbox[@id="items"]/ytd-menu-navigation-item-renderer')
        await fix_option_btn[0].click()

        await page.waitForXPath('//yt-button-renderer[@id="confirm-button"]', timeout=30000)
        confirm_btn = await page.xpath('//yt-button-renderer[@id="confirm-button"]')
        await confirm_btn[0].click()
        await asyncio.sleep(5)


if __name__ == '__main__':
    token = get_token()
    browser_id = get_browser_profiles(token)
    videos = [abspath(join(videos_dir, f)) for f in listdir(videos_dir) if isfile(join(videos_dir, f))]
    titles = [t for t in open(titles_path, encoding='UTF-8')]
    comments = [c for c in open(comments_path, encoding='UTF-8')]
    data = []
    for video, title, comment in zip(videos, titles, comments):
        data.append((video, title, comment))
    print('Enter the number of videos to upload: ')
    count = int(input())
    port, ws_endpoint = start_browser(browser_id)
    asyncio.get_event_loop().run_until_complete(deploy(port, ws_endpoint, data[:count]))
    stop_browser(browser_id)

 


Администрация форума не имеет отношения к пользователям форума и к публикуемой ими информации. Пользовательское соглашение
    • 0
  • Наверх
  • Ответить

OFFLINE Отправлено

prostozor
Активный
  • Онлайн:8д 7ч 36м
21
1 - нужен долфин.
2 - в нем верхний (первый) аккаунт в списке должен быть авторизован в ютубе и иметь канал
3 - количество видео для загрузки скрипт предложит сам
4 - 1 видос 1 строчка в текстовиках/ 10 видосов 10 строчек
5 - удачных заливов
    • 0
  • Наверх
  • Ответить

OFFLINE Отправлено

Daniil Mironychev
Пользователи
  • Онлайн:
0

А просмотры будут на видосах? Я делал похожий скрипт используя Selenium Chromedriver(headless mode). Видосы выкладывались, но вообще не набирали просмотров. Думаю ютуб детектит как-то это и не выкидывает в рекомендации.


    • 0
  • Наверх
  • Ответить

OFFLINE Отправлено

StageSMM
Активный
  • Онлайн:1д 22ч 59м
-7
Как зарабатывать в Telegram? — Работать с лучшими!
StageSMM — панель, к которой хочется вернуться, и вот почему: 
 
— Premium-услуги для поиска от 3$ за 1000
 
— Капельная подача услуг 
 
— Тех. поддержка, которая поддержит не на словах
 
Вывод в топ — просто. Мы подготовили статьи на тему всех алгоритмов Telegram. Заходи!
 
StageSMM предоставляет услуги для: Telegram, Instagram, Youtube, Vkontakte, Tik Tok, Twitter.
Позиции на соц. сети: Подписчики, лайки, просмотры, бусты, комментарии, реакции, опросы, репосты. 
 
Продвигайся у лучшихStageSMM!

Рекламный пост




    Напишите сообщение


      

    Самое интересное

     



    1