UNPKG

node-apiless-youtube-upload-nc

Version:

Upload videos to Youtube in Node.js without any Youtube API dependency by using Selenium.

96 lines (90 loc) 6.79 kB
import {until, By, WebElement} from 'selenium-webdriver' import fs from 'fs' import {Cookies, makeWebDriver} from './helpers' var ckStr = '[{"domain":".youtube.com","expiry":1683479920,"httpOnly":true,"name":"__Secure-3PSIDCC","path":"/","sameSite":"None","secure":true,"value":"AJi4QfGvoekR34AOUHx4RjwRiYWP901dKSQ4Xlr9IHVWHdplJfW-1ajMzY7LvKumc8ceocbq"},{"domain":".youtube.com","expiry":1683479920,"httpOnly":false,"name":"SIDCC","path":"/","secure":false,"value":"AJi4QfHl0jbYOSUDWb_aagejFhR8lCj2ixHaitwoR8_PtRUgZ0MyoEVsSSKc4emAgUkyxHl-FQ"},{"domain":".youtube.com","expiry":1715015918,"httpOnly":false,"name":"PREF","path":"/","secure":true,"value":"f4=4000000&tz=Asia.Shanghai"},{"domain":".youtube.com","httpOnly":true,"name":"YSC","path":"/","sameSite":"None","secure":true,"value":"LYwz4fPdirM"},{"domain":".youtube.com","expiry":1667495835,"httpOnly":true,"name":"VISITOR_INFO1_LIVE","path":"/","sameSite":"None","secure":true,"value":"kziYJjeSt7A"},{"domain":".youtube.com","expiry":1715015835,"httpOnly":true,"name":"LOGIN_INFO","path":"/","sameSite":"None","secure":true,"value":"AFmmF2swRQIgIkJ7Uz6Vt-1aUnSHzURQUnP88i3fp6W5xxnCpYk19lkCIQDl5WuUY11a7viOC9fk35Z54dSoIxCnDAAr3nFxGUe1mg:QUQ3MjNmemtka2hESFVhWlpZME5WeFdNby0xZVVLc3VLeHdvNV9RdjBMQXo5d3RKdGstRGNIdC0wLVhLOFJSVG1lSUptVDZkbW1pMUhoYVZpdDE5Q18wSUstSTVFQVY1WDBBdWFVVGdaSUJ5M3l6dnl0TkJmTjJGc2ZJQWxnMVpoSWZBMFNVU1NBVUdVVnkwT3RZV1JmUVBKSThIZUhCTVVn"},{"domain":".youtube.com","expiry":1715015835,"httpOnly":false,"name":"__Secure-3PAPISID","path":"/","sameSite":"None","secure":true,"value":"PiP2xt8iKNXZGt7r/AhkNc_mM64OZAThr_"},{"domain":".youtube.com","expiry":1715015835,"httpOnly":false,"name":"__Secure-1PAPISID","path":"/","secure":true,"value":"PiP2xt8iKNXZGt7r/AhkNc_mM64OZAThr_"},{"domain":".youtube.com","expiry":1715015835,"httpOnly":true,"name":"__Secure-1PSID","path":"/","secure":true,"value":"Jwirs5NAoZvUS-20IcztUaHUew0mFibB6NDSKKiFqHM9rRjziTjHBH7WyjpXf-I2LtKzeA."},{"domain":".youtube.com","expiry":1715015835,"httpOnly":false,"name":"SAPISID","path":"/","secure":true,"value":"PiP2xt8iKNXZGt7r/AhkNc_mM64OZAThr_"},{"domain":".youtube.com","expiry":1715015835,"httpOnly":false,"name":"APISID","path":"/","secure":false,"value":"1R8IDUsLceuCacf4/AWLIcpJlDM1yom_uY"},{"domain":".youtube.com","expiry":1715015835,"httpOnly":true,"name":"__Secure-3PSID","path":"/","sameSite":"None","secure":true,"value":"Jwirs5NAoZvUS-20IcztUaHUew0mFibB6NDSKKiFqHM9rRjzCxgXls3hVUOjtBlx2RSrqQ."},{"domain":".youtube.com","expiry":1715015835,"httpOnly":true,"name":"SSID","path":"/","secure":true,"value":"AI08cHLVuxeNMyWH6"},{"domain":".youtube.com","expiry":1715015835,"httpOnly":true,"name":"HSID","path":"/","secure":false,"value":"AhEfZ8LfCpgQN0UWF"},{"domain":".youtube.com","expiry":1715015835,"httpOnly":false,"name":"SID","path":"/","secure":false,"value":"Jwirs5NAoZvUS-20IcztUaHUew0mFibB6NDSKKiFqHM9rRjzH6yd6iM1t7WfjvRmgd8eww."}]'; async function test(){ const driver = await makeWebDriver({headless: false, fullsize: true}); const onProgress = console.log; const findElements = async (cssSelector : string) => { var webEls = await driver.findElements(By.css(cssSelector)) if (webEls[0]) await driver.executeScript('arguments[0].scrollIntoViewIfNeeded()', webEls[0]) return webEls } const findElement = async (cssSelector : string) => { var els = await findElements(cssSelector) if (els.length === 0) throw new Error(`Element was not found with selector '${cssSelector}'`) return els[0] } const setTc = async (url, tc) => { try{ await driver.get('https://www.youtube.com/'); await driver.sleep(5*1000); var cookies = JSON.parse(ckStr); for (let cookie of cookies){ // cookie.expiry = (new Date(cookie.expiry)).getTime()/1000; await driver.manage().addCookie(cookie) } await driver.sleep(5*1000); onProgress('Opening ' + url); await driver.get(url); await driver.sleep(5*1000); onProgress('add comment..'); var metaEl = await findElement('[id=primary-inner] [id=meta]'); var location = await metaEl.getRect(); await driver.executeScript('window.scrollTo(0, arguments[0])', location.y+location.height); await driver.sleep(5 * 1000); onProgress('remark..'); (await findElement('#simplebox-placeholder')).click() await driver.sleep(1000); var inputElem = await findElement('[id=contenteditable-root]'); await driver.executeScript('arguments[0].scrollIntoViewIfNeeded()', inputElem); await inputElem.sendKeys(tc); await driver.sleep(3*1000); (await findElement('#submit-button [id=button]')).click(); await driver.sleep(5*1000); var commentEls = await findElements('ytd-comment-renderer[id=comment]'); if(commentEls.length){ var commentEl = commentEls[0]; const actions = driver.actions({async:true}); // await actions.move({origin:commentEl}).press().perform(); await driver.executeScript(`var evObj = document.createEvent('MouseEvents');evObj.initEvent('mouseover', true, false);arguments[0].dispatchEvent(evObj)`, commentEl); await driver.sleep(5000); var actionBtns = await findElements('ytd-comment-renderer[id=comment] [id=action-menu] yt-icon-button[id=button]'); if(actionBtns.length){ await actionBtns[0].click(); await driver.sleep(5000); var menuItems = await findElements('ytd-menu-navigation-item-renderer > a'); if(menuItems.length){ await menuItems[0].click(); await driver.sleep(1000); var confirmBtns = await findElements('yt-confirm-dialog-renderer [id=main] [id=confirm-button]'); if(confirmBtns.length){ await confirmBtns[0].click(); await driver.sleep(5*1000); onProgress('set tc success!'); } else{ onProgress('no confirm buttons found!'); } } else{ onProgress('no menu items found!') } } else{ onProgress('no action buttons found!'); } } else{ onProgress('no comment elements found!'); } } catch(e){ onProgress(e); } } await setTc('https://www.youtube.com/watch?v=y6VvLLqXhMU', '置顶测试!') } (async ()=> { await test(); })();