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
text/typescript
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();
})();