这是情况。
我有一个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;
}
答案 0 :(得分:0)
这实际上要容易得多。由于我们在partition
中存在文件,因此我们只需使用const options = {
webPreferences: {
partition: 'persist:myapp'
}
};
函数就可以完成所有cURL,而无需重新绑定边界或指定内容类型。
这是对我有用的最终代码:
$_FILES
那将下载.OGG文件作为语音消息(因为我不希望任何文件出现在我的音乐播放器中)。稍后,可以在sendVoice()
数组中添加更多字段,例如duration,Telegram会相应地吃掉它们。