通过PHP应用程序向Telegram发送语音

时间:2018-09-07 11:41:01

标签: php-telegram-bot

这是情况。

我有一个Android应用程序,可以在我指定的任何地方使用HTTP POST发送语音文件。另外,我想将这些语音文件自动下载到Telegram bot。我写了一个PHP机器人,可以接受所说的POST并将其翻译成Telegram。我想念的一件事是文件本身。

我不知道如何“说”电报API,我下载了文件。

那我该怎么办:在$_FILE流中显示文件(我可以读取文件名),将它作为$voice放在sendVoice函数中,我也知道我必须使用简单multipart/form-data POST方法来发送文件。

我的问题是:是否可以使用CURL来直接从PHP进行发布?如果没有,那我想念什么呢?我使用的其他方法是通过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;
}

1 个答案:

答案 0 :(得分:0)

这实际上要容易得多。由于我们在partition中存在文件,因此我们只需使用const options = { webPreferences: { partition: 'persist:myapp' } }; 函数就可以完成所有cURL,而无需重新绑定边界或指定内容类型。

这是对我有用的最终代码:

$_FILES

那将下载.OGG文件作为语音消息(因为我不希望任何文件出现在我的音乐播放器中)。稍后,可以在sendVoice()数组中添加更多字段,例如duration,Telegram会相应地吃掉它们。