From e85945c19798d678fb397321da1b12ad89ef705c Mon Sep 17 00:00:00 2001 From: yuriy Date: Sun, 12 Feb 2023 22:47:04 -0500 Subject: [PATCH] small refactoring --- .gitignore | 1 + Freedomain Video Uploader.ahk | 19 +- Lib/SharedFunctions.ahk | 1003 +++++++++++++++------------------ 3 files changed, 464 insertions(+), 559 deletions(-) diff --git a/.gitignore b/.gitignore index cda495c..8ba44f0 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,4 @@ body.txt **ConnectToActiveChromeTab.ahk Freedomain Social Media Poster*.exe Compile Scripts to EXE.ahk +Freedomain Video Uploader.exe \ No newline at end of file diff --git a/Freedomain Video Uploader.ahk b/Freedomain Video Uploader.ahk index 83d5c2b..f1e1d42 100644 --- a/Freedomain Video Uploader.ahk +++ b/Freedomain Video Uploader.ahk @@ -34,13 +34,6 @@ FullScriptName := ScriptName . " - " . ScriptVersion -; Included Files -#include %A_ScriptDir%\Lib\StdOutToVar.ahk ; used for chrome debugging mode connection -#Include C:\Users\%A_UserName%\Syncthing\Git\Freedomain-Social-Media-Poster\Lib\SharedFunctions.ahk ; @todo, move this to a git submodule -#Include %A_ScriptDir%\Lib\JSON.ahk -#Include %A_ScriptDir%\Lib\ChromeAutomationFunctions.ahk - - ;---ToDo--- ;------------------------------------------------ ; @todo: Update Locals Share link grabbing @@ -5008,6 +5001,18 @@ Return ; -------------------------------Functions------------------------------- + +; Included Files +#include %A_ScriptDir%\Lib\StdOutToVar.ahk ; used for chrome debugging mode connection +#Include %A_ScriptDir%\Lib\SharedFunctions.ahk +#Include %A_ScriptDir%\Lib\JSON.ahk +#Include %A_ScriptDir%\Lib\ChromeAutomationFunctions.ahk +#Include %A_ScriptDir%\Lib\\RunCMD.ahk + +; #Include %A_ScriptDir%\Lib\ChromeAutomationFunctions.ahk + + + CheckLBRYProcess(){ ; Check if LBRY Process exists Process, Exist,LBRY.exe diff --git a/Lib/SharedFunctions.ahk b/Lib/SharedFunctions.ahk index f21a3ea..3669ebe 100644 --- a/Lib/SharedFunctions.ahk +++ b/Lib/SharedFunctions.ahk @@ -15,8 +15,6 @@ global CurrentTabURL ; #Include %A_ScriptDir%\RunCMD.ahk - - DevModeMsgBox(Message){ if(!DevMode) return @@ -29,60 +27,67 @@ DevModeMsgBox(Message){ CheckForUpdates(){ ; msgbox, checking for updates Message = Checking For Updates - SaveOrPostProgress(Message,PostType:="ErrorLoggingTextFile") - - data := URLDownloadToVar(GitReleasesAPIURL) - ; Msgbox % "data: " data - - parsed := JSON.Load(data) - - UpdateVersionNumber := parsed.1.name - - if(ScriptVersion = UpdateVersionNumber OR ScriptVersion > UpdateVersionNumber){ - ToolTip - return - } - else, { - UpdateAvailable := 1 - ; msgbox, update found! - Message = Program Update Found - SaveOrPostProgress(Message:=Message,PostType:="ErrorLoggingTextFile") - ; IniWrite, 1, %SettingsIniFilepath%, %ScriptSettingsSection%, UpdateAvailable - ; ToolTip - return -} + SaveOrPostProgress(Message,PostType:="Tooltip,ErrorLoggingTextFile") + + + ; Msgbox % "FreedomScriptsChangelogURL: " FreedomScriptsChangelogURL + ; Msgbox % "ChangelogIniFilepath: " ChangelogIniFilepath + ; Msgbox % "ScriptSettingsSectio: " ScriptSettingsSection + ; Msgbox % "SettingsIniFilepath: " SettingsIniFilepath + + UrlDownloadToFile, %FreedomScriptsChangelogURL%, %ChangelogIniFilepath% + if(ErrorLevel){ + Message = Failed to Download Changelog + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return + } + + IniRead, UpdateVersion, %ChangelogIniFilepath%, %ScriptSettingsSection%, ScriptVersion, %A_Space% + if(UpdateVersion = ""){ + ToolTip + ; MsgBox, update version is blank. + Return + } + + + if(ScriptVersion != UpdateVersion){ + ; msgbox, update found! + Message = Script Update Found + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") + IniWrite, 1, %SettingsIniFilepath%, %ScriptSettingsSection%, UpdateAvailable + + GuiControl,, UpdateAvailable, Update Available - Click to View + } + else, { + Message = No Updates Found + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") + IniWrite, 0, %SettingsIniFilepath%, %ScriptSettingsSection%, UpdateAvailable + + } + ToolTip } -UpdateScript(){ - data := URLDownloadToVar(GitReleasesAPIURL) - parsed := JSON.Load(data) - UpdateVersionNumber := parsed.1.name - ChangeLog := parsed.1.body - exename := parsed.1.assets.1.name - exeURL := parsed.1.assets.1.browser_download_url +UpdateScript(){ + ; Msgbox % "ChangelogIniFilepath: " ChangelogIniFilepath + ; Msgbox % "ScriptSettingsSection: " ScriptSettingsSection - ; Msgbox % "UpdateVersionNumber: " UpdateVersionNumber - ; msgbox, Version: %Version% - ; Msgbox % "ChangeLog: " ChangeLog - ; Msgbox % "exeURL: " exeURL - ; Msgbox % "exename: " exename + IniRead, Changelog, %ChangelogIniFilepath%, %ScriptSettingsSection%, Changelog, %A_Space% + Changelog := StrReplace(Changelog, "--", "`n-") - ExeName := StrReplace(exename, ".exe", "") - UpdateExeName = %exename% %UpdateVersionNumber%.exe - UpdateExeFilepath = %A_ScriptDir%\%UpdateExeName% + IniRead, UpdateVersion, %ChangelogIniFilepath%, %ScriptSettingsSection%, ScriptVersion, %A_Space% - if(ScriptVersion = UpdateVersionNumber){ - ; IniWrite, 0, %SettingsIniFilepath%, %ScriptSettingsSection%, UpdateAvailable + if(ScriptVersion = UpdateVersion){ + IniWrite, 0, %SettingsIniFilepath%, %ScriptSettingsSection%, UpdateAvailable MsgBox, You are Up-To-Date ; IniRead, UpdateAvailable, %SettingsIniFilepath%, %ScriptSettingsSection%, UpdateAvailable, 0 return } - Changelog = %ScriptVersion% --> %UpdateVersionNumber%`n%Changelog% + Changelog = %ScriptVersion% -> %UpdateVersion%`n`n-%Changelog% OnMessage(0x44, "OnMsgBoxUpdateAvailable") MsgBox 0x44, Update Available, %Changelog% @@ -90,82 +95,79 @@ UpdateScript(){ IfMsgBox Yes, { Return - } - Else IfMsgBox No, { - SaveOrPostProgress(Message:="Downloading Update",PostType:="Tooltip,ErrorLoggingTextFile") - ; Msgbox, downloading to: %A_ScriptDir%\%UpdateExeName% - UrlDownloadToFile, %exeURL%, %UpdateExeFilepath% - run, "%UpdateExeFilepath%" "%A_ScriptFullPath%" - ExitApp + } Else IfMsgBox No, { + run, "%FreedomainProgramUpdaterFilepath%" "%ScriptSettingsSection%" + ; Return + ExitApp + } + return } - return -} -; -------------------------------SaveOrPostProgress------------------------------- -; PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging,DiscordVideos" -SaveOrPostProgress(Message:="",PostType:=""){ + ; -------------------------------SaveOrPostProgress------------------------------- + ; PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging,DiscordVideos" + SaveOrPostProgress(Message:="",PostType:=""){ - MessageBU := Message - ; Msgbox % "PostType: " PostType - ; Msgbox % "CurrentSite: " CurrentSite + MessageBU := Message + ; Msgbox % "PostType: " PostType + ; Msgbox % "CurrentSite: " CurrentSite - if(CurrentSite != "") - Message := CurrentSite . ": " . Message - - if(InStr(PostType, "Tooltip")){ - TooltipThis(Message) - } - if(InStr(PostType, "ErrorLoggingTextFile")){ - Func_LogErrorsToTextFile(Message) - } - if(InStr(PostType, "ErrorSummaryVar")){ - Func_LogErrorsToVar(Message) - } - if(InStr(PostType, "DiscordErrorLogging")){ - PostToDiscordChannel(Message,DiscordErrorLoggingWebhookBotURL) - } - if(InStr(PostType, "DiscordVideos")){ - Message := MessageBU - PostToDiscordChannel(Message,DiscordVideosWebhookURL) - } - if(InStr(PostType, "DiscordParler")){ - Message := MessageBU - PostToDiscordChannel(Message,DiscordParlerWebhookURL) - } + if(CurrentSite != "") + Message := CurrentSite . ": " . Message + if(InStr(PostType, "Tooltip")){ + TooltipThis(Message) + } + if(InStr(PostType, "ErrorLoggingTextFile")){ + Func_LogErrorsToTextFile(Message) + } + if(InStr(PostType, "ErrorSummaryVar")){ + Func_LogErrorsToVar(Message) + } + if(InStr(PostType, "DiscordErrorLogging")){ + PostToDiscordChannel(Message,DiscordErrorLoggingWebhookBotURL) + } + if(InStr(PostType, "DiscordVideos")){ + Message := MessageBU + PostToDiscordChannel(Message,DiscordVideosWebhookURL) + } + if(InStr(PostType, "DiscordParler")){ + Message := MessageBU + PostToDiscordChannel(Message,DiscordParlerWebhookURL) + } -} -; -------------------------------/SaveOrPostProgress------------------------------- -TakeScreenshotOfPage(SaveFilepath := ""){ - if(!ScreenshotResult) - return + } + ; -------------------------------/SaveOrPostProgress------------------------------- + TakeScreenshotOfPage(SaveFilepath := ""){ - TooltipThis("Sleeping 5 Seconds Before Taking Screenshot") - ; sleep, 5000 + if(!ScreenshotResult) + return - if(SaveFilepath = ""){ - SaveFilepath := ErrorLoggingDirectory - } + TooltipThis("Sleeping 5 Seconds Before Taking Screenshot") + ; sleep, 5000 - ; if(!FileExist(SaveFilepath)) - FileCreateDir, %SaveFilepath% + if(SaveFilepath = ""){ + SaveFilepath := ErrorLoggingDirectory + } - if(!TakeScreenshotsOfErrors) - Return + ; if(!FileExist(SaveFilepath)) + FileCreateDir, %SaveFilepath% - ; Take a screenshot of the page and save it. - FormatTime, TodayDate , YYYYMMDDHH24MISS, yyyyMMdd_hhmmss + /* if(!TakeScreenshotsOfErrors) + Return + */ + ; Take a screenshot of the page and save it. + FormatTime, TodayDate , YYYYMMDDHH24MISS, yyyyMMdd_hhmmss - ; Msgbox % "ErrorLoggingDirectory: " ErrorLoggingDirectory - savepath = %SaveFilepath%\%TodayDate%.jpg - ; Msgbox % "savepath: " savepath - try driver.TakeScreenshot().SaveAs(savepath) + ; Msgbox % "ErrorLoggingDirectory: " ErrorLoggingDirectory + savepath = %SaveFilepath%\%TodayDate%.jpg + ; Msgbox % "savepath: " savepath + try driver.TakeScreenshot().SaveAs(savepath) - ; ScreenshotsTaken := 1 + ; ScreenshotsTaken := 1 } @@ -788,7 +790,6 @@ CreateArrayOfTabs() { DriverURLArray := [] try TotalTabsFound := Driver.Windows.Count - ; DevModeMsgBox(TotalTabsFound) ; if only 1 tab exists, grab info, push to array and exit early if(TotalTabsFound = 1){ @@ -814,7 +815,7 @@ CreateArrayOfTabs() { StartTime := A_TickCount Loop, { - Message = Creating an Array of All Chrome Tabs`nCurrent Loop: %A_index%/%TotalTabsFound%`nSometimes might get stuck for a short while if there is something loading in active tab + Message = Creating an Array of All Chrome Tabs`nCurrent Loop: %A_index%/%TotalTabsFound% (Cannot loop through unloaded tabs)`nSometimes might get stuck for a short while if there is something loading in active tab TooltipThis(Message) ; SaveOrPostProgress(Message:=URL,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar") @@ -852,9 +853,6 @@ CreateArrayOfTabs() { try Title := Driver.Title try URL := Driver.URL - ; DevModeMsgBox(Title) - ; DevModeMsgBox(URL) - ; TimeToGrabCurrentTab := A_TickCount - StartTime ; Msgbox % "TimeToGrabCurrentTab: " TimeToGrabCurrentTab ; VAR := HasVal(DriverURLArray, STRINGVAR) ; returns position of value in array @@ -896,521 +894,431 @@ if(TotalTabsFound = 1){ ; Msgbox % "A_index: " A_index ; DevModeMsgBox("breaking early on loop 1?") break - ; if there is only 1 tab, then break out of loop and don't bother looping through same tab - } + } ; if there is only 1 tab, then break out of loop and don't bother looping through same tab */ try driver.SwitchToNextWindow ;Focuses Selenium on the newly opened/next window. - ; end of loop - } - - ; Iterate from 1 to the end of the array: - Loop % DriverURLArray.Length() - { - ARRAYNAMEList .= DriverURLArray[A_Index] . "`n" - ; ArrayItem := DriverURLArray[A_Index] - ; MsgBox % DriverURLArray[A_Index] - - } - ; Msgbox % "ARRAYNAMEList: " ARRAYNAMEList - - TimeToLoopThroughAllTabs := A_TickCount - StartTime - Message = Time to Loop through all tabs: %TimeToLoopThroughAllTabs% - SaveOrPostProgress(Message:=Message,PostType:="ErrorLoggingTextFile,DiscordErrorLogging") - ; DevModeMsgBox(Message) - return - ; / END OF FUNC - } - - InputFilePathIntoOpenWindow(Filepath){ - ; Msgbox % "Filepath: " Filepath - Message = Waiting for "Open" window to appear to input filepath into - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") - ; Tooltip,Waiting for "Open" window to appear to input filepath into,850,0 - ; WinWait, Open - WinWait,Open,,5 ; Wait for 10 seconds for window - if(ErrorLevel) - { - ; msgbox, failed to find window. - Return "Failed" - } - WinActivate, Open - sleep, 1000 - ControlSetText, Edit1, %Filepath%, Open - sleep, 1000 - ControlSend, Edit1, {Enter}, Open - sleep, 1000 - - ; Do an extra check in case the Open window is still open. - OpenWindowExist := WinExist("Open") - if(OpenWindowExist) - ControlSend, Edit1, {Enter}, Open - ToolTip, - } + } ; end of loop - CheckCurrentTabForCurrentSite(){ - try CurrentTabURL := driver.url + ; Iterate from 1 to the end of the array: + Loop % DriverURLArray.Length() + { + ARRAYNAMEList .= DriverURLArray[A_Index] . "`n" + ; ArrayItem := DriverURLArray[A_Index] + ; MsgBox % DriverURLArray[A_Index] - if(!InStr(CurrentTabURL, CurrentSite)){ - Message = Chromedriver failed to switch to %CurrentSite%. Please see errorlog for website it got stuck on. - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - return "Failed" - } + } + ; Msgbox % "ARRAYNAMEList: " ARRAYNAMEList + TimeToLoopThroughAllTabs := A_TickCount - StartTime + Message = Time to Loop through all tabs: %TimeToLoopThroughAllTabs% + SaveOrPostProgress(Message:=Message,PostType:="ErrorLoggingTextFile,DiscordErrorLogging") + ; DevModeMsgBox(Message) + return + } ; /FUNC + + InputFilePathIntoOpenWindow(Filepath){ + ; Msgbox % "Filepath: " Filepath + Message = Waiting for "Open" window to appear to input filepath into + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") + ; Tooltip,Waiting for "Open" window to appear to input filepath into,850,0 + ; WinWait, Open + WinWait,Open,,5 ; Wait for 10 seconds for window + if(ErrorLevel) + { + ; msgbox, failed to find window. + Return "Failed" + } + WinActivate, Open + sleep, 1000 + ControlSetText, Edit1, %Filepath%, Open + sleep, 1000 + ControlSend, Edit1, {Enter}, Open + sleep, 1000 + + ; Do an extra check in case the Open window is still open. + OpenWindowExist := WinExist("Open") + if(OpenWindowExist) + ControlSend, Edit1, {Enter}, Open + ToolTip, + } + ; -------------------------------NavigateFromBaseURLTo------------------------------- + NavigateFromBaseURLTo(URL,PageTitle := "New Tab"){ + if(!DriverStatus){ ; if not connected to selenium chrome, then re-connect + Status := CheckSeleniumDriver() + if(Status) + Return "Failed" + + CreateArrayOfTabs() + } - ; msgbox % InStr(CurrentTabURL,CurrentSite) + if(ReuseTabs){ + URLBase := StrReplace(URL,"https://","") + URLBase := StrSplit(URLBase, "/") + URLBase := URLBase[1] + URLBase := StrReplace(URLBase, "www.","") + } - } + if(!HasSubstringVal(DriverURLArray, URLBase)) ; returns position of value in array + { + try, run "%ChromeFilepath%" "%URL%" + DriverURLArray.Push(URL) ; Append an item to the array + NewTabCreated := 1 + sleep, 1000 + } + ; msgbox, + Message = Finding Tab + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") - ; -------------------------------NavigateFromBaseURLTo------------------------------- - NavigateFromBaseURLTo(URL, TabTitle := ""){ - if(!DriverStatus){ ; if not connected to selenium chrome, then re-connect - Status := CheckSeleniumDriver() - if(Status) - Return "Failed" + TabFoundSuccessfully := - CreateArrayOfTabs() ; store all open tabs to memory for later usage - } + NumberOfTabLoops := DriverURLArray.Length() + ; NumberOfTabLoops := Driver.Windows.Count + 2 + loop % NumberOfTabLoops { ; loop through tabs to find matching tab + try driver.SwitchToNextWindow() - if(ReuseTabs){ ; pull out base of URL and check if it's within the array of tabs - URLBase := StrReplace(URL,"https://","") - URLBase := StrSplit(URLBase, "/") - URLBase := URLBase[1] - URLBase := StrReplace(URLBase, "www.","") - } + ; sleep, 1000 + ; msgbox, looping through tabs + try CurrentTabTitle := driver.window.title + try CurrentTabURL := driver.Url - ; if base url is not in tab array, create new tab and push url to array - if(!HasSubstringVal(DriverURLArray, URLBase)) - { - try CurrentTabTitle := driver.window.title + if(CurrentTabTitle = PageTitle OR InStr(CurrentTabURL, URLBase)){ + ; msgbox, found it.`n%CurrentTabTitle% = %PageTitle%`n%CurrentTabURL% = %URLBase% + TabFoundSuccessfully := 1 + ; msgbox %CurrentTabTitle% = %PageTitle% + ; msgbox %CurrentTabURL% = %URL% + Break + } + } - ; if currently in new tab navigate to the site in the current tab - if(CurrentTabTitle = "New Tab"){ - try driver.Get(URL) ;Open selected URL - try driver.executeScript("return document.readyState").equals("complete") ; wait until page loads completely before proceeding - catch e { - ; msgbox, error caught. trying something - try driver.switchToalert().accept() + if(!NewTabCreated){ ; if re-using a tab then we want to re-navigate to URL because it might be the wrong page try driver.Get(URL) ;Open selected URL + try driver.executeScript("return document.readyState").equals("complete") ; wait until page loads completely before proceeding catch e { - Message = Failed to Navigate to %URL%: Please Check for Any Open Dialogue Boxes - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - Return "Failed" + ; msgbox, error caught. trying something + try driver.switchToalert().accept() + try driver.Get(URL) ;Open selected URL + catch e { + Message = Failed to Navigate to %URL%: Please Check for Any Open Dialogue Boxes + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + Return "Failed" + } } } - return - } - else, { - try, run "%ChromeFilepath%" "%URL%" - DriverURLArray.Push(URL) ; Append an item to the array - NewTabCreated := 1 - ; sleep, 2000 - } - - - - } - - Message = Finding Tab - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile") + ; msgbox, no error caught + ; } - TabFoundSuccessfully := - NumberOfTabLoops := DriverURLArray.Length() - - ; loop through tabs to find matching tab - loop % NumberOfTabLoops { - try driver.SwitchToNextWindow() - - ; sleep, 1000 - ; msgbox, looping through tabs - try CurrentTabTitle := driver.window.title - try CurrentTabURL := driver.Url - - ; DevModeMsgBox(CurrentTabURL) - ; DevModeMsgBox(CurrentTabTitle) - - ; caused by tab being manually closed. Not sure if this is the only cause though. - if(CurrentTabTitle = "") { - Message = CurrentTabTitle: %CurrentTabTitle% - ; DevModeMsgBox(Message) - - Message = CurrenttabURL: %CurrentTabURL% - ; DevModeMsgBox(Message) - - ; try driver.SwitchToNextWindow - Continue - } - - - if(InStr(CurrentTabURL, URLBase)){ - Message = CurrentTabURL is %CurrentTabURL% and it contains %URLBase% - SaveOrPostProgress(Message:=Message,PostType:="ErrorLoggingTextFile") - - ; msgbox, found it.`n%CurrentTabTitle% = %PageTitle%`n%CurrentTabURL% = %URLBase% - TabFoundSuccessfully := 1 - ; message = %CurrentTabTitle%: %PageTitle% - ; DevModeMsgBox(message) - ; msgbox %CurrentTabURL% = %URL% - Break - } - } - - ; if failed to switch to tab and a new tab was not created, then chrome failed to switch to the tab - ; this happens sometimes. most likely to a chromedriver bug or maybe tab being offloaded? - if(!TabFoundSuccessfully AND !NewTabCreated){ - ; @todo : not sure how to best solve this problem currently. It doesn't happen very often. - ; last time it happened was when there were only 2 chrome tabs open, gab + subscribestar. chrome was stuck on subscribestar page and wouldn't nextwindow() to gab - } + Return + } + ; End of Function + ; -------------------------------/NavigateFromBaseURL------------------------------- - ; Message = TabFoundSuccessfully: %TabFoundSuccessfully% - ; DevModeMsgBox(Message) - - if(!NewTabCreated){ ; if re-using a tab then we want to re-navigate to URL because it might be the wrong page - try driver.Get(URL) ;Open selected URL - try driver.executeScript("return document.readyState").equals("complete") ; wait until page loads completely before proceeding - catch e { - ; msgbox, error caught. trying something - try driver.switchToalert().accept() - try driver.Get(URL) ;Open selected URL - catch e { - Message = Failed to Navigate to %URL%: Please Check for Any Open Dialogue Boxes - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - Return "Failed" + SaveDriverURL(){ ; save the url of the result page. That way if a tab is not found for a site, we can open up a tab from this tab instead of middle of nowhere. That way we can keep the tabs together + try LastWebsitePostURL := driver.URL } - } - } - ; msgbox, no error caught - ; } - - - Return -} -; End of Function -; -------------------------------/NavigateFromBaseURL------------------------------- - -SaveDriverURL(){ ; save the url of the result page. That way if a tab is not found for a site, we can open up a tab from this tab instead of middle of nowhere. That way we can keep the tabs together - try LastWebsitePostURL := driver.URL -} -; -------------------------------SChrome_Get------------------------------- -SChrome_Get(URL := "", Profile := "Profile 1", IP_Port := "127.0.0.1:9222"){ - IP_Port_Nr := RegExReplace(IP_Port, ".*:(\d*)", "$1") - if WinExist("ahk_exe Chrome.exe"){ - WinGet, pid, PID, ahk_exe chrome.exe - for item in ComObjGet("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId='" pid "'"){ - if RegExMatch(item.CommandLine, "i)--remote-debugging-port=\K\d+", port){ - break - } - } - - if (Port=""){ - MsgBox, 36, ,Chrome Needs to be started in debugging mode in order for Autohotkey to connect to it.`nIs it ok to restart Chrome in debugmode to enable a connection? - IfMsgBox, Yes - { - Message = Restarting Chrome in Debug Mode - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") + ; -------------------------------SChrome_Get------------------------------- + SChrome_Get(URL := "", Profile := "Profile 1", IP_Port := "127.0.0.1:9222"){ + IP_Port_Nr := RegExReplace(IP_Port, ".*:(\d*)", "$1") + if WinExist("ahk_exe Chrome.exe"){ + WinGet, pid, PID, ahk_exe chrome.exe + for item in ComObjGet("winmgmts:").ExecQuery("SELECT * FROM Win32_Process WHERE ProcessId='" pid "'"){ + if RegExMatch(item.CommandLine, "i)--remote-debugging-port=\K\d+", port){ + break + } + } - While(WinExist("ahk_exe chrome.exe")) { - WinClose, ahk_exe chrome.exe + if (Port=""){ + MsgBox, 36, ,Chrome Needs to be started in debugging mode in order for Autohotkey to connect to it.`nIs it ok to restart Chrome in debugmode to enable a connection? + IfMsgBox, Yes + { + Message = Restarting Chrome in Debug Mode + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") + + While(WinExist("ahk_exe chrome.exe")) { + WinClose, ahk_exe chrome.exe + } + Process, WaitClose, chrome.exe + } + Else{ + Msgbox, 4096, Error, Cannot connect to Chrome profile if it is Not running in debug mode. Script Terminating + ExitApp + ; @todo: Make this error out to the script result screen + } + } } - Process, WaitClose, chrome.exe - } - Else{ - Msgbox, 4096, Error, Cannot connect to Chrome profile if it is Not running in debug mode. Script Terminating - ExitApp - ; @todo: Make this error out to the script result screen - } - } - } - ; ; Establish Variable with Filepath to be used throughout the script - ; if(ChromeFilepath = ""){ - if(FileExist("C:\Program Files\Google\Chrome\Application\chrome.exe")){ - ChromeFilepath = C:\Program Files\Google\Chrome\Application\chrome.exe - } - else if (FileExist("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe")){ - ChromeFilepath = C:\Program Files (x86)\Google\Chrome\Application\chrome.exe - } + ; ; yuriy's settings + ; IniRead, ChromeFilepath, C:\Users\%A_username%\Documents\Autohotkey\Lib\ScriptSettings.ini, Selenium, %A_Computername%, %A_Space% + ; ; Establish Variable with Filepath to be used throughout the script + ; if(ChromeFilepath = ""){ + if(FileExist("C:\Program Files\Google\Chrome\Application\chrome.exe")){ + ChromeFilepath = C:\Program Files\Google\Chrome\Application\chrome.exe + } + else if (FileExist("C:\Program Files (x86)\Google\Chrome\Application\chrome.exe")){ + ChromeFilepath = C:\Program Files (x86)\Google\Chrome\Application\chrome.exe + } + - if(ChromeFilepath = ""){ - Message = Failed to find chrome.exe in the usual locations. - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") - MsgBox 0x30, Error!, Unable to find Chrome.exe in the usual locations. `nScript Exiting. - ExitApp - } - - if(!winExist("ahk_exe chrome.exe")){ - message = %ChromeFilepath% --remote-debugging-port=%IP_Port_Nr% %URL% - ; Clipboard := Message - ; DevModeMsgBox(message) - run, %ChromeFilepath% --remote-debugging-port=%IP_Port_Nr% %URL% - } + if(ChromeFilepath = ""){ + Message = Failed to find chrome.exe in the usual locations. + SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,DiscordErrorLogging") + MsgBox 0x30, Error!, Unable to find Chrome.exe in the usual locations. `nScript Exiting. + ExitApp + } - ; Driver.Timeout := 1000 - Driver := ComObjCreate("Selenium.ChromeDriver") - Driver.SetCapability("debuggerAddress", IP_Port) + if(!winExist("ahk_exe chrome.exe")){ + run, %ChromeFilepath% --remote-debugging-port=%IP_Port_Nr% %URL% + } - SaveOrPostProgress(Message:="Trying to connect to Chrome.`nIf stuck here check for dialog popups in one of your tabs `nOR your ChromeDriver version`nClose chrome to break out of program being stuck.",PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar") - - ; set selenium timeout to 1 second, instead of default 5 seconds + Driver := ComObjCreate("Selenium.ChromeDriver") + Driver.SetCapability("debuggerAddress", IP_Port) + try Driver.Start() + catch e { + ShowSeleniumErrorMsgbox() - try Driver.Start() - catch e { - ShowSeleniumErrorMsgbox() - } + } ; end of catch - return Driver - } - ; -------------------------------/SChrome_Get------------------------------- + ; Save current chrome version to ini file + return Driver + } + ; -------------------------------/SChrome_Get------------------------------- + + ShowSeleniumErrorMsgbox(){ + GetChromeVersionCommand = powershell (Get-Item '%ChromeFilepath%').VersionInfo.ProductVersion + Chromeversion := RunCMD(GetChromeVersionCommand) + ChromeVersion := StrReplace(ChromeVersion, "`n", "") + + ; Clipboard := ChromeVersion + ; Msgbox % "Chromeversion: " Chromeversion + IniRead, PreviousWorkingChromeVersion, Settings.ini, Misc, ChromeVersion, %A_Space% + ; IniWrite, %ChromeVersion%, Settings.ini, Misc, ChromeVersion + ; msgbox, failed to connect to Chrome for some reason. + ; Message = Failed to Connect to Chrome. Most likely problem is either Chrome has some sort of dialogue box open or ChromeDriver needs to be updated. + ; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + + OnMessage(0x44, "OnMsgBoxChromeDriverFailed") + MsgBox 0x40043, Error, Failed to Connect to Chrome. `nMost likely issue is either Chrome has some sort of dialogue box open or ChromeDriver needs to be updated.`n`nClick "Reload" to reload the script to try again`nClick "ChromeDriver" to open up the ChromeDriver download page. `n`nClick "Instructions" to open up .pdf file with instructions for updating chromedriver.exe`n`nPossibly Helpful Info:`nCurrent Chrome Version: %Chromeversion%Chrome Version of Last Successfull Upload: %PreviousWorkingChromeVersion% + OnMessage(0x44, "") + + IfMsgBox Yes, { + ; Reload script + Reload + } Else IfMsgBox No, { + run, https://chromedriver.chromium.org/downloads + ExitApp + ; open chromedriver site + } Else IfMsgBox Cancel, { + URL = https://freedomainplaylists.com/wp-content/FreedomainScripts/Update`%20Selenium`%20ChromeDriver.pdf + Filepath = %A_ScriptDir%\Lib\Update Selenium ChromeDriver.pdf + if(!FileExist(Filepath)){ + UrlDownloadToFile, %URL%, %Filepath% + + run, %Filepath% + } + ExitApp + + } + } + + + ; -------------------------------HasVal------------------------------- + ; Function needed for finding a value in an array + HasVal(haystack, needle) + { + if !(IsObject(haystack)) || (haystack.Length() = 0) + return 0 + for index, value in haystack + if (value = needle) + return index + return 0 + } + ; -------------------------------/HasVal------------------------------- + + HasSubstringVal(haystack, needle) + { + if !(IsObject(haystack)) || (haystack.Length() = 0) + return 0 + for index, value in haystack + if (InStr(value, Needle)) + return index + return 0 + } - ShowSeleniumErrorMsgbox(){ - GetChromeVersionCommand = powershell (Get-Item '%ChromeFilepath%').VersionInfo.ProductVersion - Chromeversion := RunCMD(GetChromeVersionCommand) - ChromeVersion := StrReplace(ChromeVersion, "`n", "") + ; SubStr(String, StartingPos [, Length]) - Message = Failed to connect to Chrome - SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") + ; InStr(value, Needle) -/* - ; check for alert popup - try alertText := driver.SwitchToAlert().Text - ; DevModeMsgBox(alertText) - if(alertText){ - Message = Alert Popup Text: %alertText% - SaveOrPostProgress(Message:=Message,PostType:="ErrorLoggingTextFile,ErrorSummaryVar") - SaveOrPostProgress(Message:="Chrome stuck on alert popup",PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - DevModeMsgBox("alert popup found") - } - */ - ; Msgbox % "alertText: " alertText - ; Clipboard := ChromeVersion - ; Msgbox % "Chromeversion: " Chromeversion - IniRead, PreviousWorkingChromeVersion, Settings.ini, Misc, ChromeVersion, %A_Space% - ; IniWrite, %ChromeVersion%, Settings.ini, Misc, ChromeVersion - ; msgbox, failed to connect to Chrome for some reason. - ; Message = Failed to Connect to Chrome. Most likely problem is either Chrome has some sort of dialogue box open or ChromeDriver needs to be updated. - ; SaveOrPostProgress(Message:=Message,PostType:="Tooltip,ErrorLoggingTextFile,ErrorSummaryVar,DiscordErrorLogging") - OnMessage(0x44, "OnMsgBoxChromeDriverFailed") - MsgBox 0x40043, Error, Failed to Connect to Chrome. `nMost likely issue is either Chrome has some sort of dialogue box open or ChromeDriver needs to be updated.`n`nClick "Reload" to reload with your Last Post`nClick "ChromeDriver" to open up the ChromeDriver download page. `n`nClick "Instructions" to open up installation instructions in your default browser.`n`n Information:`nCurrent Chrome Version: %Chromeversion%Chrome Version of Last Successfull Upload: %PreviousWorkingChromeVersion% - OnMessage(0x44, "") - IfMsgBox Yes, { - ; Reload script - Reload - } Else IfMsgBox No, { - run, https://chromedriver.chromium.org/downloads - run, "%A_ScriptFullPath%" "LastPost" - ExitApp - ; open chromedriver site - } Else IfMsgBox Cancel, { - run, "https://git.zinchuk.xyz/yuriy/Freedomain-Social-Media-Poster#installation" - run, "%A_ScriptFullPath%" "LastPost" - ExitApp - } - } + ; -------------------------------FileXPro Get File Attributes------------------------------- + ;https://www.autohotkey.com/boards/viewtopic.php?t=59882 + Filexpro( sFile := "", Kind := "", P* ) { ; v.90 By SKAN on D1CC @ goo.gl/jyXFo9 + Local + Static xDetails - ; -------------------------------HasVal------------------------------- - ; Function needed for finding a value in an array - HasVal(haystack, needle) - { - if !(IsObject(haystack)) || (haystack.Length() = 0) - return 0 - for index, value in haystack - if (value = needle) - return index - return 0 - } - ; -------------------------------/HasVal------------------------------- + If ( sFile = "" ) + { ; Deinit static variable + xDetails := "" + Return + } - HasSubstringVal(haystack, needle) - { - if !(IsObject(haystack)) || (haystack.Length() = 0) - return 0 - for index, value in haystack - if (InStr(value, Needle)) - return index - return 0 - } + fex := {}, _FileExt := "" - ; SubStr(String, StartingPos [, Length]) + Loop, Files, % RTrim(sfile,"\*/."), DF + { + If not FileExist( sFile:=A_LoopFileLongPath ) + { + Return + } - ; InStr(value, Needle) + SplitPath, sFile, _FileExt, _Dir, _Ext, _File, _Drv + If ( p[p.length()] = "xInfo" ) ; Last parameter is xInfo + { + p.Pop() ; Delete parameter + fex.SetCapacity(11) ; Make room for Extra info + fex["_Attrib"] := A_LoopFileAttrib + fex["_Dir"] := _Dir + fex["_Drv"] := _Drv + fex["_Ext"] := _Ext + fex["_File"] := _File + fex["_File.Ext"] := _FileExt + fex["_FilePath"] := sFile + fex["_FileSize"] := A_LoopFileSize + fex["_FileTimeA"] := A_LoopFileTimeAccessed + fex["_FileTimeC"] := A_LoopFileTimeCreated + fex["_FileTimeM"] := A_LoopFileTimeModified + } + Break + } + If Not ( _FileExt ) ; Filepath not resolved + { + Return + } + objShl := ComObjCreate("Shell.Application") + objDir := objShl.NameSpace(_Dir) + objItm := objDir.ParseName(_FileExt) + If ( VarSetCapacity(xDetails) = 0 ) ; Init static variable + { + i:=-1, xDetails:={}, xDetails.SetCapacity(309) - ; -------------------------------FileXPro Get File Attributes------------------------------- - ;https://www.autohotkey.com/boards/viewtopic.php?t=59882 + While ( i++ < 309 ) + { + xDetails[ objDir.GetDetailsOf(0,i) ] := i + } - Filexpro( sFile := "", Kind := "", P* ) { ; v.90 By SKAN on D1CC @ goo.gl/jyXFo9 - Local - Static xDetails + xDetails.Delete("") + } - If ( sFile = "" ) - { ; Deinit static variable - xDetails := "" - Return - } + If ( Kind and Kind <> objDir.GetDetailsOf(objItm,11) ) ; File isn't desired kind + { + Return + } - fex := {}, _FileExt := "" + i:=0, nParams:=p.Count(), fex.SetCapacity(nParams + 11) - Loop, Files, % RTrim(sfile,"\*/."), DF - { - If not FileExist( sFile:=A_LoopFileLongPath ) + While ( i++ < nParams ) { - Return - } + Prop := p[i] - SplitPath, sFile, _FileExt, _Dir, _Ext, _File, _Drv + If ( (Dot:=InStr(Prop,".")) and (Prop:=(Dot=1 ? "System":"") . Prop) ) + { + fex[Prop] := objItm.ExtendedProperty(Prop) + Continue + } - If ( p[p.length()] = "xInfo" ) ; Last parameter is xInfo - { - p.Pop() ; Delete parameter - fex.SetCapacity(11) ; Make room for Extra info - fex["_Attrib"] := A_LoopFileAttrib - fex["_Dir"] := _Dir - fex["_Drv"] := _Drv - fex["_Ext"] := _Ext - fex["_File"] := _File - fex["_File.Ext"] := _FileExt - fex["_FilePath"] := sFile - fex["_FileSize"] := A_LoopFileSize - fex["_FileTimeA"] := A_LoopFileTimeAccessed - fex["_FileTimeC"] := A_LoopFileTimeCreated - fex["_FileTimeM"] := A_LoopFileTimeModified - } - Break - } - - If Not ( _FileExt ) ; Filepath not resolved - { - Return - } - - - objShl := ComObjCreate("Shell.Application") - objDir := objShl.NameSpace(_Dir) - objItm := objDir.ParseName(_FileExt) - - If ( VarSetCapacity(xDetails) = 0 ) ; Init static variable - { - i:=-1, xDetails:={}, xDetails.SetCapacity(309) + If ( PropNum := xDetails[Prop] ) > -1 + { + fex[Prop] := ObjDir.GetDetailsOf(objItm,PropNum) + Continue + } + } - While ( i++ < 309 ) - { - xDetails[ objDir.GetDetailsOf(0,i) ] := i - } + fex.SetCapacity(-1) + Return fex - xDetails.Delete("") - } + } ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - If ( Kind and Kind <> objDir.GetDetailsOf(objItm,11) ) ; File isn't desired kind - { - Return - } - i:=0, nParams:=p.Count(), fex.SetCapacity(nParams + 11) - While ( i++ < nParams ) - { - Prop := p[i] - - If ( (Dot:=InStr(Prop,".")) and (Prop:=(Dot=1 ? "System":"") . Prop) ) - { - fex[Prop] := objItm.ExtendedProperty(Prop) - Continue - } - - If ( PropNum := xDetails[Prop] ) > -1 - { - fex[Prop] := ObjDir.GetDetailsOf(objItm,PropNum) - Continue - } - } - - fex.SetCapacity(-1) - Return fex - - } ;- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; GuiButtonIcon - ;------------------------------------------------ - GuiButtonIcon(Handle, File, Index := 1, Options := "") - { - RegExMatch(Options, "i)w\K\d+", W), (W="") ? W := 16 : - RegExMatch(Options, "i)h\K\d+", H), (H="") ? H := 16 : - RegExMatch(Options, "i)s\K\d+", S), S ? W := H := S : - RegExMatch(Options, "i)l\K\d+", L), (L="") ? L := 0 : - RegExMatch(Options, "i)t\K\d+", T), (T="") ? T := 0 : - RegExMatch(Options, "i)r\K\d+", R), (R="") ? R := 0 : - RegExMatch(Options, "i)b\K\d+", B), (B="") ? B := 0 : - RegExMatch(Options, "i)a\K\d+", A), (A="") ? A := 4 : - Psz := A_PtrSize = "" ? 4 : A_PtrSize, DW := "UInt", Ptr := A_PtrSize = "" ? DW : "Ptr" - VarSetCapacity( button_il, 20 + Psz, 0 ) - NumPut( normal_il := DllCall( "ImageList_Create", DW, W, DW, H, DW, 0x21, DW, 1, DW, 1 ), button_il, 0, Ptr ) ; Width & Height - NumPut( L, button_il, 0 + Psz, DW ) ; Left Margin - NumPut( T, button_il, 4 + Psz, DW ) ; Top Margin - NumPut( R, button_il, 8 + Psz, DW ) ; Right Margin - NumPut( B, button_il, 12 + Psz, DW ) ; Bottom Margin - NumPut( A, button_il, 16 + Psz, DW ) ; Alignment - SendMessage, BCM_SETIMAGELIST := 5634, 0, &button_il,, AHK_ID %Handle% - return IL_Add( normal_il, File, Index ) - } + ; GuiButtonIcon + ;------------------------------------------------ + GuiButtonIcon(Handle, File, Index := 1, Options := "") + { + RegExMatch(Options, "i)w\K\d+", W), (W="") ? W := 16 : + RegExMatch(Options, "i)h\K\d+", H), (H="") ? H := 16 : + RegExMatch(Options, "i)s\K\d+", S), S ? W := H := S : + RegExMatch(Options, "i)l\K\d+", L), (L="") ? L := 0 : + RegExMatch(Options, "i)t\K\d+", T), (T="") ? T := 0 : + RegExMatch(Options, "i)r\K\d+", R), (R="") ? R := 0 : + RegExMatch(Options, "i)b\K\d+", B), (B="") ? B := 0 : + RegExMatch(Options, "i)a\K\d+", A), (A="") ? A := 4 : + Psz := A_PtrSize = "" ? 4 : A_PtrSize, DW := "UInt", Ptr := A_PtrSize = "" ? DW : "Ptr" + VarSetCapacity( button_il, 20 + Psz, 0 ) + NumPut( normal_il := DllCall( "ImageList_Create", DW, W, DW, H, DW, 0x21, DW, 1, DW, 1 ), button_il, 0, Ptr ) ; Width & Height + NumPut( L, button_il, 0 + Psz, DW ) ; Left Margin + NumPut( T, button_il, 4 + Psz, DW ) ; Top Margin + NumPut( R, button_il, 8 + Psz, DW ) ; Right Margin + NumPut( B, button_il, 12 + Psz, DW ) ; Bottom Margin + NumPut( A, button_il, 16 + Psz, DW ) ; Alignment + SendMessage, BCM_SETIMAGELIST := 5634, 0, &button_il,, AHK_ID %Handle% + return IL_Add( normal_il, File, Index ) + } - ; \GuiButtonIcon - ;------------------------------------------------ + ; \GuiButtonIcon + ;------------------------------------------------ - ToggleTestingMode(){ + ToggleTestingMode(){ - IniRead, TestingMode, Settings.ini, General, TestingMode, 0 - ; Msgbox % "TestingMode: " TestingMode - if(TestingMode) - IniWrite, 0, Settings.ini, General, TestingMode - else, - IniWrite, 1, Settings.ini, General, TestingMode - } + IniRead, TestingMode, Settings.ini, General, TestingMode, 0 + ; Msgbox % "TestingMode: " TestingMode + if(TestingMode) + IniWrite, 0, Settings.ini, General, TestingMode + else, + IniWrite, 1, Settings.ini, General, TestingMode + } - ToggleManualSubmit(){ + ToggleManualSubmit(){ - IniRead, ManualSubmit, Settings.ini, General, ManualSubmit, 0 - ; Msgbox % "TestingMode: " TestingMode - if(ManualSubmit) - IniWrite, 0, Settings.ini, General, ManualSubmit - else, - IniWrite, 1, Settings.ini, General, ManualSubmit - } + IniRead, ManualSubmit, Settings.ini, General, ManualSubmit, 0 + ; Msgbox % "TestingMode: " TestingMode + if(ManualSubmit) + IniWrite, 0, Settings.ini, General, ManualSubmit + else, + IniWrite, 1, Settings.ini, General, ManualSubmit + } - ToggleDevMode(){ + ToggleDevMode(){ - IniRead, DevMode, Settings.ini, General, DevMode, 0 - ; Msgbox % "TestingMode: " TestingMode - if(DevMode) - IniWrite, 0, Settings.ini, General, DevMode - else, - IniWrite, 1, Settings.ini, General, DevMode - } + IniRead, DevMode, Settings.ini, General, DevMode, 0 + ; Msgbox % "TestingMode: " TestingMode + if(DevMode) + IniWrite, 0, Settings.ini, General, DevMode + else, + IniWrite, 1, Settings.ini, General, DevMode + } - FormatTextToJSText(Var){ ; Replaces AHK newline characters with javascript ones + FormatTextToJSText(Var){ ; Replaces AHK newline characters with javascript ones /*\b Backspace \f Form Feed \n New Line - done @@ -1494,22 +1402,13 @@ SaveDriverURLOFErrorPage(){ ; save the url of the result page. That way if a tab FindAndActivateTab(TabURL){ - ; DevModeMsgBox(TabURL) + Loop, { if(A_index = 30) break try CurrentTabTitle := driver.window.title - if(CurrentTabTitle = "") ; caused by tab being manually closed. Not sure if this is the only cause though. - { - ; DevModeMsgBox("currenttabtutle is blank") - try driver.SwitchToNextWindow - Continue - } - - ; DevModeMsgBox(CurrentTabTitle) try CurrentTabURL := driver.Url - ; DevModeMsgBox(CurrentTabURL) if(CurrentTabURL = TabURL) Break