Hello,
I've spent the last 5 hours banging my head against the wall trying to figure out how to upload an image to the discord API through a webhook.
Here is a code sample that show how to embed/attach a image URL to a post
I know i have to use multipart/form-data, and i found a sample script that will convert my data to that, but the script is set up for Telegram posts.
And here's some example code of how to send an image with javascript
I have had 0 luck combining these two scripts together to upload an image from my computer to Discord. If someone is able to figure this out and post their code i would be glad to pay $20 for it.
Thank you very much!
Upload Image to Discord through Webhook API (Will Pay $20)
- Thoughtfu1Tux
- Posts: 125
- Joined: 31 May 2018, 23:26
Re: Upload Image to Discord through Webhook API (Will Pay $20)
Code: Select all
objParam := {file: ["G:\Untitled-1.jpg"], content: "Hi!"}
CreateFormData(PostData, hdr_ContentType, objParam)
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("POST", "https://discord.com/api/webhooks/5865875878/689876976976969", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
HTTP.SetRequestHeader("Content-Type", hdr_ContentType)
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(PostData)
HTTP.WaitForResponse()
msgbox % HTTP.ResponseText
; CreateFormData() by tmplinshi, AHK Topic: https://autohotkey.com/boards/viewtopic.php?t=7647
; Thanks to Coco: https://autohotkey.com/boards/viewtopic.php?p=41731#p41731
; Modified version by SKAN, 09/May/2016
CreateFormData(ByRef retData, ByRef retHeader, objParam) {
New CreateFormData(retData, retHeader, objParam)
}
Class CreateFormData {
__New(ByRef retData, ByRef retHeader, objParam) {
Local CRLF := "`r`n", i, k, v, str, pvData
; Create a random Boundary
Local Boundary := this.RandomBoundary()
Local BoundaryLine := "------------------------------" . Boundary
this.Len := 0 ; GMEM_ZEROINIT|GMEM_FIXED = 0x40
this.Ptr := DllCall( "GlobalAlloc", "UInt",0x40, "UInt",1, "Ptr" ) ; allocate global memory
; Loop input paramters
For k, v in objParam
{
If IsObject(v) {
For i, FileName in v
{
str := BoundaryLine . CRLF
. "Content-Disposition: form-data; name=""" . k . """; filename=""" . FileName . """" . CRLF
. "Content-Type: " . this.MimeType(FileName) . CRLF . CRLF
this.StrPutUTF8( str )
this.LoadFromFile( Filename )
this.StrPutUTF8( CRLF )
}
} Else {
str := BoundaryLine . CRLF
. "Content-Disposition: form-data; name=""" . k """" . CRLF . CRLF
. v . CRLF
this.StrPutUTF8( str )
}
}
this.StrPutUTF8( BoundaryLine . "--" . CRLF )
; Create a bytearray and copy data in to it.
retData := ComObjArray( 0x11, this.Len ) ; Create SAFEARRAY = VT_ARRAY|VT_UI1
pvData := NumGet( ComObjValue( retData ) + 8 + A_PtrSize )
DllCall( "RtlMoveMemory", "Ptr",pvData, "Ptr",this.Ptr, "Ptr",this.Len )
this.Ptr := DllCall( "GlobalFree", "Ptr",this.Ptr, "Ptr" ) ; free global memory
retHeader := "multipart/form-data; boundary=----------------------------" . Boundary
}
StrPutUTF8( str ) {
Local ReqSz := StrPut( str, "utf-8" ) - 1
this.Len += ReqSz ; GMEM_ZEROINIT|GMEM_MOVEABLE = 0x42
this.Ptr := DllCall( "GlobalReAlloc", "Ptr",this.Ptr, "UInt",this.len + 1, "UInt", 0x42 )
StrPut( str, this.Ptr + this.len - ReqSz, ReqSz, "utf-8" )
}
LoadFromFile( Filename ) {
Local objFile := FileOpen( FileName, "r" )
this.Len += objFile.Length ; GMEM_ZEROINIT|GMEM_MOVEABLE = 0x42
this.Ptr := DllCall( "GlobalReAlloc", "Ptr",this.Ptr, "UInt",this.len, "UInt", 0x42 )
objFile.RawRead( this.Ptr + this.Len - objFile.length, objFile.length )
objFile.Close()
}
RandomBoundary() {
str := "0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z"
Sort, str, D| Random
str := StrReplace(str, "|")
Return SubStr(str, 1, 12)
}
MimeType(FileName) {
n := FileOpen(FileName, "r").ReadUInt()
Return (n = 0x474E5089) ? "image/png"
: (n = 0x38464947) ? "image/gif"
: (n&0xFFFF = 0x4D42 ) ? "image/bmp"
: (n&0xFFFF = 0xD8FF ) ? "image/jpeg"
: (n&0xFFFF = 0x4949 ) ? "image/tiff"
: (n&0xFFFF = 0x4D4D ) ? "image/tiff"
: "application/octet-stream"
}
}
- Thoughtfu1Tux
- Posts: 125
- Joined: 31 May 2018, 23:26
Re: Upload Image to Discord through Webhook API (Will Pay $20)
This works perfectly, Thank you!
How do i pass in the two arguments as variables? I'm missing some important piece here, as passing them in literally doesn't seem to work.
Also what do I need to look up to understand the "objParam := {file:...." line? I thought that having a := meant that everything afterwards was a variable unless is in quotation marks, but you have almost everything not in quotation marks.
Code: Select all
Filepath = ["C:\Users\me\Downloads\ExampleThumbnail.png"]
post = "Hello World!"
objParam := {file: Filepath, content: post}
CreateFormData(PostData, hdr_ContentType, objParam)
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("POST", "https://discord.com/api/webhooks/772389768616083456/Y3t8yUMYihfoWHx2hlhsbqoSOXHeGSVO2LpixK_LAhtCk78T-JblcBYl5bUOlsvi6t82", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
HTTP.SetRequestHeader("Content-Type", hdr_ContentType)
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(PostData)
HTTP.WaitForResponse()
msgbox % HTTP.ResponseText
Re: Upload Image to Discord through Webhook API (Will Pay $20)
Files You have to send as objects.
Because function CreateFormData looks at incoming parameter and if it is object then it parses as file.
Therefore:
Because function CreateFormData looks at incoming parameter and if it is object then it parses as file.
Therefore:
Code: Select all
var1 := ["G:\Untitled-1.jpg"]
var2 := "Hi!"
objParam := {file: var1, content: var2}
- Thoughtfu1Tux
- Posts: 125
- Joined: 31 May 2018, 23:26
Re: Upload Image to Discord through Webhook API (Will Pay $20)
I don't have any experience with objects at all. How would I convert the following variable into an object?
Given
Given
Code: Select all
InputBox, SelectedFilepath, Filepath, Please Input Filepath
Re: Upload Image to Discord through Webhook API (Will Pay $20)
Read manual.
Code: Select all
InputBox, SelectedFilepath, Filepath, Please Input Filepath
var1 := [SelectedFilepath]
- Thoughtfu1Tux
- Posts: 125
- Joined: 31 May 2018, 23:26
Re: Upload Image to Discord through Webhook API (Will Pay $20)
Payment Sent
Thanks again!
Thanks again!
Re: Upload Image to Discord through Webhook API (Will Pay $20)
Payment received.
Thank You!
Thank You!
Re: Upload Image to Discord through Webhook API (Will Pay $20)
malcev wrote: ↑30 Jan 2021, 00:42Code: Select all
objParam := {file: ["G:\Untitled-1.jpg"], content: "Hi!"} CreateFormData(PostData, hdr_ContentType, objParam) HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1") HTTP.Open("POST", "https://discord.com/api/webhooks/5865875878/689876976976969", true) HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko") HTTP.SetRequestHeader("Content-Type", hdr_ContentType) HTTP.SetRequestHeader("Pragma", "no-cache") HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store") HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT") HTTP.Send(PostData) HTTP.WaitForResponse() msgbox % HTTP.ResponseText ; CreateFormData() by tmplinshi, AHK Topic: https://autohotkey.com/boards/viewtopic.php?t=7647 ; Thanks to Coco: https://autohotkey.com/boards/viewtopic.php?p=41731#p41731 ; Modified version by SKAN, 09/May/2016 CreateFormData(ByRef retData, ByRef retHeader, objParam) { New CreateFormData(retData, retHeader, objParam) } Class CreateFormData { __New(ByRef retData, ByRef retHeader, objParam) { Local CRLF := "`r`n", i, k, v, str, pvData ; Create a random Boundary Local Boundary := this.RandomBoundary() Local BoundaryLine := "------------------------------" . Boundary this.Len := 0 ; GMEM_ZEROINIT|GMEM_FIXED = 0x40 this.Ptr := DllCall( "GlobalAlloc", "UInt",0x40, "UInt",1, "Ptr" ) ; allocate global memory ; Loop input paramters For k, v in objParam { If IsObject(v) { For i, FileName in v { str := BoundaryLine . CRLF . "Content-Disposition: form-data; name=""" . k . """; filename=""" . FileName . """" . CRLF . "Content-Type: " . this.MimeType(FileName) . CRLF . CRLF this.StrPutUTF8( str ) this.LoadFromFile( Filename ) this.StrPutUTF8( CRLF ) } } Else { str := BoundaryLine . CRLF . "Content-Disposition: form-data; name=""" . k """" . CRLF . CRLF . v . CRLF this.StrPutUTF8( str ) } } this.StrPutUTF8( BoundaryLine . "--" . CRLF ) ; Create a bytearray and copy data in to it. retData := ComObjArray( 0x11, this.Len ) ; Create SAFEARRAY = VT_ARRAY|VT_UI1 pvData := NumGet( ComObjValue( retData ) + 8 + A_PtrSize ) DllCall( "RtlMoveMemory", "Ptr",pvData, "Ptr",this.Ptr, "Ptr",this.Len ) this.Ptr := DllCall( "GlobalFree", "Ptr",this.Ptr, "Ptr" ) ; free global memory retHeader := "multipart/form-data; boundary=----------------------------" . Boundary } StrPutUTF8( str ) { Local ReqSz := StrPut( str, "utf-8" ) - 1 this.Len += ReqSz ; GMEM_ZEROINIT|GMEM_MOVEABLE = 0x42 this.Ptr := DllCall( "GlobalReAlloc", "Ptr",this.Ptr, "UInt",this.len + 1, "UInt", 0x42 ) StrPut( str, this.Ptr + this.len - ReqSz, ReqSz, "utf-8" ) } LoadFromFile( Filename ) { Local objFile := FileOpen( FileName, "r" ) this.Len += objFile.Length ; GMEM_ZEROINIT|GMEM_MOVEABLE = 0x42 this.Ptr := DllCall( "GlobalReAlloc", "Ptr",this.Ptr, "UInt",this.len, "UInt", 0x42 ) objFile.RawRead( this.Ptr + this.Len - objFile.length, objFile.length ) objFile.Close() } RandomBoundary() { str := "0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z" Sort, str, D| Random str := StrReplace(str, "|") Return SubStr(str, 1, 12) } MimeType(FileName) { n := FileOpen(FileName, "r").ReadUInt() Return (n = 0x474E5089) ? "image/png" : (n = 0x38464947) ? "image/gif" : (n&0xFFFF = 0x4D42 ) ? "image/bmp" : (n&0xFFFF = 0xD8FF ) ? "image/jpeg" : (n&0xFFFF = 0x4949 ) ? "image/tiff" : (n&0xFFFF = 0x4D4D ) ? "image/tiff" : "application/octet-stream" } }
change k to i in line 45, fix multiple upload
Code: Select all
objParam := {file: ["G:\Untitled-1.jpg", "G:\Untitled-2.jpg", "G:\Untitled-3.jpg"], content: "Hi!"}
CreateFormData(PostData, hdr_ContentType, objParam)
HTTP := ComObjCreate("WinHTTP.WinHTTPRequest.5.1")
HTTP.Open("POST", "https://discord.com/api/webhooks/5865875878/689876976976969", true)
HTTP.SetRequestHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko")
HTTP.SetRequestHeader("Content-Type", hdr_ContentType)
HTTP.SetRequestHeader("Pragma", "no-cache")
HTTP.SetRequestHeader("Cache-Control", "no-cache, no-store")
HTTP.SetRequestHeader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT")
HTTP.Send(PostData)
HTTP.WaitForResponse()
msgbox % HTTP.ResponseText
; CreateFormData() by tmplinshi, AHK Topic: https://autohotkey.com/boards/viewtopic.php?t=7647
; Thanks to Coco: https://autohotkey.com/boards/viewtopic.php?p=41731#p41731
; Modified version by SKAN, 09/May/2016
CreateFormData(ByRef retData, ByRef retHeader, objParam) {
New CreateFormData(retData, retHeader, objParam)
}
Class CreateFormData {
__New(ByRef retData, ByRef retHeader, objParam) {
Local CRLF := "`r`n", i, k, v, str, pvData
; Create a random Boundary
Local Boundary := this.RandomBoundary()
Local BoundaryLine := "------------------------------" . Boundary
this.Len := 0 ; GMEM_ZEROINIT|GMEM_FIXED = 0x40
this.Ptr := DllCall( "GlobalAlloc", "UInt",0x40, "UInt",1, "Ptr" ) ; allocate global memory
; Loop input paramters
For k, v in objParam
{
If IsObject(v) {
For i, FileName in v
{
str := BoundaryLine . CRLF
. "Content-Disposition: form-data; name=""" . i . """; filename=""" . FileName . """" . CRLF
. "Content-Type: " . this.MimeType(FileName) . CRLF . CRLF
this.StrPutUTF8( str )
this.LoadFromFile( Filename )
this.StrPutUTF8( CRLF )
}
} Else {
str := BoundaryLine . CRLF
. "Content-Disposition: form-data; name=""" . k """" . CRLF . CRLF
. v . CRLF
this.StrPutUTF8( str )
}
}
this.StrPutUTF8( BoundaryLine . "--" . CRLF )
; Create a bytearray and copy data in to it.
retData := ComObjArray( 0x11, this.Len ) ; Create SAFEARRAY = VT_ARRAY|VT_UI1
pvData := NumGet( ComObjValue( retData ) + 8 + A_PtrSize )
DllCall( "RtlMoveMemory", "Ptr",pvData, "Ptr",this.Ptr, "Ptr",this.Len )
this.Ptr := DllCall( "GlobalFree", "Ptr",this.Ptr, "Ptr" ) ; free global memory
retHeader := "multipart/form-data; boundary=----------------------------" . Boundary
}
StrPutUTF8( str ) {
Local ReqSz := StrPut( str, "utf-8" ) - 1
this.Len += ReqSz ; GMEM_ZEROINIT|GMEM_MOVEABLE = 0x42
this.Ptr := DllCall( "GlobalReAlloc", "Ptr",this.Ptr, "UInt",this.len + 1, "UInt", 0x42 )
StrPut( str, this.Ptr + this.len - ReqSz, ReqSz, "utf-8" )
}
LoadFromFile( Filename ) {
Local objFile := FileOpen( FileName, "r" )
this.Len += objFile.Length ; GMEM_ZEROINIT|GMEM_MOVEABLE = 0x42
this.Ptr := DllCall( "GlobalReAlloc", "Ptr",this.Ptr, "UInt",this.len, "UInt", 0x42 )
objFile.RawRead( this.Ptr + this.Len - objFile.length, objFile.length )
objFile.Close()
}
RandomBoundary() {
str := "0|1|2|3|4|5|6|7|8|9|a|b|c|d|e|f|g|h|i|j|k|l|m|n|o|p|q|r|s|t|u|v|w|x|y|z"
Sort, str, D| Random
str := StrReplace(str, "|")
Return SubStr(str, 1, 12)
}
MimeType(FileName) {
n := FileOpen(FileName, "r").ReadUInt()
Return (n = 0x474E5089) ? "image/png"
: (n = 0x38464947) ? "image/gif"
: (n&0xFFFF = 0x4D42 ) ? "image/bmp"
: (n&0xFFFF = 0xD8FF ) ? "image/jpeg"
: (n&0xFFFF = 0x4949 ) ? "image/tiff"
: (n&0xFFFF = 0x4D4D ) ? "image/tiff"
: "application/octet-stream"
}
}
Re: Upload Image to Discord through Webhook API (Will Pay $20)
No, You dont need to change anything in function.
For multiple upload to discord You need send like this:
For multiple upload to discord You need send like this:
Code: Select all
objParam := {file1: ["G:\Untitled-1.jpg"], file2: ["G:\Untitled-2.jpg"]}