В чем причина ошибки net::ERR_ABORTED 405 (Method Not Allowed)?

Пытаюсь создать форму для отправки сообщения из формы в телеграм-бота, запускаю код в расширении LiveServer, но по какой-то причине это не работает. PHP-код:

<?php
    $content = "";
    foreach ($_POST as $key => $value) {
        if ($value) {
            $content .= " <b> $key </b>: <i> $value </i> \n";
        }
    }
    if (trim($content)) {
        $content = "<b> From Site: </b> \n".$content;
        $apiToken = ""; // Вставьте сюда API-токен бота
        $data = [
            "chat_id" => "", // Вставьте сюда chat_id
            "text" => $content,
            "parse_mode" => "HTML",
        ];
        $response = file_get_contents(
            "https://api.telegram.org/bot/$apiToken/sendMessage?".http_build_query($data)
        );
    }
?>

JS-код:

"use strict";
document.addEventListener("DOMContentLoaded", function () {
   const form = document.querySelector(".send-message-form");
   form.addEventListener("submit", function (e) {
      e.preventDefault();
      sendMessage(form);
   });

   async function sendMessage(form) {
      const formData = new FormData(form);
      if (formData) {
         const url = "sendMessage.php";
         const response = await fetch(url, {
            method: "POST",
            body: formData,
         });
         if (response.ok) {
            form.reset();
            alert("Сообщение успешно отправлено!");
         } else {
            alert("Ошибка :(");
         }
      }
   }
});

В чём может быть проблема? Может из-за того, что я запускаю скрипты на Live Server?


Ответы (2 шт):

Автор решения: abu

Запрос на отправку сообщения предполагает метод POST https://telegram-bot-sdk.readme.io/reference/sendmessage

Вы используете file_get_contents, который имитирует метод GET - отсюда ошибка

Вам стоит использовать библиотеку HTTP клиента, например, https://github.com/guzzle/guzzle

→ Ссылка
Автор решения: Алексей Шиманский

Думаю ошибка в простом. Надо писать не

bot/$apiToken

а вот так:

bot{$apiToken}

то есть токен идёт сразу после текста "bot"

→ Ссылка