使用 Telegram Bot API 向多个用户发送视频笔记会导致后续请求出现 404 错误

问题描述 投票:0回答:1

我尝试使用 Telegram Bot API 向多个 Telegram 用户发送视频注释,但遇到了第一个请求成功且所有后续请求返回 404“未找到”错误的问题。这是我用来发送这些视频笔记的 PHP 代码:

$apiURLBase = "https://api.telegram.org/bot<YourBotToken>/";
$selectedUsers = ['111111111', '2222222222']; // Example chat IDs
$originalVideoPath = 'path_to_your_video.mp4';

foreach ($selectedUsers as $chatId) {
    $uniqueFilePath = 'video_notes/' . uniqid() . '.mp4';
    copy($originalVideoPath, $uniqueFilePath); // Ensure a unique file for each request

    $apiURL = $apiURLBase . "sendVideoNote";
    $video_note = new CURLFile($uniqueFilePath);

    $data = [
        'chat_id' => $chatId,
        'video_note' => $video_note
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:multipart/form-data"));
    curl_setopt($ch, CURLOPT_URL, $apiURL);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $output = curl_exec($ch);
    curl_close($ch);

    unlink($uniqueFilePath); // Clean up the temporary file

    echo "Response for chat_id $chatId: " . $output . "<br>";
}

预期行为

我希望视频笔记能够毫无问题地发送给 $selectedUsers 数组中的所有用户。

实际行为

数组中的第一个用户成功接收视频笔记,但对于第二个用户,我从 Telegram API 收到以下响应:

{"ok":false,"error_code":404,"description":"Not Found"}

其他详细信息

通过将视频文件复制到具有唯一名称的新文件,确保每个请求的视频文件都是唯一的。 即使使用

sleep(1);
在请求之间添加延迟后,问题仍然存在。 所有其他参数和设置(例如 API URL、机器人令牌等)都经过了准确性检查。

任何人都可以帮助确定后续请求失败的原因以及如何解决此问题吗?谢谢!

php api curl telegram telegram-bot
1个回答
0
投票

问题: 当使用 Telegram Bot API 向多个用户发送视频笔记时,第一个请求工作正常,但所有后续请求都会返回 404“Not Found”错误。

解决方案: 问题在于视频文件的管理和发送方式。这是解决问题的分步方法:

1。使用临时文件: 不要为每个请求重复使用相同的视频文件,而是临时存储视频文件。这可确保每个请求都有自己唯一的文件路径,这有助于避免 404 错误。 2.维护文件路径: 遍历每个用户时,请确保视频文件在发送之前仍然存在于临时目录中。如果文件丢失,请跳过该用户并继续。此检查可确保您不会发送已删除的文件。 3.处理后的文件清理: 请勿在将临时文件发送给某个用户后立即将其删除。相反,请等到所有请求均成功发送后再清理文件。如果文件被过早删除,这可以防止发生冲突,如果另一个请求仍在处理中,则可能会发生这种情况。

PHP 代码调整:

$apiURLBase = "https://api.telegram.org/bot<YourBotToken>/";
$selectedUsers = ['111111111', '2222222222']; // Example chat IDs
$originalVideoPath = 'path_to_your_video.mp4';
$tempDir = 'video_notes/'; // Temporary directory to store video notes

foreach ($selectedUsers as $chatId) {
    $uniqueFilePath = $tempDir . uniqid() . '.mp4';

    if (!copy($originalVideoPath, $uniqueFilePath)) {
        echo "Failed to copy file for $chatId\n";
        continue;
    }

    $apiURL = $apiURLBase . "sendVideoNote";
    $video_note = new CURLFile($uniqueFilePath);

    $data = [
        'chat_id' => $chatId,
        'video_note' => $video_note
    ];

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type:multipart/form-data"]);
    curl_setopt($ch, CURLOPT_URL, $apiURL);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_POST, 1);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    $output = curl_exec($ch);
    curl_close($ch);

    if ($output === false) {
        echo "Error sending video to $chatId: " . curl_error($ch) . "\n";
    } else {
        echo "Response for chat_id $chatId: " . $output . "\n";
    }

    unlink($uniqueFilePath); // Clean up the temporary file after all requests have been sent
}

说明: 使用临时文件:为每个用户临时存储视频文件可确保每个请求都获得一个新文件。这有助于防止“未找到”错误。 文件存在检查:发送视频之前,验证文件是否仍然存在于临时目录中。如果没有,请跳过该用户并继续。 延迟清理:等到所有请求都处理完毕后再删除临时文件。这可以减少在另一个请求仍需要某个文件时删除该文件时可能出现的冲突。

通过执行这些步骤,您应该能够向所有选定的 Telegram 用户发送视频笔记,而不会在后续请求中遇到 404 错误。

© www.soinside.com 2019 - 2024. All rights reserved.