使用 XHR 请求将 Discord 嵌入发送到 Webhook

Posted

技术标签:

【中文标题】使用 XHR 请求将 Discord 嵌入发送到 Webhook【英文标题】:Send Discord Embed to Webhook with XHR Request 【发布时间】:2020-07-08 17:25:37 【问题描述】:

我正在编写一个 chrome 扩展,其中嵌入应该被发送到一个不和谐的 webhook。在 chrome 扩展中,不能导入模块,所以我必须使用 XMLHttpRequests。

这是我的代码:

const el = document.getElementById("sendwebhook");
el.addEventListener("click", sendMessage, false);


function sendMessage() 
    var request = new XMLHttpRequest();
    request.open("POST", "https://discordapp.com/api/webhooks/693222334567415919/dT2OrV7pQa8_MuiS3kmFRPBTD_lh1nfXVR04OeRS9YKGEVPZXp7cOListUBI-c-32HM7");
    request.setRequestHeader('Content-type', 'application/json');
    var params = 
    username: "My Webhook Name",
    avatar_url: "https://pbs.twimg.com/profile_images/1214545814745300992/7OLFRhok_400x400.jpg",
    content: "The message to send"
    
    request.send(JSON.stringify(params));

不幸的是,我当前的代码只通过 webhook 发送消息,但我需要它发送一个 Rich Embed 通过看起来像这样的 webhook:

【问题讨论】:

在 JS 中发送“Rich Embed”是什么样的?您能否使用 Chrome 开发工具捕获成功发送的内容? 你当然可以在chrome扩展pages中使用模块,其中包括后台页面脚本(你只需要通过`"page"键声明它,example)。唯一不能运行模块的部分是内容脚本,因为它们在网页中运行。但是,如果您使用编译器/捆绑器,这一切都不是问题。 【参考方案1】:

发送嵌入的正确方法是使用:

"embeds":["color": 0, "title": "title", "description": "description"]

要调整颜色,您需要将所需颜色的十六进制代码转换为十进制(并删除数字之间的任何“.”)。如果您是 Windows 用户,您可以使用 calc.exe 轻松完成此操作 如果你不是,有很多在线单位转换器可以做同样的事情。

<button onclick="sendMessage()">Send</button>
<script>
    webhook_url = "your webhook's url";

    function sendMessage() 
        var request = new XMLHttpRequest();
        request.open("POST", $webhook_url);
        request.setRequestHeader('Content-type', 'application/json');
        var params = 
        username: "Sosi",
        embeds:["color": 16711680,"title":"title text", "description":"description text"]
        
        request.send(JSON.stringify(params));
    
</script>

【讨论】:

【参考方案2】:

只需将嵌入添加到我的参数中:

    var params = 
    username: "Jokz' Tools",
    avatar_url: "https://pbs.twimg.com/profile_images/1243255945913872384/jOxyDffX_400x400.jpg",
    embeds: [
        title: title,
        author: 
            'name': authorname,
            'icon_url': authorimage,
        ,
        description: descriptiontext,
        footer: 
            'icon_url': 'https://pbs.twimg.com/profile_images/1243255945913872384/jOxyDffX_400x400.jpg',
            'text': 'Embed Sender | @JokzTools',
        ,
        color: 0xff0000,
        timestamp: new Date(),
        ]
    
    request.send(JSON.stringify(params));

【讨论】:

【参考方案3】:

要获取 url,请转到:服务器设置 > webhook > 创建/编辑 webhook

function send()   
    var url = "see above";
    var request = new XMLHttpRequest();
    request.open("POST", url);
    request.setRequestHeader('Content-type', 'application/json');

    var myEmbed2 = 
        "author": 
            "name": "Birdie♫ 3",
            "url": "https://www.reddit.com/r/cats/",
            "icon_url": "https://i.imgur.com/R66g1Pe.jpg"
        ,
        "title": "FINALLY!!!... bot embeds!",
        "url": "https://google.com/",
        "description": "Text message. You can use Markdown here. *Italic* **bold** __underline__ ~~strikeout~~ [hyperlink](https://google.com) `code`",
        "color": 15258703,
        "fields": [
            
                "name": "Admins",
                "value": "Day/Acti",
                "inline": true
            ,
            
                "name": "Helpers",
                "value": "Wombat,Phaedra",
                "inline": true
            ,
            
                "name": "Use `\"inline\": true` parameter, if you want to display fields in the same line.",
                "value": "okay..."
            ,
            
                "name": "Thanks!",
                "value": "You're welcome :wink:"
            
        ],
        "thumbnail": 
            "url": "https://upload.wikimedia.org/wikipedia/commons/3/38/4-Nature-Wallpapers-2014-1_ukaavUI.jpg"
        ,
        "image": 
            "url": "https://upload.wikimedia.org/wikipedia/commons/5/5a/A_picture_from_China_every_day_108.jpg"
        ,
        "footer": 
            "text": "Woah! So cool! :smirk:",
            "icon_url": "https://i.imgur.com/fKL31aD.jpg"
        
    
    
    var params = 
        username: "Codepen BOT-03",
        embeds: [ myEmbed2 ]
    
    
    request.send(JSON.stringify(params));  
 // end send

【讨论】:

以上是关于使用 XHR 请求将 Discord 嵌入发送到 Webhook的主要内容,如果未能解决你的问题,请参考以下文章

Discord with Python:将嵌入发送到用户指定的特定频道

Discord.js 分片,如何使用 broadcastEval 发送嵌入消息?

将图像附加并嵌入到 Discord

使用 discord.py 将已经存在的 json 文件作为嵌入发送

使用 cookie 从 Chrome 扩展发送 XHR 请求

Bot 上线,但嵌入不会发布到 discord