Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ;README (INSTRUCTIONS START ON LINE 44; CODE STARTS ON LINE 169)
- ;
- ;Pastebin API Hotkeys (MS Windows only)
- ;AutoHotkey V2 32-Bit program (Compatible with 64-bit MS Windows)
- ;
- ;FEATURES:
- ;
- ;0. Correctly handles UTF-8 http request responses from pastebin.com
- ;1. Create a new paste from highlighted text (confirms overwrite if an existing
- ;filename is specified and creates timestamped backup copy locally)
- ;2. Create new pastes from highlighted files and/or folders (confirms overwrite
- ;for existing files and creates timestamped backup copies locally)(currenty
- ;supports files that match extensions .txt, .md, .ahk, .xml, .py, .pl, .php,
- ;.ps1, .js, .csv, and .tsv -- More extensions can be added by simply
- ;adjusting the regular expression on lines 760 and 773)
- ;3. Download the content of an existing paste
- ;4. Append to an existing paste (creates timestamped backup copy of original
- ;locally)(Adds a Windows new line character `r`n to separate original content and
- ;appended content)
- ;5. Backup pastes based on regular expression (creates time_stamped local folder
- ;of downloaded pastes)
- ;6. Delete pastes based on regular expression (creates timestamped backup copies
- ;stored locally)
- ;7. List all pastes
- ;8. List pastes based on regular expression
- ;9. Get a paste link for an existing paste name
- ;10. Log into Pastebin.com (automates your browser through programmatic key
- ;strokes) (currently works when Opera is default browser)
- ;
- ;HOTKEYS (numbers correspond to the above 1 through 10):
- ;
- ;1. Create new paste = ^!1 (Ctrl+Alt+1)
- ;2. Create new paste from files/folders = ^!2 (Ctrl+Alt+2)
- ;3. Download existing paste = ^!3 (Ctrl+Alt+3)
- ;4. Append to existing paste = ^!4 (Ctrl+Alt+4)
- ;5. Backup pastes = ^!5 (Ctrl+Alt+5)
- ;6. Delete pastes = ^!6 (Ctrl+Alt+6)
- ;7. List all pastes = ^!7 (Ctrl+Alt+7)
- ;8. List pastes = ^!8 (Ctrl+Alt+8)
- ;9. Get paste link = ^!9 (Ctrl+Alt+9)
- ;10. Log into pastebin = ^!0 (Ctrl+Alt+0)
- ;11. Help message = ^!h (Ctrl+Alt+h)
- ;
- ;HOW TO USE:
- ;
- ;1. Download the latest version of AutoHotkey Version 2 (as of 2019-1-23)
- ;https://www.autohotkey.com/download/2.0/AutoHotkey_2.0-a100-52515e2.zip
- ;
- ;2. Unzip the file "AutoHotkey_2.0-a100-52515e2.zip"
- ;
- ;3. Double click the folder "AutoHotkey_2.0-a100-52515e2"
- ;
- ;4. Copy the executable "AutoHotkeyU32.exe" and place it a separate folder.
- ;
- ;5. Put this file "pastebin_api.ahk" in the same folder as the
- ;"AutoHotkeyU32.exe" executable.
- ;
- ;6. Create a folder called "configuration"
- ;
- ;7. In the "configuration" folder, create the "pastebin.txt" configuration file
- ;(see lines 72-121 for more information on this step.
- ;
- ;8. In the folder containing the "AutoHotkeyU32.exe" executable, open Windows
- ;Powershell by clicking File -> Open Windows Powershell from Windows Explorer.
- ;
- ;9. Type ".\AutoHotkeyU32.exe pastebin_api.ahk"
- ;
- ;10. Use the Hotkeys in lines 32-42 to interact with the Pastebin.com API
- ;
- ;CONFIGURATION & EXTRA INFORMATION:
- ;
- ;1. Configuration information is stored in local file:
- ;configuration/pastebin.txt
- ;
- ;Please create the folder "configuration" in the same folder as the script, and
- ;then create the "pastebin.txt" configuration file in the "configuration" folder
- ;you just created.
- ;
- ;###Sample configuration configuration/pastebin.txt file (lines 81-87). Please
- ;create a similar one###
- ;api_dev_key=APIKEY
- ;api_user_name=USERNAME
- ;api_user_password=PASSWORD
- ;api_user_key=
- ;api_paste_format=text
- ;api_paste_private=2
- ;api_paste_expire_date=N
- ;#########################################################################
- ;
- ;Get your api_dev_key by logging into Pastebin.com and going to
- ;https://pastebin.com/api
- ;
- ;api_user_name is your Pastebin.com login username.
- ;
- ;api_user_password is your Pastebin.com login password.
- ;
- ;If the api_user_key is blank, the program will automatically generate it and
- ;store it after starting the program. If you already have an api_user_key, enter
- ;it after the "=" sign. No whitespace allowed.
- ;
- ;Valid api_paste_format values are available at https://pastebin.com/api
- ;An api_paste_format of "text" means "no syntax highlighting"
- ;
- ;Valid api_paste_private values are 0, 1, 2, which mean public, unlisted, and
- ;private, respectively.
- ;
- ;Value api_paste_expire_date values are the following:
- ;N = Never
- ;10M = 10 Minutes
- ;1H = 1 Hour
- ;1D = 1 Day
- ;1W = 1 Week
- ;2W = 2 Weeks
- ;1M = 1 Month
- ;6M = 6 Months
- ;1Y = 1 Year
- ;
- ;2. The program will not make any changes to existing Pastebin.com pastes
- ;without first backing up the existing file locally. If the backup fails, the
- ;thread will exit and nothing will be changed to the paste at Pastebin.com. This
- ;is important when overwriting, appending to, and deleting pastes.
- ;
- ;CURRENTLY KNOWN LIMITATIONS:
- ;
- ;1. When files are overwritten for paste or append, the original Pastebin.com
- ;link is deleted and a new link is generated and saved to the clipboard.
- ;2. Since the pastebin.com API does not support folders, please ensure that
- ;there are no files with duplicated names when using the file/folder paste hotkey
- ;(Ctrl+Alt+2). In the event that there are duplicated names and something gets
- ;deleted from pastebin.com, please check your local pastebin_backup folder for
- ;timestamped backups.
- ;3. This program only supports up to 1,000 files since this is the limitation
- ;imposed by the pastebin.com API when retrieving a list of pastes.
- ;4. This program works with UTF-8 encoded files. If your files use another
- ;encoding, strange things may happen.
- ;5. Due to the nature of the pastebin.com service, original file permissions and
- ;attributes such as modification date are not reflected in files downloaded or
- ;backed up from pastebin.com
- ;6. The pastebin.com API seems to remove trailing carriage returns and newlines
- ;from pastes, so if your paste require that these carriage returns and newlines
- ;be maintained (for example, C language files), then please be forewarned about
- ;this.
- ;
- ;SUPPORT
- ;No support is provided.
- ;
- ;LICENSE
- ;
- ;This software is completely free. You can do whatever you want with it.
- ;
- ;LEGAL DISCLAIMER
- ;
- ;Short Version
- ;USE AT YOUR OWN RISK.
- ;
- ;Long Version
- ;THIS SOFTWARE IS PROVIDED FOR THE PURPOSE OF ILLUSTRATION ONLY AND IS NOT
- ;INTENDED TO BE USED IN A PRODUCTION ENVIRONMENT.
- ;
- ;THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- ;IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- ;FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
- ;AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- ;LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- ;FROM, OUT OF OR IN CONNECTION WITH THIS SOFTWARE OR THE USE OR OTHER DEALINGS
- ;IN THIS SOFTWARE.
- ;###########CODE STARTS HERE####################
- ;#Warn ; Enable warnings to assist with detecting common errors.
- SendMode("Input") ; Recommended for new scripts due to its superior speed and reliability.
- SetWorkingDir(A_ScriptDir) ; Ensures a consistent starting directory.
- ;AUTOHOTKEY V2 32-BIT SCRIPT
- ;##########Default settings#####################
- pastebin_backup_dir := A_WorkingDir . '\pastebin_backup\'
- If !DirExist(pastebin_backup_dir)
- {
- DirCreate(pastebin_backup_dir)
- }
- ;##########Get Pastebin.com credentials#####################
- credentials_file := A_WorkingDir . '\configuration\pastebin.txt'
- If !FileExist(credentials_file)
- {
- MsgBox("You need to create your credentials file at:`n`n" . credentials_file . "`n`nCheck the help information provided at the top of the script for instructions on creating this file.")
- ExitApp()
- }
- api_dev_key := ''
- api_user_name := ''
- api_user_password := ''
- api_user_key := ''
- api_paste_format := ''
- api_paste_private := ''
- api_paste_expire_date := ''
- Loop Read, credentials_file
- {
- line := StrSplit(A_LoopReadLine, "=")
- If line[1] = 'api_dev_key'
- {
- api_dev_key := line[2]
- }
- Else If line[1] = 'api_user_name'
- {
- api_user_name := line[2]
- }
- Else If line[1] = 'api_user_password'
- {
- api_user_password := line[2]
- }
- Else If line[1] = 'api_user_key'
- {
- api_user_key := line[2]
- }
- Else If line[1] = 'api_paste_format'
- {
- api_paste_format := line[2]
- }
- Else If line[1] = 'api_paste_private'
- {
- api_paste_private := line[2]
- }
- Else If line[1] = 'api_paste_expire_date'
- {
- api_paste_expire_date := line[2]
- }
- }
- If !api_user_key
- {
- result := MsgBox("No api_user_key! Would you like to generate one? (Press Yes or No)",, "YesNo")
- If result = "Yes"
- {
- api_user_name := UriEncode(api_user_name)
- api_user_password := UriEncode(api_user_password)
- post_fields := 'api_dev_key=' . api_dev_key . '&api_user_name=' . api_user_name . '&api_user_password=' . api_user_password
- url := "https://pastebin.com/api/api_login.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- backup_file := pastebin_backup_dir . "pastebin.txt"
- response := HttpObj.ResponseText
- status := HttpObj.Status
- If status = '200'
- {
- api_user_key := response
- FileCopy(credentials_file, backup_file, '1')
- If !(FileExist(backup_file) And FileGetSize(backup_file) And CheckAgeConfig(credentials_file, backup_file))
- {
- MsgBox("Local backup of " . credentials_file . " failed! Aborting overwrite...")
- CheckKeyState()
- Exit()
- }
- FileDelete(credentials_file)
- content := "api_dev_key=" . api_dev_key . "`napi_user_name=" . api_user_name . "`napi_user_password=" . api_user_password . "`napi_user_key=" . api_user_key . "`napi_paste_format=" . api_paste_format . "`napi_paste_private=" . api_paste_private . "`napi_paste_expire_date=" . api_paste_expire_date
- FileAppend(content, credentials_file)
- MsgBox('api_user_key ' . api_user_key . ' appended to `n' . credentials_file)
- }
- Else
- {
- MsgBox("There was a problem generating the api_user_key. Make sure your credentials file is correct or try again a little later.")
- CheckKeyState()
- Exit()
- }
- }
- Else
- {
- CheckKeyState()
- Exit()
- }
- }
- ;##########Utility functions#####################
- OpenWindowPastebin(win_title, tab_title, run_command, username, password)
- {
- If WinExist(win_title)
- {
- WinActivate(win_title)
- Sleep(150)
- If WinActive(tab_title)
- {
- Loop 23
- {
- SendInput("{Tab}")
- Sleep(150)
- }
- SendInput(username)
- Sleep(500)
- SendInput("{Tab}")
- Sleep(250)
- SendInput(password)
- Sleep(500)
- SendInput("{Enter}")
- Sleep(250)
- Return
- }
- Loop 9
- {
- SendInput("{Ctrl down}{" . A_Index . "}")
- Sleep(200)
- SendInput("{Ctrl up}")
- Sleep(200)
- If WinActive(tab_title)
- {
- Loop 23
- {
- SendInput("{Tab}")
- Sleep(150)
- }
- SendInput(username)
- Sleep(500)
- SendInput("{Tab}")
- Sleep(250)
- SendInput(password)
- Sleep(500)
- SendInput("{Enter}")
- Sleep(250)
- Return
- }
- }
- Run(run_command)
- While !WinActive(tab_title)
- {
- Sleep(100)
- }
- Sleep(7000)
- Loop 23
- {
- SendInput("{Tab}")
- Sleep(150)
- }
- SendInput(username)
- Sleep(500)
- SendInput("{Tab}")
- Sleep(250)
- SendInput(password)
- Sleep(500)
- SendInput("{Enter}")
- Sleep(250)
- Return
- }
- Else
- {
- Run(run_command)
- While !WinActive(tab_title)
- {
- Sleep(100)
- }
- Sleep(7000)
- Loop 23
- {
- SendInput("{Tab}")
- Sleep(150)
- }
- SendInput(username)
- Sleep(500)
- SendInput("{Tab}")
- Sleep(250)
- SendInput(password)
- Sleep(500)
- SendInput("{Enter}")
- Sleep(250)
- Return
- }
- }
- CheckAge(file)
- {
- ; check that file modification date is < 10 seconds old
- time_now := A_Now
- file_mod_time := FileGetTime(file, "M")
- age := DateDiff(time_now, file_mod_time, "seconds")
- If age < 10
- {
- Return(True)
- }
- Else
- {
- Return(False)
- }
- }
- CheckAgeConfig(orig, copy)
- {
- ; check that file modification date is the same
- orig_mod_time := FileGetTime(orig, "M")
- copy_mod_time := FileGetTime(copy, "M")
- age := DateDiff(orig_mod_time, copy_mod_time, "seconds")
- If age = 0
- {
- Return(True)
- }
- Else
- {
- Return(False)
- }
- }
- CheckKeyState()
- {
- Sleep(1000)
- While 1
- {
- If GetKeyState("Control")
- {
- MsgBox("Control key is down")
- Continue
- }
- If GetKeyState("Alt")
- {
- MsgBox("Alt key is down")
- Continue
- }
- Break
- }
- }
- UriEncode(string)
- {
- string := RegExReplace(string, "%([025789ACD]{2})", "%25$1")
- string := RegExReplace(string, "'", "%27")
- string := RegExReplace(string, '"', "%22")
- string := RegExReplace(string, "\\", "%5C")
- string := RegExReplace(string, "\n", "%0A")
- string := RegExReplace(string, "\r", "%0D")
- string := RegExReplace(string, "\(", "%28")
- string := RegExReplace(string, "\)", "%29")
- oSC := ComObjCreate("ScriptControl")
- oSC.Language := "JScript"
- Script := 'var Encoded = encodeURIComponent(' . '"' . string . '")'
- oSC.ExecuteStatement(Script)
- string := oSC.Eval("Encoded")
- string := RegExReplace(string, "%2527", "%27")
- string := RegExReplace(string, "%2522", "%22")
- string := RegExReplace(string, "%255C", "%5C")
- string := RegExReplace(string, "%250A", "%0A")
- string := RegExReplace(string, "%250D", "%0D")
- string := RegExReplace(string, "%2528", "%28")
- string := RegExReplace(string, "%2529", "%29")
- string := RegExReplace(string, "%2525([025789ACD]{2})", "%25$1")
- Return(string)
- }
- BcryptMd5(string)
- {
- Static BCRYPT_MD5_ALGORITHM := "MD5"
- Static BCRYPT_HASH_LENGTH := "HashDigestLength"
- If !(hBCRYPT := DllCall("LoadLibrary", "str", "bcrypt.dll", "ptr"))
- throw Exception("Failed to load bcrypt.dll", -1)
- If (NT_STATUS := DllCall("bcrypt\BCryptOpenAlgorithmProvider", "ptr*", hAlgo, "ptr", &BCRYPT_MD5_ALGORITHM, "ptr", 0, "uint", 0) != 0)
- throw Exception("BCryptOpenAlgorithmProvider: " NT_STATUS, -1)
- If (NT_STATUS := DllCall("bcrypt\BCryptGetProperty", "ptr", hAlgo, "ptr", &BCRYPT_HASH_LENGTH, "uint*", cbHash, "uint", 4, "uint*", cbResult, "uint", 0) != 0)
- throw Exception("BCryptGetProperty: " NT_STATUS, -1)
- VarSetCapacity(pbInput, StrPut(string, "UTF-8"), 0) && cbInput := StrPut(string, &pbInput, "UTF-8") - 1, VarSetCapacity(pbHash, cbHash, 0)
- If (NT_STATUS := DllCall("bcrypt\BCryptHash", "ptr", hAlgo, "ptr", 0, "uint", 0, "ptr", &pbInput, "uint", cbInput, "ptr", &pbHash, "uint", cbHash) != 0)
- throw Exception("BCryptHash: " NT_STATUS, -1)
- Loop cbHash
- hash .= Format("{:02x}", NumGet(pbHash, A_Index - 1, "uchar"))
- DllCall("bcrypt\BCryptCloseAlgorithmProvider", "ptr", hAlgo, "uint", 0)
- DllCall("FreeLibrary", "ptr", hBCRYPT)
- Return(hash)
- }
- ;#########Pastebin hotkeys###################
- ; Pastebin API paste
- ^!1::
- global api_dev_key
- global api_user_key
- global api_paste_format
- global api_paste_private
- global api_paste_expire_date
- global pastebin_backup_dir
- old_clipboard := ClipboardAll
- Clipboard := ""
- SendInput("^c")
- Clipwait(1.0)
- If ErrorLevel
- {
- MsgBox("Clipboard operation failed!")
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- api_paste_code := Clipboard ; content of the paste
- ; Get api_paste_name
- Gui := GuiCreate(, "Create filename for Pastebin paste")
- Gui.Add("Text",, "Please name the file:")
- Gui.Add("Edit", "w400 vsearch")
- Gui.Add("Button", "default", "OK").OnEvent("Click", () => ProcessUserInputPaste(Gui))
- Gui.Add("Button", "x+5", "Cancel").OnEvent("Click", () => CancelUserInputPaste(Gui))
- Gui.OnEvent("Close", "ProcessUserInputPaste")
- Gui.OnEvent("Close", "CancelUserInputPaste")
- Gui.Show()
- Sleep(300)
- ProcessUserInputPaste(this)
- {
- global api_paste_code ; required global
- saved := this.Submit() ; Save the contents of named controls into an object.
- api_paste_name := saved.search
- ; Check to see if the file already exists by calling API for existing pastes
- api_results_limit := '1000'
- api_option := 'list'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_results_limit=' . api_results_limit
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in file listing! Error code: " . status)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"paste"))
- {
- MsgBox("Could not get list of pastes to compare file names.`nStatus = " . status . "`nPlease make sure your configuration file is correct.`n" . response)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- ; Check to see if the file name already exists
- api_paste_key := '' ; We will extract this in order to use it when backing up and overwriting files
- start_pos := 1
- find_pos := ''
- matches := []
- regexp := 's)<paste_key>.*?</paste_title>'
- Loop
- {
- find_pos := RegExMatch(response, regexp, match, start_pos)
- If find_pos
- {
- matches.Push(match[0])
- start_pos := match.Pos(0) + match.Len(0)
- }
- } Until find_pos = 0
- exists := 0
- Loop matches.Length()
- {
- string := matches[A_Index]
- api_paste_name_regex := RegExReplace(api_paste_name, "([\.\^\$\*\+\?\(\)\[\{\\\|])", '\$1')
- If RegExMatch(string, '<paste_title>' . api_paste_name_regex . '</paste_title>')
- {
- match_pos := RegExMatch(string, '<paste_key>(.*?)</paste_key>', match)
- api_paste_key := match[1]
- exists := 1
- Break
- }
- }
- If exists
- {
- result := MsgBox("The file already exists! Would you like to overwrite it? (Press Yes or No)",, "YesNo")
- If result = "Yes"
- {
- ; Create local backup
- api_option := 'show_paste'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_paste_key=' . api_paste_key
- url := "https://pastebin.com/api/api_raw.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in file backup! Error code: " . status . "`nOriginal file not overwritten.")
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- ; Decode bytes (WinHttp.WinHttpRequest.5.1 ResponseText wrongly decodes encoding)
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- ; Write paste to local backup directory
- backup_file := pastebin_backup_dir . api_paste_name
- t := A_NOW
- ts := FormatTime(t, "_yyyyMMdd-HHmmss")
- backup_file := RegExReplace(backup_file, '(.*?)(\.[^.]*$)', '$1' . ts . '$2')
- FileDelete(backup_file)
- FileAppend(response, backup_file, "UTF-8")
- If !(FileExist(backup_file) And CheckAge(backup_file))
- {
- MsgBox("Local backup of " . api_paste_name . "failed! Aborting overwrite...")
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- ; Delete paste (Irreversible in event of interruption between delete and paste!)
- api_option := 'delete'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_paste_key=' . api_paste_key
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- response := HttpObj.ResponseText
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure deleting file for overwrite! Error code: " . status . "`nOriginal file not overwritten.")
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"removed"))
- {
- MsgBox("Overwrite failure occurred! File not overwritten.`n" . response)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- }
- Else
- {
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- }
- ; Create paste
- api_option := 'paste'
- api_paste_name := UriEncode(api_paste_name)
- api_paste_code := UriEncode(api_paste_code)
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_paste_private=' . api_paste_private . '&api_paste_name=' . api_paste_name . '&api_paste_expire_date=' . api_paste_expire_date . '&api_paste_format=' . api_paste_format . '&api_dev_key=' . api_dev_key . '&api_paste_code=' . api_paste_code
- ;MsgBox(post_fields)
- ;Exit()
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- response := HttpObj.ResponseText
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in paste! Error code: " . status . "`nPlease check your backup folder if the previous version of the file was deleted from pastebin.com")
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"pastebin"))
- {
- MsgBox("Paste failure occurred! File not pasted to Pastebin.com.`nPlease make sure your configuration file is correct.`n" . response . "`nPlease check your backup folder if the previous version of the file was deleted from pastebin.com")
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- Else
- {
- Clipboard := response ; send paste link to the clipboard
- MsgBox("Sucessfully pasted!" . response . "`nPaste link copied to clipboard")
- CheckKeyState()
- Exit()
- }
- }
- CancelUserInputPaste(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- Return
- ; Folder and file paste
- ^!2::
- global api_dev_key
- global api_user_key
- global api_paste_format
- global api_paste_private
- global api_paste_expire_date
- global pastebin_backup_dir
- old_clipboard := ClipboardAll
- Clipboard := ""
- SendInput("^c")
- Clipwait(1.0)
- If ErrorLevel
- {
- MsgBox("Clipboard operation failed!")
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- files := []
- files_unique := {}
- Loop Parse, Clipboard, "`n", "`r"
- {
- If !InStr(FileGetAttrib(A_LoopField), "D")
- {
- If RegExMatch(A_LoopField, "\.txt$|\.md$|\.ahk$|\.p[ylhs][p1]?$|\.html?$|\.js$|\.[ct]sv$")
- {
- files.Push(A_LoopField)
- RegExMatch(A_LoopField, "[^\\]*$", match) ; get file name only (no path)
- files_unique[match[0]] := 1
- }
- }
- Else
- {
- Loop Files, A_LoopField . "\*.*", "FDR"
- {
- If !InStr(FileGetAttrib(A_LoopFileFullPath), "D")
- {
- If RegExMatch(A_LoopFileFullPath, "\.txt$|\.md$|\.ahk$|\.p[ylhs][p1]?$|\.html?$|\.js$|\.[ct]sv$")
- {
- files.Push(A_LoopFileFullPath)
- RegExMatch(A_LoopFileFullPath, "[^\\]*$", match) ; get file name only
- files_unique[match[0]] := 1
- }
- }
- }
- }
- }
- ; If there are no files with duplicate names, we can grab the list only once
- ; So we need to create a flag
- list_flag := 0
- list_loop := 1
- If files.Length() = files_unique.Length()
- {
- ; No duplicate names
- list_flag := 1
- }
- paste_results := '' ; summary of files pasted
- paste_count := 0
- paste_errors := 0
- duplicate_results := '' ; summary of files with duplicate content (not overwritten or re-pasted)
- duplicate_count := 0
- list_matches := []
- Loop files.Length()
- {
- match_pos := RegExMatch(files[A_Index], "[^\\]*$", match) ; get file name only (no path)
- api_paste_name := match[0]
- api_paste_code := FileRead(files[A_Index], "UTF-8")
- ; NEED TO STRIP OFF NEWLINES BECAUSE PASTEBIN.COM STRIPS OFF ALL TRAILING NEWLINES FROM API-BASED PASTES
- api_paste_code_stripped := RegExReplace(api_paste_code, '(?:\r?\n)*$', '')
- api_paste_code_md5 := BcryptMd5(api_paste_code_stripped) ; for checking file content
- ; Check to see if the file already exists by calling API for existing pastes
- If list_loop
- {
- api_results_limit := '1000'
- api_option := 'list'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_results_limit=' . api_results_limit
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- status := HttpObj.Status
- If !status = '200'
- {
- result := MsgBox("Http request failure in file listing for " . api_paste_name . "! Error code: " . status . "`nPlease make sure your configuration file is correct.`nDo you want to try to continue pasting the rest of the files? This error may occur repeatedly.",, "YesNo")
- If result = "Yes"
- {
- paste_errors++
- Continue
- }
- Else
- {
- Clipboard := old_clipboard
- paste_results := paste_count . " file(s) were pasted to pastebin.com with " . ++paste_errors . " error(s)!`n" . paste_results . "`n" . duplicate_count . " duplicate(s)`n" . duplicate_results
- MsgBox(paste_results)
- CheckKeyState()
- Exit()
- }
- }
- If !(InStr(response,"paste"))
- {
- result := MsgBox("Could not get list of pastes to compare file names for " . api_paste_name . "! Error code: " . status . "`nPlease make sure your configuration file is correct.`nResponse: " . response . "`nDo you want to try to continue pasting the rest of the files? This error may occur repeatedly.",, "YesNo")
- If result = "Yes"
- {
- paste_errors++
- Continue
- }
- Else
- {
- Clipboard := old_clipboard
- paste_results := paste_count . " file(s) were pasted to pastebin.com with " . ++paste_errors . " error(s)!`n" . paste_results . "`n" . duplicate_count . " duplicate(s)`n" . duplicate_results
- MsgBox(paste_results)
- CheckKeyState()
- Exit()
- }
- }
- ; Check to see if the file name already exists
- api_paste_key := '' ; We will extract this in order to use it when backing up and overwriting files
- start_pos := 1
- find_pos := ''
- list_matches := []
- regexp := 's)<paste_key>.*?</paste_title>'
- Loop
- {
- find_pos := RegExMatch(response, regexp, match, start_pos)
- If find_pos
- {
- list_matches.Push(match[0])
- start_pos := match.Pos(0) + match.Len(0)
- }
- } Until find_pos = 0
- If list_flag
- {
- list_loop := 0
- }
- }
- exists := 0
- Loop list_matches.Length()
- {
- string := list_matches[A_Index]
- api_paste_name_regex := RegExReplace(api_paste_name, "([\.\^\$\*\+\?\(\)\[\{\\\|])", '\$1')
- If RegExMatch(string, '<paste_title>' . api_paste_name_regex . '</paste_title>')
- {
- match_pos := RegExMatch(string, '<paste_key>(.*?)</paste_key>', match)
- api_paste_key := match[1]
- exists := 1
- Break
- }
- }
- If exists = 1
- {
- ; Get paste content from pastebin.com to check md5 and possibly backup and overwrite
- api_option := 'show_paste'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_paste_key=' . api_paste_key
- url := "https://pastebin.com/api/api_raw.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- status := HttpObj.Status
- If !status = '200'
- {
- result := MsgBox("Http request failure while checking for duplicate files for " . api_paste_name . "! Error code: " . status "`nOriginal file not overwritten.`nDo you want to try to continue pasting the rest of the files? This error may occur repeatedly.",, "YesNo")
- If result = "Yes"
- {
- paste_errors++
- Continue
- }
- Else
- {
- Clipboard := old_clipboard
- paste_results := paste_count . " file(s) were pasted to pastebin.com with " . ++paste_errors . " error(s)!`n" . paste_results . "`n" . duplicate_count . " duplicate(s)`n" . duplicate_results
- MsgBox(paste_results)
- CheckKeyState()
- Exit()
- }
- }
- ; Decode bytes (WinHttp.WinHttpRequest.5.1 ResponseText wrongly decodes encoding)
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- ; Get and check md5
- response_md5 := BcryptMd5(response)
- If response_md5 = api_paste_code_md5
- {
- ; Paste content is the same. Don't backup or re-paste
- duplicate_count++
- duplicate_results .= A_Tab . api_paste_name . "`n"
- Continue
- }
- result := MsgBox(api_paste_name . " already exists! Would you like to overwrite it? (Press Yes or No)",, "YesNo")
- If result = "Yes"
- {
- ; Write paste to local backup directory
- backup_file := pastebin_backup_dir . api_paste_name
- t := A_NOW
- ts := FormatTime(t, "_yyyyMMdd-HHmmss")
- backup_file := RegExReplace(backup_file, '(.*?)(\.[^.]*$)', '$1' . ts . '$2')
- FileDelete(backup_file)
- FileAppend(response, backup_file, "UTF-8")
- If !(FileExist(backup_file) And CheckAge(backup_file))
- {
- result := MsgBox("Local backup of " . api_paste_name . "failed! Aborting overwrite. Do you want to try to continue pasting the rest of the files? This error may occur repeatedly.",, "YesNo")
- If result = "Yes"
- {
- paste_errors++
- Continue
- }
- Else
- {
- Clipboard := old_clipboard
- paste_results := paste_count . " file(s) were pasted to pastebin.com with " . ++paste_errors . " error(s)!`n" . paste_results . "`n" . duplicate_count . " duplicate(s)`n" . duplicate_results
- MsgBox(paste_results)
- CheckKeyState()
- Exit()
- }
- }
- ; Delete paste (Irreversible in event of interruption between delete and paste!)
- api_option := 'delete'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_paste_key=' . api_paste_key
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- response := HttpObj.ResponseText
- status := HttpObj.Status
- If !status = '200'
- {
- result := MsgBox("Http request failure deleting " . api_paste_name . " for overwrite! Error code: " . status . "`nDo you want to try to continue pasting the rest of the files? This error may occur repeatedly.",, "YesNo")
- If result = "Yes"
- {
- paste_errors++
- Continue
- }
- Else
- {
- Clipboard := old_clipboard
- paste_results := paste_count . " file(s) were pasted to pastebin.com with " . ++paste_errors . " error(s)!`n" . paste_results . "`n" . duplicate_count . " duplicate(s)`n" . duplicate_results
- MsgBox(paste_results)
- CheckKeyState()
- Exit()
- }
- }
- If !(InStr(response,"removed"))
- {
- result := MsgBox("Overwrite failure occurred for " . api_paste_name . " ! File not overwritten.`nResponse: " . response . "`nDo you want to try to continue pasting the rest of the files? This error may occur repeatedly.",, "YesNo")
- If result = "Yes"
- {
- paste_errors++
- Continue
- }
- Else
- {
- Clipboard := old_clipboard
- paste_results := paste_count . " file(s) were pasted to pastebin.com with " . ++paste_errors . " error(s)!`n" . paste_results . "`n" . duplicate_count . " duplicate(s)`n" . duplicate_results
- MsgBox(paste_results)
- CheckKeyState()
- Exit()
- }
- }
- }
- Else
- {
- Continue ; keep processing the rest of the files
- }
- }
- ; Create paste
- api_option := 'paste'
- paste_name := api_paste_name
- api_paste_name := UriEncode(api_paste_name)
- api_paste_code := UriEncode(api_paste_code)
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_paste_private=' . api_paste_private . '&api_paste_name=' . api_paste_name . '&api_paste_expire_date=' . api_paste_expire_date . '&api_paste_format=' . api_paste_format . '&api_dev_key=' . api_dev_key . '&api_paste_code=' . api_paste_code
- ;MsgBox(post_fields)
- ;Exit()
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- response := HttpObj.ResponseText
- status := HttpObj.Status
- If !status = '200'
- {
- result := MsgBox("Http request failure in paste for " . paste_name . " ! Error code: " . status . "`nDo you want to try to continue pasting the rest of the files? This error may occur repeatedly.",, "YesNo")
- If result = "Yes"
- {
- paste_errors++
- Continue
- }
- Else
- {
- Clipboard := old_clipboard
- paste_results := paste_count . " file(s) were pasted to pastebin.com with " . ++paste_errors . " error(s)!`n" . paste_results . "`n" . duplicate_count . " duplicate(s)`n" . duplicate_results
- MsgBox(paste_results)
- CheckKeyState()
- Exit()
- }
- }
- If !(InStr(response,"pastebin"))
- {
- result := MsgBox("Paste failure occurred for " . paste_name . " ! Error code: " . status . "`nResponse: " . response . "`nDo you want to try to continue pasting the rest of the files? This error may occur repeatedly.",, "YesNo")
- If result = "Yes"
- {
- paste_errors++
- Continue
- }
- Else
- {
- Clipboard := old_clipboard
- paste_results := paste_count . " file(s) were pasted to pastebin.com with " . ++paste_errors . " error(s)!`n" . paste_results . "`n" . duplicate_count . " duplicate(s)`n" . duplicate_results
- MsgBox(paste_results)
- CheckKeyState()
- Exit()
- }
- }
- Else
- {
- paste_results .= A_Tab . paste_name . ":" . A_Tab . response . "`n"
- paste_count++
- }
- }
- paste_results := "Results summary (also copied to your computer's clipboard):`n`n" . paste_count . " file(s) were pasted to pastebin.com with " . paste_errors . " error(s)!`n" . paste_results . "`n" . duplicate_count . " duplicate(s)`n" . duplicate_results
- Clipboard := paste_results
- MsgBox(paste_results)
- CheckKeyState()
- Return
- ; Pastebin API grab content to clipboard
- ^!3::
- global api_dev_key
- global api_user_key
- ; Get api_paste_name
- Gui := GuiCreate(, "Enter filename for Pastebin download")
- Gui.Add("Text",, "Please enter the filename:")
- Gui.Add("Edit", "w400 vsearch")
- Gui.Add("Button", "default", "OK").OnEvent("Click", () => ProcessUserInputDownload(Gui))
- Gui.Add("Button", "x+5", "Cancel").OnEvent("Click", () => CancelUserInputDownload(Gui))
- Gui.OnEvent("Close", "ProcessUserInputDownload")
- Gui.OnEvent("Close", "CancelUserInputDownload")
- Gui.Show()
- Sleep(300)
- ProcessUserInputDownload(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- api_paste_name := saved.search
- ; Check to see if the file exists by calling API for existing pastes
- api_results_limit := '1000'
- api_option := 'list'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_results_limit=' . api_results_limit
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in file listing! Error code: " . status . "`nPlease make sure your configuration file is correct.")
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"paste"))
- {
- MsgBox("Could not get list of pastes to compare file names.`nPlease make sure your configuration file is correct.`n" . response)
- CheckKeyState()
- Exit()
- }
- ; Check to see if the file name already exists
- api_paste_key := '' ; We will extract this in order to use it when backing up and overwriting files
- start_pos := 1
- find_pos := ''
- matches := []
- regexp := 's)<paste_key>.*?</paste_title>'
- Loop
- {
- find_pos := RegExMatch(response, regexp, match, start_pos)
- If find_pos
- {
- matches.Push(match[0])
- start_pos := match.Pos(0) + match.Len(0)
- }
- } Until find_pos = 0
- exists := 0
- Loop matches.Length()
- {
- string := matches[A_Index]
- api_paste_name_regex := RegExReplace(api_paste_name, "([\.\^\$\*\+\?\(\)\[\{\\\|])", '\$1')
- If RegExMatch(string, '<paste_title>' . api_paste_name_regex . '</paste_title>')
- {
- match_pos := RegExMatch(string, '<paste_key>(.*?)</paste_key>', match)
- api_paste_key := match[1]
- exists := 1
- Break
- }
- }
- If exists
- {
- ; Download the paste to the clipboard
- api_option := 'show_paste'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_paste_key=' . api_paste_key
- url := "https://pastebin.com/api/api_raw.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in paste download! Error code: " . status)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- ; Decode bytes (WinHttp.WinHttpRequest.5.1 ResponseText wrongly decodes encoding)
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'utf-8'
- response := stream.ReadText()
- stream.Close()
- ; Paste to clipboard
- Clipboard := response
- MsgBox(api_paste_name . " copied to clipboard.")
- CheckKeyState()
- Exit()
- }
- Else
- {
- MsgBox(api_paste_name . " does not exist!")
- CheckKeyState()
- Exit()
- }
- }
- CancelUserInputDownload(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- Return
- ; Pastebin API paste append
- ^!4::
- global api_dev_key
- global api_user_key
- global api_paste_format
- global api_paste_private
- global api_paste_expire_date
- global pastebin_backup_dir
- api_paste_name := ''
- old_clipboard := ClipboardAll
- Clipboard := ""
- SendInput("^c")
- Clipwait(1.0)
- If ErrorLevel
- {
- MsgBox("Clipboard operation failed!")
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- api_paste_code := Clipboard ; content to append
- ; Get api_paste_name
- Gui := GuiCreate(, "Enter the filename for appending")
- Gui.Add("Text",, "Please enter the filename:")
- Gui.Add("Edit", "w400 vsearch")
- Gui.Add("Button", "default", "OK").OnEvent("Click", () => ProcessUserInputAppend(Gui))
- Gui.Add("Button", "x+5", "Cancel").OnEvent("Click", () => CancelUserInputAppend(Gui))
- Gui.OnEvent("Close", "ProcessUserInputAppend")
- Gui.OnEvent("Close", "CancelUserInputAppend")
- Gui.Show()
- Sleep(300)
- ProcessUserInputAppend(this)
- {
- global api_paste_code ; required global
- saved := this.Submit() ; Save the contents of named controls into an object.
- api_paste_name := saved.search
- ; Check to see if the file already exists by calling API for existing pastes
- api_results_limit := '1000'
- api_option := 'list'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_results_limit=' . api_results_limit
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in file listing! Error code: " . status . "`nPlease make sure your configuration file is correct.")
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"paste"))
- {
- MsgBox("Could not get list of pastes to compare file names.`nPlease make sure your configuration file is correct.`n" . response)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- ; Check to see if the filename already exists
- api_paste_key := '' ; We will extract this in order to use it when backing up and overwriting files
- start_pos := 1
- find_pos := ''
- matches := []
- regexp := 's)<paste_key>.*?</paste_title>'
- Loop
- {
- find_pos := RegExMatch(response, regexp, match, start_pos)
- If find_pos
- {
- matches.Push(match[0])
- start_pos := match.Pos(0) + match.Len(0)
- }
- } Until find_pos = 0
- exists := 0
- Loop matches.Length()
- {
- string := matches[A_Index]
- api_paste_name_regex := RegExReplace(api_paste_name, "([\.\^\$\*\+\?\(\)\[\{\\\|])", '\$1')
- If RegExMatch(string, '<paste_title>' . api_paste_name_regex . '</paste_title>')
- {
- match_pos := RegExMatch(string, '<paste_key>(.*?)</paste_key>', match)
- api_paste_key := match[1]
- exists := 1
- Break
- }
- }
- If exists
- {
- ; Create local backup
- api_option := 'show_paste'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_paste_key=' . api_paste_key
- url := "https://pastebin.com/api/api_raw.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in file backup! Error code: " . status)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- ; Decode bytes (WinHttp.WinHttpRequest.5.1 ResponseText wrongly decodes encoding)
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- ; Write paste to local backup directory
- backup_file := pastebin_backup_dir . api_paste_name
- t := A_NOW
- ts := FormatTime(t, "_yyyyMMdd-HHmmss")
- backup_file := RegExReplace(backup_file, '(.*?)(\.[^.]*$)', '$1' . ts . '$2')
- FileDelete(backup_file)
- FileAppend(response, backup_file, "UTF-8")
- If !(FileExist(backup_file) And CheckAge(backup_file))
- {
- MsgBox("Local backup of " . api_paste_name . "failed! File not updated. Aborting append...")
- Exit()
- }
- ; Update api_paste_code
- api_paste_code := response . "`r`n" . api_paste_code ; Windows new line
- ; Delete paste (Irreversible in event of interruption between delete and paste!)
- api_option := 'delete'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_paste_key=' . api_paste_key
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- response := HttpObj.ResponseText
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure during append! Original file not changed. Error code: " . status)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"removed"))
- {
- MsgBox("Append failure occurred! File not appended to.`n" . response)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- ; Create appended paste
- api_option := 'paste'
- api_paste_name := UriEncode(api_paste_name)
- api_paste_code := UriEncode(api_paste_code)
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_paste_private=' . api_paste_private . '&api_paste_name=' . api_paste_name . '&api_paste_expire_date=' . api_paste_expire_date . '&api_paste_format=' . api_paste_format . '&api_dev_key=' . api_dev_key . '&api_paste_code=' . api_paste_code
- ;MsgBox(post_fields)
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- response := HttpObj.ResponseText
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure! File not appended to and original file deleted! Please check local backup.`nError code: " . status)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"pastebin"))
- {
- MsgBox("Paste append failed! File not appended to and original file deleted! Please check local backup.`n" . response)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- Else
- {
- Clipboard := response ; copy paste link to clipboard
- MsgBox("Sucessfully appended paste!" . response . "`nPaste link copied to clipboard")
- CheckKeyState()
- Exit()
- }
- }
- Else
- {
- result := MsgBox(api_paste_name . " does not exist! Do you want to create it? (Press Yes or No)",, "YesNo")
- If result = "Yes"
- {
- ; Create paste
- api_option := 'paste'
- api_paste_name := UriEncode(api_paste_name)
- api_paste_code := UriEncode(api_paste_code)
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_paste_private=' . api_paste_private . '&api_paste_name=' . api_paste_name . '&api_paste_expire_date=' . api_paste_expire_date . '&api_paste_format=' . api_paste_format . '&api_dev_key=' . api_dev_key . '&api_paste_code=' . api_paste_code
- ;MsgBox(post_fields)
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- response := HttpObj.ResponseText
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in paste! Error code: " . status)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"pastebin"))
- {
- MsgBox("Paste failure occurred! File not pasted to Pastebin.com`n" . response)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- Else
- {
- Clipboard := response ; paste copied to clipboard
- MsgBox("Sucessfully pasted!" . response . "`nPaste link copied to clipboard")
- CheckKeyState()
- Exit()
- }
- }
- Else
- {
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- }
- }
- CancelUserInputAppend(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- Return
- ; Backup pastes based on regular expression
- ^!5::
- global api_dev_key
- global api_user_key
- ; Create backup folder
- time_stamp := A_Now
- paste_backup_dir := A_WorkingDir . '\paste_backup_' . time_stamp . '\'
- If !DirExist(paste_backup_dir)
- {
- DirCreate(paste_backup_dir)
- }
- ; Get regexp
- Gui := GuiCreate(, "Enter a search query (e.g., regex) for files to backup")
- Gui.Add("Text",, "Search query:")
- Gui.Add("Edit", "w400 vsearch")
- Gui.Add("Button", "default", "OK").OnEvent("Click", () => ProcessUserInputBackup(Gui))
- Gui.Add("Button", "x+5", "Cancel").OnEvent("Click", () => CancelUserInputBackup(Gui))
- Gui.OnEvent("Close", "ProcessUserInputBackup")
- Gui.OnEvent("Close", "CancelUserInputBackup")
- Gui.Show()
- Sleep(300)
- ProcessUserInputBackup(this)
- {
- global paste_backup_dir
- saved := this.Submit() ; Save the contents of named controls into an object.
- regexp := saved.search
- ; Get list of all pastes
- api_results_limit := '1000'
- api_option := 'list'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_results_limit=' . api_results_limit
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in file listing! Error code: " . status . "`nPlease make sure your configuration file is correct.")
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"paste"))
- {
- MsgBox("Could not get list of pastes to compare file names.`nPlease make sure your configuration file is correct.`n" . response)
- CheckKeyState()
- Exit()
- }
- ; Check to see if regexp matches any paste titles
- ; First grab titles and keys
- api_paste_key := '' ; We will extract this in order to use it when backing up
- start_pos := 1
- find_pos := ''
- matches := []
- response_regexp := 's)<paste_key>.*?</paste_title>'
- Loop
- {
- find_pos := RegExMatch(response, response_regexp, match, start_pos)
- If find_pos
- {
- matches.Push(match[0])
- start_pos := match.Pos(0) + match.Len(0)
- }
- } Until find_pos = 0
- exists := 0
- titles := []
- keys := []
- Loop matches.Length()
- {
- string := matches[A_Index]
- match_pos := RegExMatch(string, '<paste_title>(.*?)</paste_title>', title_match)
- title_match := title_match[1]
- If RegExMatch(title_match, regexp)
- {
- match_pos := RegExMatch(string, '<paste_key>(.*?)</paste_key>', match)
- keys.Push(match[1])
- ;match_pos := RegExMatch(string, '<paste_title>(.*?)</paste_title>', match)
- ;titles.Push(match[1])
- titles.Push(title_match)
- exists := 1
- }
- }
- If exists
- {
- ; Print out files that match and confirm backup
- message := "Do you want to backup all of these files?`nList of files also copied to your computer's clipboard.`n"
- Loop titles.Length()
- {
- message .= titles[A_Index] . '`n'
- }
- Clipboard := message
- result := MsgBox(message,, "YesNo")
- If result = "Yes"
- {
- ; Create local backups
- backup_count := 0
- backup_names := ""
- errors := 0
- Loop keys.Length()
- {
- api_option := 'show_paste'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_paste_key=' . keys[A_Index]
- url := "https://pastebin.com/api/api_raw.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- status := HttpObj.Status
- If !status = '200'
- {
- result := MsgBox("Http request failure in " . titles[A_Index] . " backup! Error code: " . status . "`nDo you want to continue with the rest of the backups?",, "YesNo")
- If result = "Yes"
- {
- errors++
- Continue
- }
- Else
- {
- MsgBox(backup_count . " pastes backed up from Pastebin.com.`n" . ++errors . "occurred.`nBackups stored in local timestamped backups folder:`n" . backup_names)
- CheckKeyState()
- Exit()
- }
- }
- ; Decode bytes (WinHttp.WinHttpRequest.5.1 ResponseText wrongly decodes encoding)
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- ; Write paste to local backup directory
- backup_file := paste_backup_dir . titles[A_Index]
- FileDelete(backup_file)
- FileAppend(response, backup_file, "UTF-8")
- If !(FileExist(backup_file) And CheckAge(backup_file))
- {
- result := MsgBox("Local backup of " . titles[A_Index] . "failed! File not backed up from Pastebin.com.`nDo you want to continue with the rest of the backups?",, "YesNo")
- If result = "Yes"
- {
- errors++
- Continue
- }
- Else
- {
- MsgBox(backup_count . " pastes backed up from Pastebin.com.`n" . ++errors . "occurred.`nBackups stored in local timestamped backups folder:`n" . backup_names)
- CheckKeyState()
- Exit()
- }
- }
- backup_count++
- backup_names .= '`t' . titles[A_Index] . '`n'
- }
- If backup_count = keys.Length()
- {
- MsgBox(backup_count . " pastes backed up from Pastebin.com.`nBackups stored in local timestamped backups folder:`n" . backup_names)
- }
- Else
- {
- MsgBox(backup_count . " pastes backed up from Pastebin.com.`n" . errors . "occurred.`nBackups stored in local timestamped backups folder:`n" . backup_names)
- }
- }
- Else
- {
- DirDelete(paste_backup_dir)
- MsgBox("Backup aborted by user. No pastes backed up.")
- CheckKeyState()
- Exit()
- }
- }
- Else
- {
- MsgBox("No pastes match that search query! Nothing backed up!")
- CheckKeyState()
- Exit()
- }
- }
- CancelUserInputBackup(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- CheckKeyState()
- Exit()
- }
- Return
- ; Delete pastes based on regular expression
- ^!6::
- global api_dev_key
- global api_user_key
- global pastebin_backup_dir
- ; Get regexp
- Gui := GuiCreate(, "Enter a search query (e.g., regex) for files to delete")
- Gui.Add("Text",, "Search query:")
- Gui.Add("Edit", "w400 vsearch")
- Gui.Add("Button", "default", "OK").OnEvent("Click", () => ProcessUserInputDelete(Gui))
- Gui.Add("Button", "x+5", "Cancel").OnEvent("Click", () => CancelUserInputDelete(Gui))
- Gui.OnEvent("Close", "ProcessUserInputDelete")
- Gui.OnEvent("Close", "CancelUserInputDelete")
- Gui.Show()
- Sleep(300)
- ProcessUserInputDelete(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- regexp := saved.search
- ; Get list of all pastes
- api_results_limit := '1000'
- api_option := 'list'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_results_limit=' . api_results_limit
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in file listing! Error code: " . status . "`nPlease make sure your configuration file is correct.")
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"paste"))
- {
- MsgBox("Could not get list of pastes to compare file names.`nPlease make sure your configuration file is correct.`n" . response)
- CheckKeyState()
- Exit()
- }
- ; Check to see if regexp matches any paste titles
- ; First grab titles and keys
- api_paste_key := '' ; We will extract this in order to use it when backing up and overwriting files
- start_pos := 1
- find_pos := ''
- matches := []
- response_regexp := 's)<paste_key>.*?</paste_title>'
- Loop
- {
- find_pos := RegExMatch(response, response_regexp, match, start_pos)
- If find_pos
- {
- matches.Push(match[0])
- start_pos := match.Pos(0) + match.Len(0)
- }
- } Until find_pos = 0
- exists := 0
- titles := []
- keys := []
- Loop matches.Length()
- {
- string := matches[A_Index]
- match_pos := RegExMatch(string, '<paste_title>(.*?)</paste_title>', title_match)
- title_match := title_match[1]
- If RegExMatch(title_match, regexp)
- {
- match_pos := RegExMatch(string, '<paste_key>(.*?)</paste_key>', match)
- keys.Push(match[1])
- ;match_pos := RegExMatch(string, '<paste_title>(.*?)</paste_title>', match)
- ;titles.Push(match[1])
- titles.Push(title_match)
- exists := 1
- }
- }
- If exists
- {
- ; Print out files that match and confirm delete
- message := "Do you want to delete all of these files? (Backups are still made locally.)`nList of files also copied to your computer's clipboard.`n"
- Loop titles.Length()
- {
- message .= titles[A_Index] . '`n'
- }
- Clipboard := message
- result := MsgBox(message,, "YesNo")
- If result = "Yes"
- {
- ; Create local backups
- delete_count := 0
- delete_errors := 0
- delete_names := ''
- Loop keys.Length()
- {
- api_option := 'show_paste'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_paste_key=' . keys[A_Index]
- url := "https://pastebin.com/api/api_raw.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- status := HttpObj.Status
- If !status = '200'
- {
- result := MsgBox("Http request failure in " . titles[A_Index] . " backup before delete! Error code: " . status . "`nDo you want to continue deleting the rest of the files?",, "YesNo")
- If result = "Yes"
- {
- delete_errors++
- Continue
- }
- Else
- {
- MsgBox(delete_count . " pastes deleted from Pastebin.com.`n" . ++delete_errors . "occurred.`nThe following files were deleted:`n" . delete_names)
- CheckKeyState()
- Exit()
- }
- }
- ; Decode bytes (WinHttp.WinHttpRequest.5.1 ResponseText wrongly decodes encoding)
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- ; Write paste to local backup directory
- backup_file := pastebin_backup_dir . titles[A_Index]
- t := A_NOW
- ts := FormatTime(t, "_yyyyMMdd-HHmmss")
- backup_file := RegExReplace(backup_file, '(.*?)(\.[^.]*$)', '$1' . ts . '$2')
- FileDelete(backup_file)
- FileAppend(response, backup_file, "UTF-8")
- If !(FileExist(backup_file) And CheckAge(backup_file))
- {
- result := MsgBox("Local backup of " . titles[A_Index] . "failed! File not deleted from Pastebin.com.`nDo you want to continue deleting the rest of the files?",, "YesNo")
- If result = "Yes"
- {
- delete_errors++
- Continue
- }
- Else
- {
- MsgBox(delete_count . " pastes deleted from Pastebin.com.`n" . ++delete_errors . "occurred.`nThe following files were deleted:`n" . delete_names)
- CheckKeyState()
- Exit()
- }
- }
- }
- ; Delete pastes from Pastebin.com
- Loop keys.Length()
- {
- api_option := 'delete'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_paste_key=' . keys[A_Index]
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- response := HttpObj.ResponseText
- status := HttpObj.Status
- If !status = '200'
- {
- result := MsgBox("Http request failure during delete! " . titles[A_Index] . " not deleted. Error code: " . status . "`nDo you want to continue deleting the rest of the files?", "YesNo")
- If result = "Yes"
- {
- delete_errors++
- Continue
- }
- Else
- {
- MsgBox(delete_count . " pastes deleted from Pastebin.com.`n" . ++delete_errors . "occurred.`nThe following files were deleted:`n" . delete_names)
- CheckKeyState()
- Exit()
- }
- }
- If !(InStr(response,"removed"))
- {
- result := MsgBox("Delete failure occurred! " . titles[A_Index] . " not deleted.`nResponse: " . response . "`nDo you want to continue deleting the rest of the files?", "YesNo")
- If result = "Yes"
- {
- delete_errors++
- Continue
- }
- Else
- {
- MsgBox(delete_count . " pastes deleted from Pastebin.com.`n" . ++delete_errors . "occurred.`nThe following files were deleted:`n" . delete_names)
- CheckKeyState()
- Exit()
- }
- }
- delete_count++
- delete_names .= '`t' . titles[A_Index] . '`n'
- }
- If delete_count = keys.Length()
- {
- MsgBox(delete_count . " pastes deleted from Pastebin.com.:`n" . delete_names)
- }
- Else
- {
- MsgBox(delete_count . " pastes deleted from Pastebin.com.`n" . errors . "occurred.`nThe following files were deleted:`n" . delete_names)
- }
- }
- Else
- {
- DirDelete(paste_backup_dir)
- MsgBox("Delete aborted by user. No pastes deleted.")
- CheckKeyState()
- Exit()
- }
- }
- Else
- {
- MsgBox("No pastes match that search query! Nothing deleted!")
- CheckKeyState()
- Exit()
- }
- }
- CancelUserInputDelete(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- CheckKeyState()
- Exit()
- }
- Return
- ; Show all pastes
- ^!7::
- global api_dev_key
- global api_user_key
- ; Get list of all pastes
- api_results_limit := '1000'
- api_option := 'list'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_results_limit=' . api_results_limit
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in file listing! Error code: " . status . "`nPlease make sure your configuration file is correct.")
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"paste"))
- {
- MsgBox("Could not get list of pastes to compare file names.`nPlease make sure your configuration file is correct.`n" . response)
- CheckKeyState()
- Exit()
- }
- ; Grab titles
- start_pos := 1
- find_pos := ''
- matches := []
- response_regexp := 's)<paste_key>.*?</paste_title>'
- Loop
- {
- find_pos := RegExMatch(response, response_regexp, match, start_pos)
- If find_pos
- {
- matches.Push(match[0])
- start_pos := match.Pos(0) + match.Len(0)
- }
- } Until find_pos = 0
- file_count := matches.Length()
- file_list := 'You have ' . matches.Length() . ' pastes.`n`n'
- Loop matches.Length()
- {
- string := matches[A_Index]
- match_pos := RegExMatch(string, '<paste_title>(.*?)</paste_title>', title_match)
- title_match := title_match[1]
- match_pos := RegExMatch(string, '<paste_key>(.*?)</paste_key>', key_match)
- key_match := "https://pastebin.com/" . key_match[1]
- file_list .= title_match . '`n' . key_match . '`n`n'
- }
- Clipboard := file_list
- MsgBox("You have " . file_count . " pastes.`nA list of your pastes has been copied to your clipboard.")
- Return
- ; List pastes based on regular expression
- ^!8::
- global api_dev_key
- global api_user_key
- ; Get regex for listing pastes
- Gui := GuiCreate(, "Enter search query for listing pastes")
- Gui.Add("Text",, "Please enter search query (regular expression):")
- Gui.Add("Edit", "w400 vsearch")
- Gui.Add("Button", "default", "OK").OnEvent("Click", () => ProcessUserInputList(Gui))
- Gui.Add("Button", "x+5", "Cancel").OnEvent("Click", () => CancelUserInputList(Gui))
- Gui.OnEvent("Close", "ProcessUserInputList")
- Gui.OnEvent("Close", "CancelUserInputList")
- Gui.Show()
- Sleep(300)
- ProcessUserInputList(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- regexp_search := saved.search
- ; Check to see if the file exists by calling API for existing pastes
- api_results_limit := '1000'
- api_option := 'list'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_results_limit=' . api_results_limit
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in file listing! Error code: " . status . "`nPlease make sure your configuration file is correct.")
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"paste"))
- {
- MsgBox("Could not get list of pastes to compare file names.`nPlease make sure your configuration file is correct.`n" . response)
- CheckKeyState()
- Exit()
- }
- ; Check to see if any filenames match the regular expression
- start_pos := 1
- find_pos := ''
- matches := []
- response_regexp := 's)<paste_key>.*?</paste_title>'
- Loop
- {
- find_pos := RegExMatch(response, response_regexp, match, start_pos)
- If find_pos
- {
- matches.Push(match[0])
- start_pos := match.Pos(0) + match.Len(0)
- }
- } Until find_pos = 0
- list_results := ''
- result_count := 0
- Loop matches.Length()
- {
- string := matches[A_Index]
- match_pos := RegExMatch(string, '<paste_title>(.*?)</paste_title>', title_match)
- title_match := title_match[1]
- If RegExMatch(title_match, regexp_search)
- {
- match_pos := RegExMatch(string, '<paste_key>(.*?)</paste_key>', key_match)
- key_match := "https://pastebin.com/" . key_match[1]
- list_results .= title_match . '`n' . key_match . '`n`n'
- result_count++
- }
- }
- list_results := 'You have ' . result_count . ' pastes.`n`n' . list_results
- If list_results
- {
- Clipboard := list_results
- MsgBox(result_count . ' search results copied to clipboard.')
- CheckKeyState()
- Exit()
- }
- Else
- {
- MsgBox('0 search results.')
- CheckKeyState()
- Exit()
- }
- }
- CancelUserInputList(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- CheckKeyState()
- Exit()
- }
- Return
- ; Get paste link
- ^!9::
- global api_dev_key
- global api_user_key
- ; Get api_paste_name
- Gui := GuiCreate(, "Get link for Pastebin paste")
- Gui.Add("Text",, "Please enter the file name:")
- Gui.Add("Edit", "w400 vsearch")
- Gui.Add("Button", "default", "OK").OnEvent("Click", () => ProcessUserInputLink(Gui))
- Gui.Add("Button", "x+5", "Cancel").OnEvent("Click", () => CancelUserInputLink(Gui))
- Gui.OnEvent("Close", "ProcessUserInputLink")
- Gui.OnEvent("Close", "CancelUserInputLink")
- Gui.Show()
- Sleep(300)
- ProcessUserInputLink(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- api_paste_name := saved.search
- ; Check to see if the file already exists by calling API for existing pastes
- api_results_limit := '1000'
- api_option := 'list'
- post_fields := 'api_option=' . api_option . '&api_user_key=' . api_user_key . '&api_dev_key=' . api_dev_key . '&api_results_limit=' . api_results_limit
- url := "https://pastebin.com/api/api_post.php"
- HttpObj := ComObjCreate("WinHttp.WinHttpRequest.5.1")
- HttpObj.Open("POST", url)
- HttpObj.SetRequestHeader("Content-Type","application/x-www-form-urlencoded")
- HttpObj.Send(post_fields)
- ; Check response
- stream := ComObjCreate("adodb.stream")
- stream.Type := 1
- stream.Mode := 3
- stream.Open()
- stream.Write(HttpObj.ResponseBody) ; get bytes from ResponseBody
- stream.Position := 0
- stream.Type := 2
- stream.Charset := 'UTF-8'
- response := stream.ReadText()
- stream.Close()
- status := HttpObj.Status
- If !status = '200'
- {
- MsgBox("Http request failure in file listing! Error code: " . status . "`nPlease make sure your configuration file is correct.")
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- If !(InStr(response,"paste"))
- {
- MsgBox("Could not get list of pastes to compare file names.`nPlease make sure your configuration file is correct.`n" . response)
- Clipboard := old_clipboard
- CheckKeyState()
- Exit()
- }
- ; Check to see if the file name already exists
- api_paste_key := '' ; We will extract this in order to use it when backing up and overwriting files
- start_pos := 1
- find_pos := ''
- matches := []
- regexp := 's)<paste_key>.*?</paste_title>'
- Loop
- {
- find_pos := RegExMatch(response, regexp, match, start_pos)
- If find_pos
- {
- matches.Push(match[0])
- start_pos := match.Pos(0) + match.Len(0)
- }
- } Until find_pos = 0
- exists := 0
- Loop matches.Length()
- {
- string := matches[A_Index]
- api_paste_name_regex := RegExReplace(api_paste_name, "([\.\^\$\*\+\?\(\)\[\{\\\|])", '\$1')
- If RegExMatch(string, '<paste_title>' . api_paste_name_regex . '</paste_title>')
- {
- match_pos := RegExMatch(string, '<paste_key>(.*?)</paste_key>', match)
- api_paste_key := match[1]
- exists++
- }
- }
- If exists = 1
- {
- Clipboard := "https://pastebin.com/" . api_paste_key
- MsgBox("The link has been copied to the clipboard.`n" . Clipboard)
- CheckKeyState()
- Exit()
- }
- Else If exists > 1
- {
- MsgBox("More than 1 file with the same name exists. Please check your Pastebin.com pastes.")
- CheckKeyState()
- Exit()
- }
- Else
- {
- MsgBox("That file does not exist")
- CheckKeyState()
- Exit()
- }
- }
- CancelUserInputLink(this)
- {
- saved := this.Submit() ; Save the contents of named controls into an object.
- CheckKeyState()
- Exit()
- }
- Return
- ; Login to Pastebin.com (Default browser is Opera)
- ^!0::
- global api_user_name
- global api_user_password
- win_title := "ahk_class Chrome_WidgetWin_1" ; Opera (found with Window Spy)
- tab_title := "Pastebin.com - Login Page"
- run_command := "https://pastebin.com/login"
- OpenWindowPastebin(win_title, tab_title, run_command, api_user_name, api_user_password)
- CheckKeyState()
- Return
- ; Help message
- ^!h::
- help_message := "1. Create new paste = ^!1 (Ctrl+Alt+1)`n2. Create new paste from files/folders = ^!2 (Ctrl+Alt+2)`n3. Download existing paste = ^!3 (Ctrl+Alt+3)`n4. Append to existing paste = ^!4 (Ctrl+Alt+4)`n5. Backup pastes = ^!5 (Ctrl+Alt+5)`n6. Delete pastes = ^!6 (Ctrl+Alt+6)`n7. List all pastes = ^!7 (Ctrl+Alt+7)`n8. List pastes = ^!8 (Ctrl+Alt+8)`n9. Get paste link = ^!9 (Ctrl+Alt+9)`n10. Log into pastebin = ^!0 (Ctrl+Alt+0)`n11. Help message = ^!h (Ctrl+Alt+h)"
- MsgBox(help_message)
- CheckKeyState()
- Return
Add Comment
Please, Sign In to add comment