在 PHP 中使用 webhook 将文件上传到 Discord

Posted

技术标签:

【中文标题】在 PHP 中使用 webhook 将文件上传到 Discord【英文标题】:Uploading file to Discord with webhook in PHP 【发布时间】:2021-03-15 22:24:08 【问题描述】:

这就是我所拥有的

<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: x-user-id");
header('Access-Control-Allow-Methods', 'PUT, POST, GET, DELETE, OPTIONS');

if (!isset(getallheaders()["X-User-ID"]) || !isset($_FILES["audio"])) 
    return;


$webhookurl = "discord url";
//$webhookurl = "https://8f13d44091009d558421159246966183.m.pipedream.net";

$json_data = [
    "content" => "<@".getallheaders()["X-User-ID"].">",
    "tts" => false,
    "file" => curl_file_create($_FILES["audio"]["tmp_name"], "audio/mpeg", "sound.mp3") // "@".realpath($_FILES["audio"]["tmp_name"])
];

if (isset(getallheaders()["X-User-ID"])) 
    $curl = curl_init( $webhookurl );
    curl_setopt($curl, CURLOPT_TIMEOUT, 5); // 5 seconds
    curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5); // 5 seconds
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($json_data, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE ));
    
    curl_exec( $curl );
    curl_close( $curl );

我得到的只是一条带有"content" 字段的消息(在本例中提及),但没有文件。嵌入也可以正常工作。

这是我发现的:

来自 Discord 文档:file file contents the contents of the file being sent one of content, file, embeds(完全没用)。 This guy here 有上传文件的代码。我已经复制了他的 cURL 标头,没有骰子。 This page 表示您必须使用 multipart/form-data。 Discord 文档说您只需将其用于嵌入。我发现两者都不是真的。嵌入与 application/json 一起工作正常,我无法在 multipart/form-data 上收到消息根本

我还尝试了什么:

curl_file_create() 替换为旧的 @/path/to/file(请参阅上面的注释) 不同的Content-Type,就像我说的那样。 file_get_contents() move_uploaded_file() 而不是直接来自 $_FILES

关于我缺少什么的任何想法?我想我的主要问题是我不确定 什么 Discord 期望的格式......

【问题讨论】:

Google-ing,看起来您应该使用文件路径而不是使用 curl_file_create() 生成文件对象。话虽如此...您是否尝试过使用图像文件而不是 MP3? 刚才我尝试使用绝对路径、相对路径、仅文件名和 http 路径,无论是否使用 curl_create_file()。没有运气... 【参考方案1】:

想通了。我不应该在身体上使用json_encode(),而我应该应该使用multipart/form-data。我还必须调整一些字段。

【讨论】:

以上是关于在 PHP 中使用 webhook 将文件上传到 Discord的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PHP 发送不和谐的 webhook?

如何在Stripe PHP和webhook中使用好事件,比较收到的付款数量并取消订阅

无法将 pdf 文件上传到 mysql 数据库并使用 PHP 检索它?

获取对 Zapier webhook 的 PHP 响应

PHP 循环遍历嵌套的 JSON 响应并重新组装为 Webhook 的简单查询字符串

Android 允许将多个文件(最大 150 MB)上传到 PHP 服务器