在 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的主要内容,如果未能解决你的问题,请参考以下文章
如何在Stripe PHP和webhook中使用好事件,比较收到的付款数量并取消订阅
无法将 pdf 文件上传到 mysql 数据库并使用 PHP 检索它?