通过 PHP 应用向 Telegram 发送语音
Sending voice to Telegram through PHP app
情况是这样的。
我有一个 Android 应用程序,它可以使用 HTTP POST 将语音文件发送到我指定的任何地方。我也想自动将这些语音文件下载到 Telegram bot。我写了一个 PHP 机器人,我可以接受 POST 中的任何字段并将其翻译成 Telegram。我想念的一件事是文件本身。
我不知道如何"say"发送电报API我下载一个文件。
那么我有什么:在 $_FILE
流中显示文件(我可以读取它的名称),我将它作为 $voice
放入 sendVoice 函数中,而且我知道我必须使用简单的 multipart/form-data
POST 方法发送文件。
我的问题是:是否可以使用 CURL 以外的东西直接从 PHP 到 POST?如果没有,那我错过了什么?我使用的其他方法是通过file_get_contents()
发送消息和照片,不知道它是否还适用于语音文件?
这是我现在拥有的代码,是我在某处找到的(我的 cURL 知识为 0):
function sendVoice($chat_id, $voice, $caption) {
$boundary = uniqid();
$delimiter = '-------------' . $boundary;
$fields = array(
"chat_id" => $chat_id,
"caption" => $caption
);
$post_data = build_data_files($boundary, $fields, $voice);
$ch = curl_init($GLOBALS['api'].'/sendVoice');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
//"Authorization: Bearer $TOKEN",
"Content-Type: multipart/form-data; boundary=" . $delimiter,
"Content-Length: " . strlen($post_data))
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_exec($ch);
curl_close($ch);
}
function build_data_files($boundary, $fields, $files){
$data = '';
$eol = "\r\n";
$delimiter = '-------------' . $boundary;
foreach ($fields as $name => $content) {
$data .= "--" . $delimiter . $eol
. 'Content-Disposition: form-data; name="' . $name . "\"".$eol.$eol
. $content . $eol;
}
foreach ($files as $name => $content) {
$data .= "--" . $delimiter . $eol
. 'Content-Disposition: form-data; name="' . $name . '"; filename="' . $name . '"' . $eol
//. 'Content-Type: image/png'.$eol
. 'Content-Transfer-Encoding: binary'.$eol
;
$data .= $eol;
$data .= $content . $eol;
}
$data .= "--" . $delimiter . "--".$eol;
return $data;
}
这实际上要容易得多。由于我们在 $_FILES
中有文件,我们可以在 sendVoice()
函数中完成所有 cURL,而无需重新绑定边界或指定内容类型。
这是对我有用的最终代码:
function sendVoice($chat_id, $voice, $caption) {
$filepath = realpath($_FILES['file']['tmp_name']);
$post_data = array(
'chat_id' => $chat_id,
'voice' => new CURLFile($filepath),
'caption' => $caption
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $GLOBALS['api'].'/sendVoice');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_exec($ch);
curl_close($ch);
}
这将下载一个 .OGG 文件作为语音消息(因为我不想让任何文件出现在我的音乐播放器中)。稍后可以在 $post_data
数组中添加更多字段,例如持续时间,Telegram 会相应地吃掉它们。
情况是这样的。
我有一个 Android 应用程序,它可以使用 HTTP POST 将语音文件发送到我指定的任何地方。我也想自动将这些语音文件下载到 Telegram bot。我写了一个 PHP 机器人,我可以接受 POST 中的任何字段并将其翻译成 Telegram。我想念的一件事是文件本身。
我不知道如何"say"发送电报API我下载一个文件。
那么我有什么:在 $_FILE
流中显示文件(我可以读取它的名称),我将它作为 $voice
放入 sendVoice 函数中,而且我知道我必须使用简单的 multipart/form-data
POST 方法发送文件。
我的问题是:是否可以使用 CURL 以外的东西直接从 PHP 到 POST?如果没有,那我错过了什么?我使用的其他方法是通过file_get_contents()
发送消息和照片,不知道它是否还适用于语音文件?
这是我现在拥有的代码,是我在某处找到的(我的 cURL 知识为 0):
function sendVoice($chat_id, $voice, $caption) {
$boundary = uniqid();
$delimiter = '-------------' . $boundary;
$fields = array(
"chat_id" => $chat_id,
"caption" => $caption
);
$post_data = build_data_files($boundary, $fields, $voice);
$ch = curl_init($GLOBALS['api'].'/sendVoice');
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
//"Authorization: Bearer $TOKEN",
"Content-Type: multipart/form-data; boundary=" . $delimiter,
"Content-Length: " . strlen($post_data))
);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "POST");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, true);
curl_exec($ch);
curl_close($ch);
}
function build_data_files($boundary, $fields, $files){
$data = '';
$eol = "\r\n";
$delimiter = '-------------' . $boundary;
foreach ($fields as $name => $content) {
$data .= "--" . $delimiter . $eol
. 'Content-Disposition: form-data; name="' . $name . "\"".$eol.$eol
. $content . $eol;
}
foreach ($files as $name => $content) {
$data .= "--" . $delimiter . $eol
. 'Content-Disposition: form-data; name="' . $name . '"; filename="' . $name . '"' . $eol
//. 'Content-Type: image/png'.$eol
. 'Content-Transfer-Encoding: binary'.$eol
;
$data .= $eol;
$data .= $content . $eol;
}
$data .= "--" . $delimiter . "--".$eol;
return $data;
}
这实际上要容易得多。由于我们在 $_FILES
中有文件,我们可以在 sendVoice()
函数中完成所有 cURL,而无需重新绑定边界或指定内容类型。
这是对我有用的最终代码:
function sendVoice($chat_id, $voice, $caption) {
$filepath = realpath($_FILES['file']['tmp_name']);
$post_data = array(
'chat_id' => $chat_id,
'voice' => new CURLFile($filepath),
'caption' => $caption
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $GLOBALS['api'].'/sendVoice');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_exec($ch);
curl_close($ch);
}
这将下载一个 .OGG 文件作为语音消息(因为我不想让任何文件出现在我的音乐播放器中)。稍后可以在 $post_data
数组中添加更多字段,例如持续时间,Telegram 会相应地吃掉它们。