php - 在 PHP 中使用 webhook 将文件上传到 Discord
问题描述
这就是我所拥有的
<?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
非常没用)。 - 这里的这个人有上传文件的代码。我已经复制了他的 cURL 标题,没有骰子。
- 这个页面说你必须使用
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 期望什么格式......
解决方案
Figured it out. I shouldn't have been using json_encode()
on the body, and I was supposed to use multipart/form-data
. I also had to adjust some fields.
推荐阅读
- c# - ListView (MVVM) 中的复选框 | Xamarin 形式
- asp.net - 在发布时更改 .config 文件中的 appender 参数值(天蓝色管道)
- python - 在 PYTHONSTARTUP 中设置的 .pythonstartup 文件中打开 Python 解释器时如何读取当前目录?
- ios - ionic 4中的iOS推送通知没有声音
- android - 在颤振上动态添加choicechip
- java - FileUtils.copyFile() 在尝试复制 exe 时使程序崩溃
- php - laravel swagger 无法与 App 目录之外的控制器一起使用
- kotlin - 如何在 Kotlin 中反映可为空的字段
- node.js - 如何从 greenlock-express 获取证书文件以用于 Nginx?
- php - 如何在使用 php 上传之前裁剪图像?