RumbleSchedule: ;------------------------------------------------ CurrentSite := "Rumble" SaveOrPostProgress(Message:="Scheduling Post in Rumble Studio",PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") Status := NavigateFromBaseURLTo("https://studio.rumble.com/api/signin") if(Status) Return try driver.executeScript("return document.readyState").equals("complete") ; wait until page loads completely before proceeding CheckForAlerts() Message = Checking Login Status SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") try CurrentURL := driver.URL if(InStr(CurrentURL, "/sso/auth/consent")){ Message = Rumble Studio Logged out. Trying to log back in. SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") ; login button in middle of page Xpath = //button[@class='consent-page--button header-user'] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) sleep, 2000 try CurrentURL := driver.URL if(InStr(CurrentURL, "/sso/auth/consent")){ Message = Failed to login to Rumble Studio SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") Return } } ; Schedule New Stream ; ------------------------------------------------ Message = Scheduling new stream and inputting information SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") ; Schedule new stream ; Schedule a stream button Xpath = //div[normalize-space()='Schedule a stream'] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) Xpath = (//h2[normalize-space()='Select a template (optional)']) try ElementInnerText := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text if(!ElementInnerText){ Message = Templates Subwindow did not show up SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") Return } loop, 3 { Xpath = (//div[@class='flex items-center justify-between gap-x-8 p-4 bg-indigo rounded-xl'])[%A_Index%] try, ElementText := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text ; use the template with "Freedomain Livestream in the name" if(InStr(ElementText, "Freedomain Livestream")){ Xpath = (//span[contains(text(),'Select')])[1] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) if(Status){ Message = Failed to Select Livestream Template SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") Return } } } ; input thumbnail if(Livestreamthumbnail){ Xpath = //input[@id='room-thumbnail'] Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=Livestreamthumbnail) if(Status){ Message = Faied to upload custom thubmanil SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") Return } } ; input Livestream Title Xpath = //input[@placeholder='Give your stream a name'] Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=LivestreamTitle, ClearElement:=1) ; input Livestream Description Xpath = //textarea[@placeholder='Tell the audience more about your stream'] Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=LivestreamDescription, ClearElement:=1) ; Input Date & Time ; ------------------------------------------------ ; Create variables with time and date of timestream FormatTime, RumbleLivestreamDate , %LivestreamDate%, dddd, MMMM FormatTime, LivestreamOrdinalDay , %LivestreamDate%, d FormatTime, RumbleLivestreamYear , %LivestreamDate%, yyyy LivestreamOrdinalDay := GetDateOrdinalSuffix(LivestreamOrdinalDay) ; Msgbox % "LivestreamOrdinalDay: " LivestreamOrdinalDay RumbleLivestreamDate := RumbleLivestreamDate . " " . LivestreamOrdinalDay . ", " . RumbleLivestreamYear ; Msgbox % "RumbleLivestreamDate: " RumbleLivestreamDate ; Msgbox % "RumbleLivestreamDate: " RumbleLivestreamDate FormatTime, RumbleLivestreamTime , %LivestreamTime%, h:mm tt ; Msgbox % "RumbleLivestreamTime: " RumbleLivestreamTime ; FormatTime, RumbleLivestreamYear , %LivestreamDate%, yyyy ; click on box to open time picker dialogue Xpath = //input[@placeholder='Pick a time'] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) ; generate xpath based on date and click element Xpath = //div[@aria-label='Choose %RumbleLivestreamDate%'] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) if(Status){ Message = Failed to select date from popup menu using generated xpath.`nXpath = %Xpath% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") Return } ; generate xpath based on time and click element Xpath = //li[normalize-space()='%RumbleLivestreamTime%'] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) if(Status){ Message = Failed to select time from popup menu using generated xpath.`nXpath = %Xpath% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") Return } ; Select Channel for Upload ; ------------------------------------------------ ; click channel dropdown Xpath = //span[@class='text-light truncate text-mini'] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) if(Status){ Message = Failed to click on Channel dropdown menu SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") Return } ; Grab inner text of all items in the channel select drop down menu xpath = (//div[@class='shadow-md rounded-lg overflow-x-hidden bg-indigo'])[1] try ElementInnerText := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text ; pull out name of first channel in dropdown FirstChannelName := StrSplit(ElementInnerText, "`n")[1] Xpath = (//span[normalize-space()='%FirstChannelName%'])[1] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) if(Status){ Message = Failed to select the channel -%FirstChannelName%- from Channel dropdown menu SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") return } ; Select each Secondary Platform checkbox ; ------------------------------------------------ Loop, 10 { IndexPlusOne := A_index + 1 Xpath = (//div[@class='flex shrink-0 items-center gap-x-4'])[%A_index%] XpathCheckbox = (//div[@class='relative shrink-0'])[%IndexPlusOne%] try SecondaryPlatformCheckboxName := driver.findelementbyxpath(Xpath).Attribute("innerText") ;XPATH Inner Text if(SecondaryPlatformCheckboxName = "Add new destination" OR SecondaryPlatformCheckboxName = ""){ Break } Status := Selenium_LoopToClickXpath(Xpath:=XpathCheckbox,NumOfLoops:=2,SleepLength:=1000) if(Status){ Message = Failed to check off the checkbox for: %SecondaryPlatformCheckboxName% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") } sleep, 250 } if(ConfirmBeforeSubmit){ OnMessage(0x44, "OnMsgBoxUserConfirmation") MsgBox 0x21, User Confirmation, Please check that all data was input correctly and fix any mistakes and then click PROCEED to finalize the Upload.`n`nClick STOP to cancel the rest of this Upload and move on to the next website. OnMessage(0x44, "") IfMsgBox OK, { } Else IfMsgBox Cancel, { Message = User Selected STOP button when asked for confirmation. Cancelling Rest of automation for this site. SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") Return } } /* */ ; click the "next" button to finalize the upload Xpath = (//button[@class='rounded-full px-6 py-2 bg-primary hover:brightness-[0.92] cursor-pointer'])[1] Status := Selenium_LoopToClickXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000) if(Status){ Message = Failed to click "Next" to finalize the upload SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") } try, driver.get("https://rumble.com/account/live-streaming") Xpath = (//a[normalize-space()='Livestream Coming Soonish!'])[1] ; Try ElementOuterHTML := driver.findelementbyxpath(Xpath).Attribute("outerHTML") ;XPATH-ID & Tag RumbleURLSlug := GetHTMLValueFromXpathOuterHTML(XPATH, "href") if(RumbleURLSlug = "" or RumbleURLSlug = "Failed"){ Message = Failed to grab Rumble URL Slug from Livestreams Page SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") Return } RumbleLivestreamURL := "https://rumble.com" . RumbleURLSlug IniWrite, %RumbleLivestreamURL%, %PostStatusesFilepath%, Livestream,RumbleLivestreamURL return try CurrentURL := driver.URL if(InStr(CurrentURL, "/login.php")){ if(AutoLogin){ Message = Logging in Automatically by clicking into the UN+PW fields for info to register SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") ; have to click into username and password field for page to register that there's input ; clicking with JS doesn't make it register, but with xpath selenium it does Xpath = //input[@id='login-username'] driver.FindElementByXPath(Xpath).click() Xpath = //input[@id='login-password'] driver.FindElementByXPath(Xpath).click() js = document.querySelector("button[type='submit']").click(); driver.executeScript(js) ; Do a double check to make sure that login worked Message = Checking Login Status SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") try CurrentURL := driver.URL if(!InStr(CurrentURL, "/upload")){ Message = Failed to log back in. Please Log Back In Manually SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") SaveDriverURLOFErrorPage() Return } } else, { ; notify user and return Message = Login Expired. Please Log Back in SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") SaveDriverURLOFErrorPage() Return } Message = Waiting 5 seconds for page to fully load SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") sleep, 5000 } ; CheckForAlerts() Message = Uploading Video File SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") ; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") Xpath = //input[@id='Filedata'] Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=VideoFilepath) if(Status){ try, CurrentURL := GetCurrentTabURlBase() Message = Failed to Upload Video File`nCurrent Tab URL: %CurrentURL% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") SaveDriverURLOFErrorPage() Return } ; Input Title try driver.findElementsByName("title").item[1].SendKeys(VideoTitle) ;selects element based on Name and sends variable to it. catch e { Message = Video Upload Failed, Please Check Login Status SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") SaveDriverURLOFErrorPage() Return } ; Input Description Loop, 5 { ; Attempt to input video description a couple of times TooltipThis("Inputting Description `nAttempt Number: " A_index) status := js_SendAndCheckWithID(Element:="description",ValueToCheck:="value",SleepLength:=3000,JSStringText:=JSVideoDescription) if(!Status) Break /* if(A_index = 5){ Clipboard := VideoDescription Message = Unable to Input Video Description`nDescription copied to clipboard, please paste it in at your earliest convenience. SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") Return } js = document.getElementsByName('description')[1].value = "%JSVideoDescription%"; ; Send content through javascript (Great for getting around emoji chrome limitaitons) try driver.executeScript(js) ;Executes a Javascript on the webpage, mostly used for buttons. try Description := driver.findElementsByName("description").item[2].Attribute("value") ;XPath: ID=site-title & span tag if(Description != "") Break sleep, 2000 */ } ; sleep, 5000 Message = Selecting Channel SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") ; try driver.findElementsByID("channelId").item[1].click() ; @todo replace with regex js = return document.querySelector("#channelId").innerHTML; try, ChannelIDNumber := driver.executeScript(js) ; Msgbox % "ChannelIDNumber: " ChannelIDNumber ChannelIDNumber := StrSplit(ChannelIDNumber, "option value=") ; Msgbox % "ChannelIDNumber: " ChannelIDNumber ChannelIDNumber := ChannelIDNumber[3] ; Msgbox % "ChannelIDNumber: " ChannelIDNumber SingleQuote = " ChannelIDNumber := StrSplit(ChannelIDNumber, "data-private") ChannelIDNumber := ChannelIDNumber[1] ChannelIDNumber := StrReplace(ChannelIDNumber, SingleQuote, "") ChannelIDNumber := StrReplace(ChannelIDNumber, " ", "") ; Msgbox % "ChannelIDNumber: " ChannelIDNumber ; js = return document.querySelector("#channelId").value; ; try, ChannelIDNumber := driver.executeScript(js) ; Msgbox % "ChannelIDNumber: " ChannelIDNumber if(ChannelIDNumber = ""){ Message = ChannelIDNumber is blank. Unable to select Upload Channel SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") SaveDriverURLOFErrorPage() Return } ChannelIDNumber = 6070526 ; freedomain ; ChannelIDNumber = 762377 ; personal Xpath = //option[@value='%ChannelIDNumber%'] try driver.FindElementByXPath(Xpath).click() catch e { Message = Failed to click on Channel using %ChannelIDNumber%. SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") SaveDriverURLOFErrorPage() Return ; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") ; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") } ; Input Tags Message = Inputting Tags SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") try driver.findElementsByName("tags").item[1].SendKeys(VideoTags) ;selects element based on Name and sends variable to it. ; Custom Thumbnail if(VideoThumbFilepath != "") { TooltipThis("Uploading Thumbnail") Xpath = //input[@name='customThumb'] Status := Selenium_LoopToSendValueToXpath(Xpath:=Xpath,NumOfLoops:=2,SleepLength:=1000,StringTextContent:=VideoThumbFilepath) if(Status){ Message = Failed to Upload Thumbanil SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") } ; @todo: Add a check to see if progress gets stuck ; Check Upload Percentage TooltipThis("Waiting for Video to Finish Uploading") Loop, %Number_of_loops_to_Check_Upload_status% { sleep, %Time_Between_Loops_Upload_Status% jscheck = return document.getElementsByClassName('num_percent')[0].textContent; try RumbleUploadPercent := driver.executeScript(jsCheck) ; try RumbleUploadPercent := driver.findelementbyxpath(Xpath).Attribute("textContent") RumbleUploadPercent := StrSplit(RumbleUploadPercent, " ") RumbleUploadPercent := RumbleUploadPercent[1] if(InStr(RumbleUploadPercent, "100%")) ; once variable contains 100%, then we can break out of loop and continue Break Status := Check_For_Stuck_Video_Upload(A_index, RumbleUploadPercent) if(Status = "Failed") Return ; if(HasVal(Array_Index_Num_of_Upload_StatusChecks, A_index)) { ; 30 minutes and 60 minutes - send a notification message ; Message = Upload Progress: %RumbleUploadPercent% ; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") ; } } ; Msgbox % "RumbleUploadPercent: " RumbleUploadPercent ; Click on one of the video thumbnail options first ; Seems to be a bug on rumble, in order to be able to select a custom thumb through js, gotta select on of the generated ones first. ; Xpath = /html/body/main/div/div/div/section/form[1]/div/div[2]/div[3]/a[2] ; thumbnail option #3 ; try driver.FindElementByXPath(Xpath).click() ;Clicks on Xpath based on variable. /* js = document.getElementById('customThumb').click(); driver.executeScript(js) ;Executes a Javascript on the webpage, mostly used for buttons. Status := InputFilePathIntoOpenWindow(VideoThumbFilepath) if(Status) { Message = Upload Failed:`nUnable to Find "Open File" window to input filepath into SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") Return } */ } if(ConfirmBeforeSubmit) msgbox, Please check that all data was input correctly and then click OK to Publish Video try UploadPageURL := driver.URL ; Submit Button js = document.getElementById('submitForm').click(); try driver.executeScript(js) ; try driver.executeScript("return document.readyState").equals("complete") ; wait until page loads completely before proceeding ; Select Rumble Only Licensing js = document.getElementsByClassName('greenLink mRight last')[0].click(); ; Send content through javascript (Great for getting around emoji chrome limitaitons) try driver.executeScript(js) ;Executes a Javascript on the webpage, mostly used for buttons. ; Check off condition 1 js = document.getElementById("crights").click() try driver.executeScript(js) ; Check off condition 2 js = document.getElementById("cterms").click() try driver.executeScript(js) ; Click the Submit Button js = document.getElementById("submitForm2").click() try driver.executeScript(js) ; Loop until able to grab the direct link from the result page. Loop, 24 { TooltipThis("Waiting for Result Page to load to grab Video URL") Sleep, 5000 js = return document.getElementById("error_files_2").textContent; RumbleError := driver.executeScript(js) ;Executes a Javascript on the webpage, mostly used for buttons. if(RumbleError != "") { Message = Rumble Upload Failed due to:`n%RumbleError% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") SaveDriverURLOFErrorPage() Return } js = return document.getElementById('direct').value; try RumbleURL := driver.executeScript(js) ;Executes a Javascript on the webpage, mostly used for buttons. /* try RumbleURL := driver.findElementsByID("direct").item[1].Attribute("value") ;grab Direct Link from the result page catch e { ; if not able to grab it, then sleep for 5 seconds and then loop again Continue } */ if(RumbleURL != ""){ ; If URL is grabbed from result page, then kick out of loop Break } if(A_Index = 10) ; if looped for 5 minutes and still no URL grabbed { ; @todo: add error check if submit button clicked and error appears Xpath = /html/body/main/div/div/div/section/form[2]/div/div[9] ; grab inner content of where error usually appears. try RumbleUploadError := driver.findelementbyxpath(Xpath).Attribute("innerText") ; Grabb innertext ; Msgbox % "UseThumbUploadToolTextExist: " UseThumbUploadToolTextExist Message = Upload Error (E#1341)`nVideo Uploaded but not able to be finalized.`nPlease fix the issue and click the final submit button. `nError: %RumbleUploadError% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") SaveDriverURLOFErrorPage() Return } } IniWrite, %RumbleURL%, %VideoLinksIniFile%, URLs, RumbleURL Message = Upload Complete: %RumbleURL% SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") SaveDriverURL() AddToTotalVideosUploadedCount() Return