通过 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 会相应地吃掉它们。