guides:apps:discord

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
guides:apps:discord [2024-03-22 14:54] – [Webhooks] Add example for sending a message geekguides:apps:discord [2024-06-06 18:18] (current) – add date geek
Line 7: Line 7:
 ===== Webhooks ===== ===== Webhooks =====
  
-Send a file: https://www.autohotkey.com/boards/viewtopic.php?t=86273 +<tabbox AutoHoktey v2>
 Send a message: Send a message:
  
Line 19: Line 18:
 http.Send('{"content": "test"}') http.Send('{"content": "test"}')
 </code> </code>
 +
 +Send files/images:
 +<code AutoHotkey>
 +#Requires AutoHotkey v2.0
 +
 +data := CreateFormData(Map(
 +    "content", "A message with text and two images",
 +    "files[1]", "@C:\Users\User\Desktop\nerd.png",
 +    "files[2]", "@C:\Users\User\Desktop\drilling.png",
 +))
 +http := ComObject("WinHTTP.WinHTTPRequest.5.1")
 +http.Open("POST", "https://discord.com/api/webhooks/.../...")
 +http.SetRequestHeader("Content-Type", data.contentType)
 +http.Send(data.body)
 +
 +/**
 + * Creates a COM WinHttpRequest compatible `multipart/form-data` body,
 + * supporting file attachments like cURL.
 + *
 + * 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  
 + * Ported to AHKv2 and modified by G33kDude 06/June/2024
 + *
 + * @param {Map} formData The fields to encode in the form body
 + *
 + * @return {Object} An object with properties `body` and `contentType`
 + *
 + * @example
 + * data := CreateFormData(Map(
 +     "content", "A message with text and two images",
 +     "files[1]", "@image1.jpg",
 +     "files[2]", "@image2.png",
 + * ))
 + * http := ComObject("WinHTTP.WinHTTPRequest.5.1")
 + * http.Open("POST", "https://discord.com/api/webhooks/.../...")
 + * http.SetRequestHeader("Content-Type", data.contentType)
 + * http.Send(data.body)
 + */
 +CreateFormData(formData) {
 +    boundary := Random(2**60, 2**63-1) Random(2**60, 2**63-1), buf := Buffer()
 +    for k, v in formData {
 +        if v ~= "^@" { ; A file, following the cURL convention
 +            filePath := LTrim(v, "@"), SplitPath(filePath, &fileName)
 +            file := FileOpen(filePath, "r")
 +            AddStr "--" boundary '`r`nContent-Disposition: form-data; name="' k
 +                . '"; filename="' fileName '"`r`nContent-Type: ' MimeType(file)
 +                . "`r`n`r`n"
 +            AddFile(file), AddStr("`r`n")
 +        } else { ; Regular text
 +            AddStr "--" boundary '`r`nContent-Disposition: form-data; name="' k
 +                . '"`r`n`r`n' v "`r`n"
 +        }
 +    }
 +    AddStr "--" boundary "--"
 +    
 +    return {
 +        body: SafeArrayFromBuffer(buf),
 +        contentType: "multipart/form-data; boundary=" boundary,
 +    }
 +    
 +    AddStr(str) {
 +        oldSize := buf.Size, buf.Size += strSize := StrPut(str, "UTF-8") - 1
 +        StrPut(str, buf.Ptr + oldSize, strSize, "UTF-8")
 +    }
 +    AddFile(file) {
 +        oldSize := buf.Size, buf.Size += file.Length
 +        file.Pos := 0, file.RawRead(buf.ptr + oldSize, file.Length)
 +    }
 +    MimeType(file) => (
 +        file.Pos := 0, n := file.ReadUInt(),
 +        (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"
 +    )
 +    SafeArrayFromBuffer(buf) {
 +        arr := ComObjArray(0x11, buf.Size) ; SAFEARRAY = VT_ARRAY|VT_UI1
 +        DllCall("RtlMoveMemory",
 +            "Ptr", NumGet(ComObjValue(arr), 8 + A_PtrSize, "Ptr"),
 +            "Ptr", buf, "Ptr", buf.Size)
 +        return arr
 +    }
 +}
 +</code>
 +
 +<tabbox AutoHoktey v1>
 +Send a message:
 +
 +<code AutoHotkey>
 +#Requires AutoHotkey v1
 +webhookURL := "https://discord.com/api/webhooks/..."
 +http := ComObject("WinHttp.WinHttpRequest.5.1")
 +http.Open("POST", webhookURL)
 +http.SetRequestHeader("Content-Type", "application/json")
 +http.Send("{""content"": ""test""}")
 +</code>
 +
 +Send files/images: https://www.autohotkey.com/boards/viewtopic.php?t=86273
 +</tabbox>
 +
 +